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 + -
显示快捷键?