split engine from game
[vg.git] / vg / vg_io.h
diff --git a/vg/vg_io.h b/vg/vg_io.h
new file mode 100644 (file)
index 0000000..afd134f
--- /dev/null
@@ -0,0 +1,140 @@
+// Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved
+
+// Coloured logging
+// ===========================================================================================================
+
+#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 -2, fmt, args );
+       strcpy( buffer + j, KNRM );
+       
+       fputs( buffer, file );
+       
+       if( vg_log_callback )
+               vg_log_callback( buffer );
+}
+
+static void vg_success( const char *fmt, ... )
+       { va_list args; va_start( args, fmt ); vg_log_write( stdout, (KGRN "success" KWHT "| " KGRN), fmt, args ); va_end( args ); }
+static void vg_info( const char *fmt, ... )
+       { va_list args; va_start( args, fmt ); vg_log_write( stdout, (KNRM "   info" KWHT "| " KNRM), fmt, args ); va_end( args ); }
+static void vg_warn( const char *fmt, ... )
+       { va_list args; va_start( args, fmt ); vg_log_write( stdout, (KYEL "   warn" KWHT "| " KYEL), fmt, args ); va_end( args ); }
+static void vg_error( const char *fmt, ... )
+       { va_list args; va_start( args, fmt ); vg_log_write( stderr, (KRED "  error" KWHT "| " KRED), fmt, args ); va_end( args ); }
+
+// FILE IO
+// ===========================================================================================================
+
+static i64 vg_file_size( FILE *fileptr )
+{
+       fseek( fileptr, 0, SEEK_END );
+       i64 fsize = ftell( fileptr );
+       fseek( fileptr, 0, SEEK_SET );
+       
+       return fsize;
+}
+
+static void *vg_disk_open_read( const char *path, int const reserve_end, i64 *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;
+               
+               fclose( f );
+               return buf;
+       }
+       else
+       {
+               return NULL;
+       }
+}
+
+static char *vg_disk_load_text( const char *path, i64 *size )
+{
+       char *buf;
+       i64 fsize;
+       
+       if( (buf = vg_disk_open_read( path, 1, &fsize )) )
+       {
+               buf[ fsize ] = 0x00;
+               *size = fsize +1;
+               
+               return buf;
+       }
+
+       return NULL;
+}
+
+static void *vg_asset_read_s( const char *path, i64 *size )
+{
+       return vg_disk_open_read( path, 0, size );
+}
+
+static void *vg_asset_read( const char *path )
+{
+       i64 size;
+       return vg_disk_open_read( path, 0, &size );
+}
+
+static char *vg_textasset_read_s( const char *path, i64 *size )
+{
+       return vg_disk_load_text( path, size );
+}
+
+static char *vg_textasset_read( const char *name )
+{
+       i64 size;
+       return vg_disk_load_text( name, &size );
+}
+
+static int vg_asset_write( const char *path, void *data, i64 size )
+{
+       FILE *f = fopen( path, "wb" );
+       if( f )
+       {
+               fwrite( data, size, 1, f );
+               fclose( f );
+               return 1;
+       }
+       else
+       {
+               return 0;
+       }
+}