#include "file_use.h" //--------------------------------------------------------------------- void f_file_null( f_file *f_f ) { if ( f_f ) { f_f->fid = NULL; f_f->flags = 0; f_f->size = -1; f_f->seek = -1; } } //--------------------------------------------------------------------- int f_file_seek( f_file *f_f, long offset, int seek ) { int ret=-1; //PRINT("\n"); if ( f_f ) { if ( offset < 0 ) { ERROR("\n"); return -1; } if ( offset > f_f->size ) { ERROR("\n"); return -1; } ret = fseek( f_f->fid, offset , seek ); PRINT("ret=%d\n",ret); if ( ret == 0 ) { f_f->seek = ret; } else { ERROR("cannot seek to %d\n", offset); return -1; } PRINT("ret=%d\n",ret); } return ret; } //--------------------------------------------------------------------- size_t f_file_read( f_file *f_f, size_t size, void *ptr ) { size_t ret=-1; //PRINT("\n"); if ( f_f ) { if ( (f_f->flags == F_FILE_READ) || (f_f->flags == F_FILE_RW)) { if ( f_f->size >= f_f->seek + f_f->size ) { ret = fread( ptr, 1, size, f_f->fid ); /* if ( ret != size ) { ERROR("%d != %d\n", ret, size ); return -1; } else */ if ( ret < 0 ) { ERROR("\n"); return ret; } } else { ERROR("\n"); } } else { ERROR("file writable only"); } } return ret; } //--------------------------------------------------------------------- //not effective algo ofcourse, but who cares while no one cares //read buffer and then find in buffer newline, calc nl position and //do the job size_t f_file_readl( f_file *f_f, size_t size, void *ptr ) { size_t ret=-1; //PRINT("\n"); if ( f_f ) { int c=0; size_t counter=0; //fseek( f_f->fid, 0, SEEK_SET); c = getc( f_f->fid ); while ( (c != '\n') && ( c != EOF )) { if ( counter < size ) { ((char *)(ptr))[counter] = (char)c; counter++; } c = getc( f_f->fid ); } if ( counter > 0 ) ret = counter; } return ret; } //--------------------------------------------------------------------- int f_file_size( f_file *f_f ) { int ret=-1; long old_seek; //PRINT("\n"); if ( f_f ) { //could make some logic break if ( f_f->size < 0 ) { old_seek = ftell( f_f->fid ); fseek( f_f->fid, 0, SEEK_END ); ret = ftell( f_f->fid ); fseek( f_f->fid, old_seek, SEEK_CUR ); } } return ret; } //f_file_read_bl(); //--------------------------------------------------------------------- size_t f_file_write( f_file *f_f, size_t size, void *ptr ) { //PRINT("\n"); if ( f_f ) { if ((f_f->flags == F_FILE_WRITE) || (f_f->flags == F_FILE_RW) ) { ret = fwrite( ptr, 1, size, f_f->fid ); } } return ret; } //f_file_write_bl(); //--------------------------------------------------------------------- f_file* f_file_open( const char *fname, int flags ) { f_file *ret = NULL; char *f_flags_write="w"; char *f_flags_read="r"; char *f_flags_rw="r+"; char *f_flags_tmp=NULL; //PRINT("\n"); if ( fname != NULL ) { ret = malloc( sizeof( f_file ) ); if ( ret == NULL ) { ERROR("Cannot alloc mem\n"); return NULL; } memset( ret, 0, sizeof( f_file )); f_file_null( ret ); switch ( flags ) { case F_FILE_READ: f_flags_tmp = f_flags_read; ret->flags = F_FILE_READ; break; case F_FILE_WRITE: f_flags_tmp = f_flags_write; ret->flags = F_FILE_WRITE; break; case F_FILE_RW: f_flags_tmp = f_flags_rw; ret->flags = F_FILE_RW; break; default: ERROR("Unknown flag for opening \n"); goto exit_close_f; } ret->fid = fopen( fname, f_flags_tmp ); if ( ret->fid == NULL ) { ERROR("Cannot open file\n"); goto exit_close_f; } ret->size = f_file_size( ret ); fseek( ret->fid, 0, SEEK_SET ); } return ret; exit_close_f: if ( ret != NULL ) free( ret ); return NULL; } //--------------------------------------------------------------------- int f_file_close( f_file *f_f ) { //PRINT("\n"); if ( f_f ) { fclose( f_f->fid ); free( f_f ); f_f = NULL; } }