afd134f45a05a76d72d0a69ee7a5076a2eeecd93
[fishladder.git] / vg / vg_io.h
1 // Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved
2
3 // Coloured logging
4 // ===========================================================================================================
5
6 #define KNRM "\x1B[0m"
7 #define KRED "\x1B[31m"
8 #define KGRN "\x1B[32m"
9 #define KYEL "\x1B[33m"
10 #define KBLU "\x1B[34m"
11 #define KMAG "\x1B[35m"
12 #define KCYN "\x1B[36m"
13 #define KWHT "\x1B[37m"
14
15 void (*vg_log_callback)( const char *str ) = NULL;
16
17 static void vg_log_write( FILE *file, const char *prefix, const char *fmt, va_list args )
18 {
19 char buffer[512];
20 int i, j;
21
22 for( i = 0; i < vg_list_size( buffer ); i ++ )
23 {
24 if( prefix[i] )
25 buffer[i] = prefix[i];
26 else
27 break;
28 }
29
30 j = i + vsnprintf( buffer + i, vg_list_size( buffer ) - i -2, fmt, args );
31 strcpy( buffer + j, KNRM );
32
33 fputs( buffer, file );
34
35 if( vg_log_callback )
36 vg_log_callback( buffer );
37 }
38
39 static void vg_success( const char *fmt, ... )
40 { va_list args; va_start( args, fmt ); vg_log_write( stdout, (KGRN "success" KWHT "| " KGRN), fmt, args ); va_end( args ); }
41 static void vg_info( const char *fmt, ... )
42 { va_list args; va_start( args, fmt ); vg_log_write( stdout, (KNRM " info" KWHT "| " KNRM), fmt, args ); va_end( args ); }
43 static void vg_warn( const char *fmt, ... )
44 { va_list args; va_start( args, fmt ); vg_log_write( stdout, (KYEL " warn" KWHT "| " KYEL), fmt, args ); va_end( args ); }
45 static void vg_error( const char *fmt, ... )
46 { va_list args; va_start( args, fmt ); vg_log_write( stderr, (KRED " error" KWHT "| " KRED), fmt, args ); va_end( args ); }
47
48 // FILE IO
49 // ===========================================================================================================
50
51 static i64 vg_file_size( FILE *fileptr )
52 {
53 fseek( fileptr, 0, SEEK_END );
54 i64 fsize = ftell( fileptr );
55 fseek( fileptr, 0, SEEK_SET );
56
57 return fsize;
58 }
59
60 static void *vg_disk_open_read( const char *path, int const reserve_end, i64 *size )
61 {
62 FILE *f = fopen( path, "rb" );
63 if( f )
64 {
65 i64 fsize = vg_file_size( f );
66 void *buf = malloc( fsize + reserve_end );
67
68 if( buf )
69 {
70 // Invalid / corrupt read
71 if( fread( buf, 1, fsize, f ) != fsize )
72 {
73 free( buf );
74 buf = NULL;
75 }
76 }
77
78 *size = fsize;
79
80 fclose( f );
81 return buf;
82 }
83 else
84 {
85 return NULL;
86 }
87 }
88
89 static char *vg_disk_load_text( const char *path, i64 *size )
90 {
91 char *buf;
92 i64 fsize;
93
94 if( (buf = vg_disk_open_read( path, 1, &fsize )) )
95 {
96 buf[ fsize ] = 0x00;
97 *size = fsize +1;
98
99 return buf;
100 }
101
102 return NULL;
103 }
104
105 static void *vg_asset_read_s( const char *path, i64 *size )
106 {
107 return vg_disk_open_read( path, 0, size );
108 }
109
110 static void *vg_asset_read( const char *path )
111 {
112 i64 size;
113 return vg_disk_open_read( path, 0, &size );
114 }
115
116 static char *vg_textasset_read_s( const char *path, i64 *size )
117 {
118 return vg_disk_load_text( path, size );
119 }
120
121 static char *vg_textasset_read( const char *name )
122 {
123 i64 size;
124 return vg_disk_load_text( name, &size );
125 }
126
127 static int vg_asset_write( const char *path, void *data, i64 size )
128 {
129 FILE *f = fopen( path, "wb" );
130 if( f )
131 {
132 fwrite( data, size, 1, f );
133 fclose( f );
134 return 1;
135 }
136 else
137 {
138 return 0;
139 }
140 }