X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=src%2Fvg%2Fvg_io.h;h=b5440ec201be29fd95a234054efd1e594819e16b;hb=3dd767bb10e6fee9cbffeb185d1a9685810c17b5;hp=2650b3fd9f7e5ac6faa2f33cf4a70a888b7a0f5e;hpb=04107408ecd2adf031abb286c4c5b7d5cc0c3c9d;p=vg.git diff --git a/src/vg/vg_io.h b/src/vg/vg_io.h index 2650b3f..b5440ec 100644 --- a/src/vg/vg_io.h +++ b/src/vg/vg_io.h @@ -5,140 +5,114 @@ #include "vg_stdint.h" #include "vg_platform.h" +#include "vg_log.h" +#include "vg_mem.h" #include -#include -#include -#include - -#define KNRM "\x1B[0m" -#define KRED "\x1B[31m" -#define KGRN "\x1B[32m" -#define KYEL "\x1B[33m" -#define KBLU "\x1B[34m" -#define KMAG "\x1B[35m" -#define KCYN "\x1B[36m" -#define KWHT "\x1B[37m" - -void (*vg_log_callback)( const char *str ) = NULL; - -static void vg_log_write( FILE *file, const char *prefix, - const char *fmt, va_list args ) -{ - char buffer[512]; - int i, j; - - for( i = 0; i < vg_list_size( buffer ); i ++ ) - { - if( prefix[i] ) - buffer[i] = prefix[i]; - else - break; - } - - j = i + vsnprintf( buffer + i, vg_list_size( buffer ) - i -12, fmt, args ); - strcpy( buffer + j, KNRM ); - - fputs( buffer, file ); - - if( vg_log_callback ) - vg_log_callback( buffer ); -} - -#define VG_LOGX( NAME, PIPE, PFX ) \ -static void NAME(const char *fmt, ...) \ -{ \ - va_list args; \ - va_start( args, fmt ); \ - vg_log_write( PIPE, (PFX), fmt, args ); \ - va_end( args ); \ -} - -VG_LOGX( vg_success, stdout, (KGRN "success" KWHT "| " KGRN) ) -VG_LOGX( vg_info, stdout, (KNRM " info" KWHT "| " KNRM) ) -VG_LOGX( vg_log, stdout, (KWHT " log" KWHT "| " KWHT) ) -VG_LOGX( vg_warn, stdout, (KYEL " warn" KWHT "| " KYEL) ) -VG_LOGX( vg_error, stderr, (KRED " error" KWHT "| " KRED) ) +#include /* - * FIle I/O + * File I/O */ -static i64 vg_file_size( FILE *fileptr ) + +#define VG_FILE_IO_CHUNK_SIZE 1024*256 + +VG_STATIC void vg_file_print_invalid( FILE *fp ) { - fseek( fileptr, 0, SEEK_END ); - i64 fsize = ftell( fileptr ); - fseek( fileptr, 0, SEEK_SET ); - - return fsize; + if( feof( fp )) + { + vg_error( "mdl_open: header too short\n" ); + } + else + { + if( ferror( fp )) + vg_error( "mdl_open: %s\n", strerror(errno) ); + else + vg_error( "mdl_open: unkown failure\n" ); + + } } -static void *vg_disk_open_read( const char *path, int reserve_end, i64 *size ) +/* read entire binary file */ +VG_STATIC void *vg_file_read( void *lin_alloc, const char *path, u32 *size ) { FILE *f = fopen( path, "rb" ); if( f ) { - i64 fsize = vg_file_size( f ); - void *buf = malloc( fsize + reserve_end ); - - if( buf ) - { - /* Invalid / corrupt read */ - if( fread( buf, 1, fsize, f ) != fsize ) - { - free( buf ); - buf = NULL; - } - } - - *size = fsize; - + void *buffer = vg_linear_alloc( lin_alloc, 0 ); + u64 current = 0; + + /* read in chunks */ + for( u32 i=0; 1; i++ ) + { + buffer = vg_linear_extend( lin_alloc, buffer, VG_FILE_IO_CHUNK_SIZE ); + + u64 l = fread( buffer + current, 1, VG_FILE_IO_CHUNK_SIZE, f ); + current += l; + + if( l != VG_FILE_IO_CHUNK_SIZE ) + { + if( feof( f ) ) + { + break; + } + else + { + if( ferror( f ) ) + { + fclose(f); + vg_fatal_exit_loop( "read error" ); + } + else + { + fclose(f); + vg_fatal_exit_loop( "unknown error codition" ); + } + } + } + } + + buffer = vg_linear_resize( lin_alloc, buffer, current ); fclose( f ); - return buf; + + *size = (u32)current; + + return buffer; } else { + vg_error( "vg_disk_open_read: %s\n", strerror(errno) ); return NULL; } } -static char *vg_disk_load_text( const char *path, i64 *size ) +/* get the size of the file just loaded */ +#if 0 +VG_STATIC u32 vg_linear_last_size( void *allocator ); /* ? */ +VG_STATIC u32 vg_file_size( void *lin_alloc ) { - char *buf; - i64 fsize; - - if( (buf = (char *)vg_disk_open_read( path, 1, &fsize )) ) - { - buf[ fsize ] = 0x00; - *size = fsize +1; - - return buf; - } - - return NULL; + return vg_linear_last_size( lin_alloc ); } +#endif -static void *vg_asset_read_s( const char *path, i64 *size ) +/* read entire file and append a null on the end */ +VG_STATIC char *vg_file_read_text( void *lin_alloc, const char *path, u32 *sz ) { - return vg_disk_open_read( path, 0, size ); -} + u32 size; + char *str = vg_file_read( lin_alloc, path, &size ); -static void *vg_asset_read( const char *path ) -{ - i64 size; - return vg_disk_open_read( path, 0, &size ); -} + if( !str ) + return NULL; -static char *vg_textasset_read_s( const char *path, i64 *size ) -{ - return vg_disk_load_text( path, size ); -} + /* include null terminator */ + str = vg_linear_extend( lin_alloc, str, 1 ); + str[ size ] = '\0'; + *sz = size+1; -static char *vg_textasset_read( const char *name ) -{ - i64 size; - return vg_disk_load_text( name, &size ); + return str; } -static int vg_asset_write( const char *path, void *data, i64 size ) + +VG_STATIC int vg_asset_write( const char *path, void *data, i64 size ) { FILE *f = fopen( path, "wb" ); if( f )