X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vg_io.h;h=af1554b3c856d2f9009c4b10f395ab389ac84591;hb=8340e9c7406c7292f85266f9f30f4b5ff246dcd3;hp=d962bc46f921ee34e016479c982fa665f65511e5;hpb=4c48fe01a5d1983be89b7dce6f08e6b708cfbb05;p=vg.git diff --git a/vg_io.h b/vg_io.h index d962bc4..af1554b 100644 --- a/vg_io.h +++ b/vg_io.h @@ -10,6 +10,30 @@ #include #include + +#define _TINYDIR_MALLOC(_size) vg_linear_alloc( vg_mem.scratch, _size ) +#define _TINYDIR_FREE(_size) + +#include "submodules/tinydir/tinydir.h" +#include + +/* + * Create directory and silently ignore errors for already exists + */ +VG_STATIC int vg_mkdir( const char *path ) +{ + if( mkdir( path, S_IRWXU|S_IRWXG|S_IWOTH|S_IXOTH ) ){ + if( errno == EEXIST ) + return 1; + + vg_error( "Failed to create directory: %s\n", path ); + return 0; + } + else{ + return 1; + } +} + /* * File I/O */ @@ -18,12 +42,10 @@ VG_STATIC void vg_file_print_invalid( FILE *fp ) { - if( feof( fp )) - { + if( feof( fp )) { vg_error( "mdl_open: header too short\n" ); } - else - { + else{ if( ferror( fp )) vg_error( "mdl_open: %s\n", strerror(errno) ); else @@ -36,50 +58,41 @@ VG_STATIC void vg_file_print_invalid( FILE *fp ) VG_STATIC void *vg_file_read( void *lin_alloc, const char *path, u32 *size ) { FILE *f = fopen( path, "rb" ); - if( f ) - { + if( f ){ void *buffer = vg_linear_alloc( lin_alloc, 0 ); u64 current = 0; /* read in chunks */ - for( u32 i=0; 1; i++ ) - { + 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 ) ) - { + if( l != VG_FILE_IO_CHUNK_SIZE ){ + if( feof( f ) ){ break; } - else - { - if( ferror( f ) ) - { + else{ + if( ferror( f ) ){ fclose(f); - vg_fatal_exit_loop( "read error" ); + vg_fatal_error( "read error" ); } - else - { + else{ fclose(f); - vg_fatal_exit_loop( "unknown error codition" ); + vg_fatal_error( "unknown error codition" ); } } } } - buffer = vg_linear_resize( lin_alloc, buffer, current ); + buffer = vg_linear_resize( lin_alloc, buffer, vg_align8(current) ); fclose( f ); *size = (u32)current; - return buffer; } - else - { + else{ vg_error( "vg_disk_open_read: %s\n", strerror(errno) ); return NULL; } @@ -103,19 +116,39 @@ VG_STATIC char *vg_file_read_text( void *lin_alloc, const char *path, u32 *sz ) } -VG_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 ) - { + if( f ){ fwrite( data, size, 1, f ); fclose( f ); return 1; } - else - { + else{ return 0; } } +/* TODO: error handling if read fails */ +VG_STATIC int vg_file_copy( const char *src, const char *dst, void *lin_alloc ) +{ + vg_info( "vg_file_copy( %s -> %s )\n", src, dst ); + u32 size; + void *data = vg_file_read( lin_alloc, src, &size ); + return vg_asset_write( dst, data, size ); +} + +VG_STATIC const char *vg_path_filename( const char *path ) +{ + const char *base = path; + + for( int i=0; i<1024; i++ ){ + if( path[i] == '\0' ) break; + if( path[i] == '/' ){ + base = path+i+1; + } + } + + return base; +} + #endif /* VG_IO_H */