win32 mingw fixes
[laserbrain_demo] / src / logger.cc
1 #include <stdio.h>
2 #include <stdarg.h>
3 #include "logger.h"
4 #include "ui.h"
5
6 #if defined(unix) || defined(__unix__) || defined(__APPLE__)
7 #include <unistd.h>
8 #elif defined(WIN32)
9 #include <windows.h>
10 #endif
11
12 #define UI_MSG_TIMEOUT 4000
13
14 enum { LOG_INFO, LOG_WARNING, LOG_ERROR, LOG_FATAL, LOG_DEBUG };
15
16 static int typecolor(int type);
17
18 static FILE *fp = stdout;
19
20 static void logmsg(int type, const char *fmt, va_list ap)
21 {
22 #if defined(unix) || defined(__unix__) || (defined(__APPLE__) && !defined(TARGET_IPHONE))
23         if(isatty(fileno(fp)) && type != LOG_INFO) {
24                 int c = typecolor(type);
25                 fprintf(fp, "\033[%dm", c);
26                 vfprintf(fp, fmt, ap);
27                 fprintf(fp, "\033[0m");
28         } else
29 #endif
30         {
31                 vfprintf(fp, fmt, ap);
32         }
33         if(type == LOG_ERROR || type == LOG_FATAL || type == LOG_DEBUG) {
34                 fflush(fp);
35         }
36
37 #ifdef WIN32
38         if(type == LOG_FATAL) {
39                 static char msgbuf[1024];
40                 vsnprintf(msgbuf, sizeof msgbuf - 1, fmt, ap);
41                 msgbuf[sizeof msgbuf - 1] = 0;
42                 MessageBox(0, msgbuf, "Fatal error", MB_OK | MB_ICONSTOP);
43         }
44 #endif
45 }
46
47 extern "C" void info_log(const char *fmt, ...)
48 {
49         va_list ap;
50
51         va_start(ap, fmt);
52         logmsg(LOG_INFO, fmt, ap);
53         va_end(ap);
54 }
55
56 extern "C" void warning_log(const char *fmt, ...)
57 {
58         va_list ap;
59
60         va_start(ap, fmt);
61         logmsg(LOG_WARNING, fmt, ap);
62         va_end(ap);
63
64         va_start(ap, fmt);
65         show_messagev(UI_MSG_TIMEOUT, Vec3(1.0, 0.8, 0.1), fmt, ap);
66         va_end(ap);
67 }
68
69 extern "C" void error_log(const char *fmt, ...)
70 {
71         va_list ap;
72
73         va_start(ap, fmt);
74         logmsg(LOG_ERROR, fmt, ap);
75         va_end(ap);
76
77         va_start(ap, fmt);
78         show_messagev(UI_MSG_TIMEOUT, Vec3(1.0, 0.1, 0.1), fmt, ap);
79         va_end(ap);
80 }
81
82 extern "C" void fatal_log(const char *fmt, ...)
83 {
84         va_list ap;
85
86         va_start(ap, fmt);
87         logmsg(LOG_FATAL, fmt, ap);
88         va_end(ap);
89 }
90
91 extern "C" void debug_log(const char *fmt, ...)
92 {
93         va_list ap;
94
95         va_start(ap, fmt);
96         logmsg(LOG_DEBUG, fmt, ap);
97         va_end(ap);
98 }
99
100 enum {
101         BLACK = 0,
102         RED,
103         GREEN,
104         YELLOW,
105         BLUE,
106         MAGENTA,
107         CYAN,
108         WHITE
109 };
110
111 #define ANSI_FGCOLOR(x) (30 + (x))
112 #define ANSI_BGCOLOR(x) (40 + (x))
113
114 static int typecolor(int type)
115 {
116         switch(type) {
117         case LOG_ERROR:
118                 return ANSI_FGCOLOR(RED);
119         case LOG_FATAL:
120                 return ANSI_FGCOLOR(RED);       // TODO differentiate from LOG_ERROR
121         case LOG_WARNING:
122                 return ANSI_FGCOLOR(YELLOW);
123         case LOG_DEBUG:
124                 return ANSI_FGCOLOR(MAGENTA);
125         default:
126                 break;
127         }
128         return 37;
129 }