Refactor, GLFW->SDL
[vg.git] / vg_log.h
diff --git a/vg_log.h b/vg_log.h
new file mode 100644 (file)
index 0000000..dfb4fc9
--- /dev/null
+++ b/vg_log.h
@@ -0,0 +1,100 @@
+#ifndef VG_LOG_H
+#define VG_LOG_H
+
+#include <stdarg.h>
+#include <string.h>
+#include <malloc.h>
+#include "vg_stdint.h"
+#include "vg_platform.h"
+
+#define KNRM  "\x1B[0m"
+#define KRED  "\x1B[31m"
+#define KGRN  "\x1B[32m"
+#define KYEL  "\x1B[33m"
+#define KBLU  "\x1B[34m"
+#define KMAG  "\x1B[35m"
+#define KCYN  "\x1B[36m"
+#define KWHT  "\x1B[37m"
+
+#ifdef VG_GAME
+static SDL_SpinLock log_print_sl;
+#endif
+
+struct vg_log
+{
+   char buffer[64][96];
+   u32  buffer_line_count, buffer_line_current;
+}
+static vg_log;
+
+void vg_console_append_to_log( const char *str )
+{
+   if( vg_log.buffer_line_count < vg_list_size( vg_log.buffer ) )
+      vg_log.buffer_line_count ++;
+
+   char *dest = vg_log.buffer[ vg_log.buffer_line_current ++ ];
+
+   for( int i=0; i<vg_list_size( vg_log.buffer[0] ); i++ )
+   {
+      if( !str[i] || ( i == vg_list_size(vg_log.buffer[0])-1 ) )
+      {
+         dest[i] = '\0';
+         break;
+      }
+
+      dest[i] = str[i];
+   }
+   
+   if( vg_log.buffer_line_current >= vg_list_size( vg_log.buffer ) )
+      vg_log.buffer_line_current = 0;
+}
+
+VG_STATIC void vg_log_write( FILE *file, const char *prefix, 
+      const char *fmt, va_list args )
+{
+#ifdef VG_GAME
+   SDL_AtomicLock( &log_print_sl );
+#endif
+
+       char buffer[ 4096 ];
+       int i, j;
+       
+       for( i=0; i<vg_list_size( buffer ); i ++ )
+       {
+               if( prefix[i] )
+                       buffer[i] = prefix[i];
+               else 
+                       break;
+       }
+       
+       j = i + vsnprintf( buffer + i, vg_list_size( buffer ) - i -12, fmt, args );
+       strcpy( buffer + j, KNRM );
+       
+       fputs( buffer, file );
+   
+   vg_console_append_to_log( buffer );
+#ifdef VG_GAME
+   SDL_AtomicUnlock( &log_print_sl );
+#endif
+}
+
+VG_STATIC void vg_log_init(void)
+{
+}
+
+#define VG_LOGX( NAME, PIPE, PFX )           \
+VG_STATIC void NAME(const char *fmt, ...)       \
+{                                            \
+   va_list args;                             \
+   va_start( args, fmt );                    \
+   vg_log_write( PIPE, (PFX), fmt, args );   \
+   va_end( args );                           \
+}
+
+VG_LOGX( vg_success, stdout, (KGRN "success" KWHT "| " KGRN) )
+VG_LOGX( vg_info,    stdout, (KNRM "   info" KWHT "| " KNRM) )
+VG_LOGX( vg_warn,    stdout, (KYEL "   warn" KWHT "| " KYEL) )
+VG_LOGX( vg_error,   stderr, (KRED "  error" KWHT "| " KRED) )
+VG_LOGX( vg_low,     stdout, (KWHT "    log" KWHT "| " KWHT) )
+
+#endif /* VG_LOG_H */