-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConsole.cpp
executable file
·125 lines (110 loc) · 3.27 KB
/
Console.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// you probably dont want to modify this file
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include "Console.h"
#ifdef _WIN32
#include <windows.h>
// disable useless warnings
#pragma warning(disable:4996)
#endif
static char __internal_console_buffer__[8192] = {'\0'};
#define TEXT_NORMAL "\033[0m"
#define TEXT_RED "\033[1;31m"
#define TEXT_GREEN "\033[1;32m"
#define TEXT_PINK "\033[1;35m"
#ifdef _WIN32
static void cprintf(const char *s) {
unsigned short attr = 0;
int code = 0, state = 0;
while (*s) {
char ch = *s++;
if (ch == 27)
state = 1;
else if (state == 1) {
if (ch == '[') {
state = 2;
code = 0;
}
else
state = 0;
}
else if (state == 2) {
if (ch == ';' || ch == 'm') { // finished with this one
fflush(stdout);
switch (code) {
case 0: attr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
case 1: attr |= FOREGROUND_INTENSITY; break;
case 3: attr |= COMMON_LVB_UNDERSCORE; break;
case 7: attr |= COMMON_LVB_REVERSE_VIDEO; break;
case 31: attr |= FOREGROUND_RED; break;
case 32: attr |= FOREGROUND_GREEN; break;
case 33: attr |= FOREGROUND_RED | FOREGROUND_GREEN; break;
case 34: attr |= FOREGROUND_BLUE | FOREGROUND_INTENSITY; break;
case 35: attr |= FOREGROUND_RED | FOREGROUND_BLUE; break;
case 36: attr |= FOREGROUND_GREEN | FOREGROUND_BLUE; break;
case 37: attr |= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
case 38: attr |= FOREGROUND_BLUE | FOREGROUND_BLUE; break;
case 41: attr |= BACKGROUND_INTENSITY | BACKGROUND_RED; break;
case 42: attr |= BACKGROUND_INTENSITY | BACKGROUND_GREEN; break;
case 43: attr |= BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN; break;
case 44: attr |= BACKGROUND_INTENSITY | BACKGROUND_BLUE; break;
case 45: attr |= BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_BLUE; break;
case 46: attr |= BACKGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_BLUE; break;
case 47: attr |= BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE; break;
}
code = 0;
if (ch == 'm') {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),attr);
state = 0;
}
}
else
code = (code * 10) + (ch - '0'); // leading digit
} else {
putchar(ch);
attr = 0;
}
}
}
#else
#define cprintf printf
#define _vsnprintf vsnprintf
#endif
void warning(const char *fmt,...)
{
va_list msg;
va_start (msg, fmt);
_vsnprintf(__internal_console_buffer__, 8191, fmt, msg);
va_end (msg);
cprintf(TEXT_PINK"warning: "TEXT_NORMAL);
cprintf(__internal_console_buffer__);
}
void error(const char *fmt,...)
{
va_list msg;
va_start (msg, fmt);
_vsnprintf(__internal_console_buffer__, 8191, fmt, msg);
va_end (msg);
cprintf(TEXT_RED"error: "TEXT_NORMAL);
cprintf(__internal_console_buffer__);
}
void debug(const char *fmt,...)
{
va_list msg;
va_start (msg, fmt);
_vsnprintf(__internal_console_buffer__, 8191, fmt, msg);
va_end (msg);
cprintf(TEXT_GREEN"debug: "TEXT_NORMAL);
cprintf(__internal_console_buffer__);
}
void fatal(const char *fmt,...)
{
va_list msg;
va_start (msg, fmt);
_vsnprintf(__internal_console_buffer__, 8191, fmt, msg);
va_end (msg);
cprintf(TEXT_RED"fatal error: "TEXT_NORMAL);
cprintf(__internal_console_buffer__);
exit(-1);
}