simplify gitignore
[vg.git] / src / vg / 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/vg_stdint.h"
8 #include "vg/vg_platform.h"
9
10 #define KNRM "\x1B[0m"
11 #define KRED "\x1B[31m"
12 #define KGRN "\x1B[32m"
13 #define KYEL "\x1B[33m"
14 #define KBLU "\x1B[34m"
15 #define KMAG "\x1B[35m"
16 #define KCYN "\x1B[36m"
17 #define KWHT "\x1B[37m"
18
19 vg_mutex log_print_mutex;
20
21 struct vg_log
22 {
23 char buffer[64][96];
24 u32 buffer_line_count, buffer_line_current;
25 }
26 static vg_log;
27
28 void vg_console_append_to_log( const char *str )
29 {
30 if( vg_log.buffer_line_count < vg_list_size( vg_log.buffer ) )
31 vg_log.buffer_line_count ++;
32
33 char *dest = vg_log.buffer[ vg_log.buffer_line_current ++ ];
34
35 for( int i=0; i<vg_list_size( vg_log.buffer[0] ); i++ )
36 {
37 if( !str[i] || ( i == vg_list_size(vg_log.buffer[0])-1 ) )
38 {
39 dest[i] = '\0';
40 break;
41 }
42
43 dest[i] = str[i];
44 }
45
46 if( vg_log.buffer_line_current >= vg_list_size( vg_log.buffer ) )
47 vg_log.buffer_line_current = 0;
48 }
49
50 VG_STATIC void vg_log_write( FILE *file, const char *prefix,
51 const char *fmt, va_list args )
52 {
53 vg_mutex_lock( &log_print_mutex );
54
55 char buffer[ 4096 ];
56 int i, j;
57
58 for( i=0; i<vg_list_size( buffer ); i ++ )
59 {
60 if( prefix[i] )
61 buffer[i] = prefix[i];
62 else
63 break;
64 }
65
66 j = i + vsnprintf( buffer + i, vg_list_size( buffer ) - i -12, fmt, args );
67 strcpy( buffer + j, KNRM );
68
69 fputs( buffer, file );
70
71 vg_console_append_to_log( buffer );
72 vg_mutex_unlock( &log_print_mutex );
73 }
74
75 VG_STATIC void vg_log_init(void)
76 {
77 vg_mutex_init( &log_print_mutex );
78 }
79
80 #define VG_LOGX( NAME, PIPE, PFX ) \
81 VG_STATIC void NAME(const char *fmt, ...) \
82 { \
83 va_list args; \
84 va_start( args, fmt ); \
85 vg_log_write( PIPE, (PFX), fmt, args ); \
86 va_end( args ); \
87 }
88
89 VG_LOGX( vg_success, stdout, (KGRN "success" KWHT "| " KGRN) )
90 VG_LOGX( vg_info, stdout, (KNRM " info" KWHT "| " KNRM) )
91 VG_LOGX( vg_warn, stdout, (KYEL " warn" KWHT "| " KYEL) )
92 VG_LOGX( vg_error, stderr, (KRED " error" KWHT "| " KRED) )
93 VG_LOGX( vg_low, stdout, (KWHT " log" KWHT "| " KWHT) )
94
95 #endif /* VG_LOG_H */