mc 1.9
[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_warn, stdout, (KYEL " warn" KWHT "| " KYEL) )
49 VG_LOGX( vg_error, stderr, (KRED " error" KWHT "| " KRED) )
50
51 /*
52 * FIle I/O
53 */
54 static i64 vg_file_size( FILE *fileptr )
55 {
56 fseek( fileptr, 0, SEEK_END );
57 i64 fsize = ftell( fileptr );
58 fseek( fileptr, 0, SEEK_SET );
59
60 return fsize;
61 }
62
63 static void *vg_disk_open_read( const char *path, int reserve_end, i64 *size )
64 {
65 FILE *f = fopen( path, "rb" );
66 if( f )
67 {
68 i64 fsize = vg_file_size( f );
69 void *buf = malloc( fsize + reserve_end );
70
71 if( buf )
72 {
73 /* Invalid / corrupt read */
74 if( fread( buf, 1, fsize, f ) != fsize )
75 {
76 free( buf );
77 buf = NULL;
78 }
79 }
80
81 *size = fsize;
82
83 fclose( f );
84 return buf;
85 }
86 else
87 {
88 return NULL;
89 }
90 }
91
92 static char *vg_disk_load_text( const char *path, i64 *size )
93 {
94 char *buf;
95 i64 fsize;
96
97 if( (buf = vg_disk_open_read( path, 1, &fsize )) )
98 {
99 buf[ fsize ] = 0x00;
100 *size = fsize +1;
101
102 return buf;
103 }
104
105 return NULL;
106 }
107
108 static void *vg_asset_read_s( const char *path, i64 *size )
109 {
110 return vg_disk_open_read( path, 0, size );
111 }
112
113 static void *vg_asset_read( const char *path )
114 {
115 i64 size;
116 return vg_disk_open_read( path, 0, &size );
117 }
118
119 static char *vg_textasset_read_s( const char *path, i64 *size )
120 {
121 return vg_disk_load_text( path, size );
122 }
123
124 static char *vg_textasset_read( const char *name )
125 {
126 i64 size;
127 return vg_disk_load_text( name, &size );
128 }
129
130 static int vg_asset_write( const char *path, void *data, i64 size )
131 {
132 FILE *f = fopen( path, "wb" );
133 if( f )
134 {
135 fwrite( data, size, 1, f );
136 fclose( f );
137 return 1;
138 }
139 else
140 {
141 return 0;
142 }
143 }