5 FILE *read_open( char *file )
7 /* Martin A. Hansen, November 2005 */
9 /* Given a file name, read-opens the file, */
10 /* and returns a file pointer. */
15 if ( ( fp = fopen( file, "r" ) ) == NULL )
17 sprintf( msg, "Could not read-open file '%s'.", file );
26 FILE *write_open( char *file )
28 /* Martin A. Hansen, November 2005 */
30 /* Given a file name, write-opens the file, */
31 /* and returns a file pointer. */
36 if ( ( fp = fopen( file, "w" ) ) == NULL )
38 sprintf( msg, "Could not write-open file '%s'.", file );
47 FILE *append_open( char *file )
49 /* Martin A. Hansen, November 2005 */
51 /* Given a file name, append-opens the file, */
52 /* and returns a file pointer. */
57 if ( ( fp = fopen( file, "a" ) ) == NULL )
59 sprintf( msg, "Could not append-open file '%s'.", file );
68 void close_stream( FILE *fp )
70 /* Martin A. Hansen, May 2008 */
72 /* Closes a stream or file associated with a given file pointer. */
74 if ( ( fclose( fp ) ) != 0 ) {
75 die( "Could not close stream." );
80 char *file_read( FILE *fp, size_t len )
82 /* Martin A. Hansen, June 2008 */
84 /* Read in len number of bytes from the current position of a */
85 /* file pointer into a string that is allocated and null terminated. */
89 string = mem_get( len + 1 );
91 fread( string, len, 1, fp );
93 if ( ferror( fp ) != 0 ) {
94 die( "fread failed." );
97 string[ len + 1 ] = '\0';
103 void file_unlink( char *file )
105 /* Martin A. Hansen, June 2008 */
111 if ( unlink( file ) == -1 )
113 sprintf( msg, "Could not delete file '%s'.", file );
120 void file_rename( char *old_name, char *new_name )
122 /* Martin A. Hansen, June 2008 */
128 if ( rename( old_name, new_name ) == -1 )
130 sprintf( msg, "Could not rename file '%s' -> '%s'.", old_name, new_name );
137 /* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FILE BUFFER <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
140 struct file_buffer *read_open_buffer( char *file )
142 /* Martin A. Hansen, June 2008 */
144 /* Opens a file for reading and loads a new buffer.*/
146 struct file_buffer *buffer;
153 fp = read_open( file );
155 str = file_read( fp, FILE_BUFFER_SIZE );
157 feof( fp ) ? ( eof = TRUE ) : ( eof = FALSE );
163 buffer->end = strlen( str );
164 buffer->size = FILE_BUFFER_SIZE;
171 char buffer_getc( struct file_buffer *buffer )
173 /* Martin A. Hansen, June 2008 */
175 /* Get the next char from a file buffer, which is resized if necessary, until EOF.*/
179 if ( buffer->use == buffer->end )
187 buffer->pos = buffer->use;
188 buffer_new_size( buffer, buffer->use );
189 buffer_resize( buffer );
193 return buffer->str[ buffer->use++ ];
198 char *buffer_gets( struct file_buffer *buffer )
200 /* Martin A. Hansen, June 2008 */
202 /* Get the next line that is terminated by \n or EOF from a file buffer. */
210 if ( ( pt = memchr( &buffer->str[ buffer->use ], '\n', buffer->end - buffer->use ) ) != NULL )
212 line_size = pt - &buffer->str[ buffer->use ] + 1;
214 line = mem_get( line_size );
216 memcpy( line, &buffer->str[ buffer->use ], line_size );
218 line[ line_size ] = '\0';
220 buffer->use += line_size;
222 buffer_new_size( buffer, line_size );
231 buffer_resize( buffer );
238 void buffer_new_size( struct file_buffer *buffer, int len )
240 /* Martin A. Hansen, June 2008 */
242 /* Increases buffer size until it is larger than len. */
244 while ( buffer->size < len )
248 if ( buffer->size <= 0 ) {
249 die( "buffer_new_size failed." );
255 void buffer_resize( struct file_buffer *buffer )
257 /* Martin A. Hansen, June 2008 */
259 /* Resize file buffer. */
265 str = file_read( buffer->fp, buffer->size );
267 str_len = strlen( str );
269 feof( buffer->fp ) ? ( buffer->eof = TRUE ) : ( buffer->eof = FALSE );
271 if ( buffer->pos != 0 )
273 memmove( buffer->str, &buffer->str[ buffer->pos ], buffer->use - buffer->pos );
275 buffer->end -= buffer->pos;
280 new_end = buffer->end + str_len;
282 buffer->str = mem_resize( buffer->str, new_end + 1 );
284 memcpy( &buffer->str[ buffer->end ], str, str_len );
286 buffer->str[ new_end + 1 ] = '\0';
288 buffer->end = new_end;
294 void buffer_destroy( struct file_buffer *buffer )
296 /* Martin A. Hansen, June 2008 */
298 /* Deallocates memory and close stream used by file buffer. */
300 close_stream( buffer->fp );
302 mem_free( buffer->str );
307 void buffer_print( struct file_buffer *buffer )
309 /* Martin A. Hansen, June 2008 */
311 /* Debug function that prints the content of a file_buffer. */
313 printf( "buffer: {\n" );
314 printf( " pos : %lu\n", buffer->pos );
315 printf( " use : %lu\n", buffer->use );
316 printf( " end : %lu\n", buffer->end );
317 printf( " eof : %d\n", buffer->eof );
318 printf( " str : ->%s<-\n", buffer->str );
319 printf( " str_len: %lu\n", strlen( buffer->str ) );
324 /* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/