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