summaryrefslogblamecommitdiffstats
path: root/file_use.c
blob: ac5fca30628b2a68b7474d9a3fa6513b3a156ab5 (plain) (tree)
1
2
3
4


                     
                                                                       










                                

                                                                       


                                                     
                      






























                                                             
                                                                       


                                                         
 
                      

































                                                                        







                                                                       
                      






















                                                                       




                              
                      

















                                                              
                                                                       

                                                          
                        
                      




                                                    
                                                               

                 
                   





                    
                                                                       



                                                   

                                
                              

                               
                      






























                                                                     
                                                       





                                                    
                                               









                            
                                                                       

                               
                      







                                   
#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 )
{
	size_t ret = -1;
	//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;
	}
}