file.c

来自「smallbasic for linux」· C语言 代码 · 共 844 行 · 第 1/2 页

C
844
字号
		f->handle = -1;		break;	#endif	case	ft_stream:		{			int r;			r = close(f->handle);			f->handle = -1;			if	( r )				err_file((f->last_error = errno));			return (r == 0);		}	default:		err_unsup();		};	return 0;#endif}/**	returns true on success*/int		dev_fwrite(int sb_handle, byte *data, dword size){	dev_file_t *f;	if	( (f = dev_getfileptr(sb_handle)) == NULL )		return 0;	#if defined(_PalmOS)	switch ( f->type )	{	case	ft_stream:		FileWrite(f->handle, data, size, 1, &f->last_error);		if	( f->last_error )			err_file(f->last_error);		break;	case	ft_serial_port2:	case	ft_serial_port1:		SerSend(f->libHandle, data, size, &f->last_error);		if	( f->last_error )			rt_raise("SERSEND() ERROR %d", f->last_error);					break;	default:		err_unsup();		};	return (f->last_error == 0);	#else	switch ( f->type )	{	case	ft_serial_port2:	case	ft_serial_port1:	case	ft_stream:		{		int		r;			r = write(f->handle, data, size);		if	( r != size )			err_file((f->last_error = errno));		return (r == size);				}	default:		err_unsup();		};	return 0;			#endif}/**	returns true on success*/int		dev_fread(int sb_handle, byte *data, dword size){	dev_file_t *f;	if	( (f = dev_getfileptr(sb_handle)) == NULL )		return 0;	#if defined(_PalmOS)	switch ( f->type )	{	case	ft_stream:		FileRead(f->handle, data, size, 1, &f->last_error);		if	( f->last_error )	{			if	( f->last_error == fileErrEOF )				f->last_error = 0;			else				err_file(f->last_error);			}		break;	case	ft_serial_port2:	case	ft_serial_port1:		{			dword	num;			int		ev;			do	{				f->last_error = SerReceiveCheck(f->libHandle, &num);				ev = dev_events(0);				if	( f->last_error || prog_error || ev < 0 )	{					SerClose(f->libHandle);					f->handle = (FileHand) -1;					break;					}				if	( num >= size )					break;				} while ( 1 );						if	( num >= size )				f->last_error = SerReceive10(f->libHandle, data, size, -1);			if	( f->last_error )					rt_raise("SERRECEIVE10() ERROR %d", f->last_error);			}		break;	default:		err_unsup();		};	return (f->last_error == 0);	#else	switch ( f->type )	{	case	ft_serial_port2:	case	ft_serial_port1:	case	ft_stream:		{		int		r;		r = read(f->handle, data, size);		if	( r != size )			err_file((f->last_error = errno));		return (r == size);		}	default:		err_unsup();		};	return 0;	#endif}/**/dword		dev_ftell(int sb_handle){	dev_file_t *f;	if	( (f = dev_getfileptr(sb_handle)) == NULL )		return 0;	switch ( f->type )	{	case	ft_stream:		#if defined(_PalmOS)		return FileTell(f->handle, NULL, &f->last_error);		#else		return lseek(f->handle, 0, SEEK_CUR);		#endif	default:		err_unsup();		};	return 0;}/**/dword		dev_flength(int sb_handle){	dev_file_t *f;	if	( (f = dev_getfileptr(sb_handle)) == NULL )		return 0;	switch ( f->type )	{	#if defined(_PalmOS)	case	ft_stream:		{		dword	fsize;		FileTell(f->handle, &fsize, &f->last_error);		if	( f->last_error )	{			fsize = (dword) -1;			err_file(f->last_error);			}		return fsize;		}	case	ft_serial_port2:	case	ft_serial_port1:		{			dword	num;			f->last_error = SerReceiveCheck(f->libHandle, &num);			if	( f->last_error )	{				SerClose(f->libHandle);				f->handle = (FileHand) -1;				num = 0;				}			return num;		}	#else	#if defined(_UnixOS) && !defined(_Win32)	case	ft_serial_port2:	case	ft_serial_port1:		{	        fd_set	readfs;			struct timeval tv;			int		res;			FD_ZERO(&readfs);  			FD_SET(f->handle, &readfs); 						tv.tv_usec = 250;  /* milliseconds */	        tv.tv_sec  = 0;    /* seconds */						res = select(f->handle+1, &readfs, NULL, NULL, &tv);			if ( FD_ISSET(f->handle, &readfs) )					return 1;		return 0;		}	#endif	case	ft_stream:		{		long	pos, endpos;		pos = lseek(f->handle, 0, SEEK_CUR);		if	( pos != -1 )	{			endpos = lseek(f->handle, 0, SEEK_END);			lseek(f->handle, pos, SEEK_SET);			return endpos+1;			}		else			err_file((f->last_error = errno));		}		break;	#endif	// common	default:		err_unsup();		};	return 0;}/**/dword	dev_fseek(int sb_handle, dword offset){	dev_file_t *f;	if	( (f = dev_getfileptr(sb_handle)) == NULL )		return 0;	switch ( f->type )	{	case	ft_stream:		#if defined(_PalmOS)		{			dword	pos;			f->last_error = FileSeek(f->handle, offset, fileOriginBeginning);			pos = FileTell(f->handle, NULL, &f->last_error);			if	( f->last_error )	{				err_file(f->last_error);				pos = (dword) -1;				}			return pos;		}		#else		return lseek(f->handle, offset, SEEK_SET);		#endif	default:		err_unsup();		};	return -1;}/**/int		dev_feof(int sb_handle){	dev_file_t *f;	if	( (f = dev_getfileptr(sb_handle)) == NULL )		return 0;	switch ( f->type )	{	case	ft_stream:		#if defined(_PalmOS)		{			dword	fsize, curpos;			curpos = FileTell(f->handle, &fsize, &f->last_error);			if	( f->last_error )	{				err_file(f->last_error);				return 1;				}			return (curpos == fsize);		}		#else		{			long	pos, endpos;			pos = lseek(f->handle, 0, SEEK_CUR);			if	( pos != -1 )	{				endpos = lseek(f->handle, 0, SEEK_END);				lseek(f->handle, pos, SEEK_SET);				return (pos == endpos);				}			else	{				err_file((f->last_error = errno));				return 1;				}		}		#endif	case	ft_serial_port2:	case	ft_serial_port1:		#if defined(_PalmOS)		{			Boolean	a, b;			return (SerGetStatus(f->libHandle, &a, &b) != 0);		}		#else		return 0;		#endif	default:		err_unsup();		};	return 0;}/**	deletes a file*	returns true on success*/int		dev_fremove(const char *file){	int		success;	#if defined(_PalmOS)	success = (FileDelete(0, (char*) file) == 0);	#else	success = (remove(file) == 0);	#endif	if	( !success )			rt_raise("FS: CANNOT KILL FILE");	return success;}/**	returns true if the file exists*/int		dev_fexists(const char *file){	#if defined(_PalmOS)	return (DmFindDatabase(0, (char*) file) != 0);	#else	return (access(file, 0) == 0);	#endif}/**	copy file*	returns true on success*/int		dev_fcopy(const char *file, const char *newfile){	int			src, dst;	byte		*buf;	dword		i, block_size, block_num, remain, file_len;	if	( dev_fexists(file) )	{		if	( dev_fexists(newfile) )	{			if ( !dev_fremove(newfile) )					return 0;	// cannot delete target-file			}		src = dev_freefilehandle();						if	( prog_error )	return 0;		dev_fopen(src, file,    DEV_FILE_INPUT);		if	( prog_error )	return 0;		dst = dev_freefilehandle();						if	( prog_error )	return 0;		dev_fopen(dst, newfile, DEV_FILE_OUTPUT);		if	( prog_error )	return 0;		file_len = dev_flength(src);		if	( file_len != -1 && file_len > 0 )	{			block_size = 1024;			block_num = file_len / block_size;			remain = file_len - (block_num * block_size);			buf = tmp_alloc(block_size);			for ( i = 0; i < block_num; i ++ )	{				dev_fread(src, buf, block_size);		if	( prog_error )	{ tmp_free(buf); return 0; }				dev_fwrite(dst, buf, block_size);		if	( prog_error )	{ tmp_free(buf); return 0; }				}			if	( remain )	{				dev_fread(src, buf, remain);			if	( prog_error )	{ tmp_free(buf); return 0; }				dev_fwrite(dst, buf, remain);			if	( prog_error )	{ tmp_free(buf); return 0; }				}			tmp_free(buf);			}		dev_fclose(src);			if	( prog_error )	return 0; 		dev_fclose(dst);			if	( prog_error )	return 0;		return 1;		}	return 0;	// source file does not exists}/**	rename file*	returns true on success*/int		dev_frename(const char *file, const char *newname){	if	( dev_fcopy(file, newname) )			return dev_fremove(file);	return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?