getting stuff working on windows again
[vg.git] / vg_log.h
1 #ifndef VG_LOG_H
2 #define VG_LOG_H
3
4 #include <stdarg.h>
5 #include <string.h>
6 #include <malloc.h>
7 #include "vg_stdint.h"
8 #include "vg_platform.h"
9
10 #ifdef _WIN32
11 #define KNRM ""
12 #define KBLK ""
13 #define KRED ""
14 #define KGRN ""
15 #define KYEL ""
16 #define KBLU ""
17 #define KMAG ""
18 #define KCYN ""
19 #define KWHT ""
20 #else
21 #define KNRM "\x1B[0m"
22 #define KBLK "\x1B[30m"
23 #define KRED "\x1B[31m"
24 #define KGRN "\x1B[32m"
25 #define KYEL "\x1B[33m"
26 #define KBLU "\x1B[34m"
27 #define KMAG "\x1B[35m"
28 #define KCYN "\x1B[36m"
29 #define KWHT "\x1B[37m"
30 #endif
31
32 #define PRINTF_v2f( V2 ) "%.4f %.4f\n", V2[0], V2[1]
33 #define PRINTF_v3f( V3 ) "%.4f %.4f %.4f\n", V3[0], V3[1], V3[2]
34 #define PRINTF_v4f( V4 ) "%.4f %.4f %.4f %.4f\n", V4[0], V4[1], V4[2], V4[3]
35
36 #ifdef _WIN32
37 #define PRINTF_U64 "%llu"
38 #else
39 #define PRINTF_U64 "%lu"
40 #endif
41
42 #ifdef VG_GAME
43 static SDL_SpinLock log_print_sl;
44 #endif
45
46 struct vg_log
47 {
48 char buffer[64][96];
49 u32 buffer_line_count, buffer_line_current;
50 }
51 static vg_log;
52
53 void _vg_console_append_to_log( const char *str )
54 {
55 if( vg_log.buffer_line_count < vg_list_size( vg_log.buffer ) )
56 vg_log.buffer_line_count ++;
57
58 char *dest = vg_log.buffer[ vg_log.buffer_line_current ++ ];
59
60 for( int i=0; i<vg_list_size( vg_log.buffer[0] ); i++ ){
61 if( !str[i] || ( i == vg_list_size(vg_log.buffer[0])-1 ) ){
62 dest[i] = '\0';
63 break;
64 }
65
66 dest[i] = str[i];
67 }
68
69 if( vg_log.buffer_line_current >= vg_list_size( vg_log.buffer ) )
70 vg_log.buffer_line_current = 0;
71 }
72
73 VG_STATIC void _vg_log_write( FILE *file, const char *prefix,
74 const char *fmt, va_list args )
75 {
76 #ifdef VG_GAME
77 SDL_AtomicLock( &log_print_sl );
78 #endif
79
80 char buffer[ 4096 ];
81 int i, j;
82
83 for( i=0; i<vg_list_size( buffer ); i ++ ){
84 if( prefix[i] )
85 buffer[i] = prefix[i];
86 else
87 break;
88 }
89
90 j = i + vsnprintf( buffer + i, vg_list_size( buffer ) - i -12, fmt, args );
91 strcpy( buffer + j, KNRM );
92
93 fputs( buffer, file );
94
95 _vg_console_append_to_log( buffer );
96 #ifdef VG_GAME
97 SDL_AtomicUnlock( &log_print_sl );
98 #endif
99 }
100
101 #define VG_LOGX( NAME, PIPE, PFX ) \
102 VG_STATIC void NAME(const char *fmt, ...) \
103 { \
104 va_list args; \
105 va_start( args, fmt ); \
106 _vg_log_write( PIPE, (PFX), fmt, args ); \
107 va_end( args ); \
108 }
109
110 VG_LOGX( vg_success, stdout, (KGRN "success" KWHT "| " KGRN) )
111 VG_LOGX( vg_info, stdout, (KNRM " info" KWHT "| " KNRM) )
112 VG_LOGX( vg_warn, stdout, (KYEL " warn" KWHT "| " KYEL) )
113 VG_LOGX( vg_error, stderr, (KRED " error" KWHT "| " KRED) )
114 VG_LOGX( vg_low, stdout, (KWHT " log" KWHT "| " KWHT) )
115
116 #endif /* VG_LOG_H */