NewLang Project
Yet another programm language
Loading...
Searching...
No Matches
logger.cpp
Go to the documentation of this file.
1#include "logger.h"
2
3#include <stdarg.h>
4#include <string.h>
5#include <linux/limits.h>
6
7using namespace newlang;
8
9Logger * Logger::m_instance = nullptr;
10
12 switch (level) {
14 return "DEFAULT";
15 case LOG_LEVEL_DUMP:
16 return "DUMP";
17 case LOG_LEVEL_DEBUG:
18 return "DEBUG";
19 case LOG_LEVEL_INFO:
20 return "INFO";
22 return "WARNING";
23 case LOG_LEVEL_ERROR:
24 return "ERROR";
25 case LOG_LEVEL_FAULT:
26 return "FAULT";
27 case LOG_LEVEL_ABORT:
28 return "ABORT";
29 }
30 return "Unknown";
31}
32
33std::string Logger::log_printf(uint8_t level, const char *prefix, const char *file, int line, const char *format, ...) {
34
35 if (Logger::Instance()->GetLogLevel() < level) {
36 return "";
37 }
38
39 std::string result;
40 if (prefix) {
41 result += prefix;
42 // snprintf(buffer, LOG_MAX_BUFFER_SIZE, "%s", prefix);
43 // result = Logger::Instance()->AddString(level, buffer, false);
44 }
45
46 // if (level == LOG_LEVEL_ABORT) {
47 // // Time::TimeToString(Time::GetTime(), buffer, LOG_MAX_BUFFER_SIZE);
48 // // Time::DateTime tmp;
49 // // snprintf(buffer, LOG_MAX_BUFFER_SIZE, " %02d:%02d:%02d %02d/%02d/%04d ",
50 // // tmp.tm_hour, tmp.tm_min, tmp.tm_sec, tmp.tm_mday, tmp.tm_mon + 1, tmp.tm_year + 1900);
51 // const char * tmp = Logger::Instance()->AddString(level, buffer, false);
52 // if (!result) {
53 // result = tmp;
54 // }
55 // }
56
57
58 static char buffer[4096 + PATH_MAX];
59 char *ptr = nullptr;
60 size_t printf_size;
61
62 {
63 va_list args;
64 va_start(args, format);
65 printf_size = vsnprintf(nullptr, 0, format, args) + PATH_MAX;
66 va_end(args);
67 }
68
69
70 if (printf_size > sizeof (buffer)) {
71 ptr = new char[printf_size + PATH_MAX + 1];
72 printf_size += (PATH_MAX + 1);
73 } else {
74 ptr = &buffer[0];
75 printf_size = sizeof (buffer);
76 }
77
78 {
79 va_list args;
80 va_start(args, format);
81 VERIFY(vsnprintf(ptr, printf_size, format, args) >= 0);
82 va_end(args);
83 }
84
85 size_t size = strlen(ptr);
86 bool nl = true;
87 if (size >= 2) {
88 // После сообщения заканчивающегося на \r\r не ставить перевод строки
89 if (ptr[size - 2] == '\r' && ptr[size - 1] == '\r') {
90 nl = false;
91 ptr[size - 2] = '\0';
92 }
93 }
94
95 result += ptr;
96
97 if (file && (level != LOG_LEVEL_INFO || Logger::Instance()->GetLogLevel() >= LOG_LEVEL_DUMP)) {
98 const char * file_name = strrchr(file, '/');
99 snprintf(ptr, printf_size, " (%s:%d)%s", ((file_name && *file_name == '/') ? file_name + 1 : file), line, nl ? "\n" : "");
100
101 } else {
102 snprintf(ptr, printf_size, "%s", nl ? "\n" : "");
103 }
104 result += ptr;
105
106 if (ptr != &buffer[0]) {
107 delete[] ptr;
108 }
109
110 if (Logger::Instance()->m_func != nullptr) {
111 (*Logger::Instance()->m_func)(Logger::Instance()->m_func_param, level, result.c_str(), true);
112 }
113
114 return result;
115}
116
117uint8_t HexToByte(const char c) {
118 if (c >= '0' && c <= '9') {
119 return c - 0x30;
120 }
121 if (c >= 'a' && c <= 'f') {
122 return c - 0x61 + 10;
123 }
124 if (c >= 'A' && c <= 'F') {
125 return c - 0x41 + 10;
126 }
127 LOG_RUNTIME("the symbol '%c' is not a hex digit!", c);
128}
129
130size_t HexToBin(const char * str, uint8_t * buf, const size_t size) {
131 ASSERT(str);
132 ASSERT(buf);
133 ASSERT((strlen(str) % 2) == 0);
134
135 memset(buf, 0, size);
136
137 size_t pos = 0;
138 size_t count = std::min(strlen(str), size * 2);
139
140 while (pos < count) {
141 buf[pos / 2] = (uint8_t) ((HexToByte(str[pos]) << 4) | (HexToByte(str[pos + 1])));
142 pos += 2;
143 }
144 return pos / 2;
145}
146
147int HexToBinEq(const char * str, const uint8_t * buf, size_t size) {
148 ASSERT(str);
149 ASSERT(buf);
150 ASSERT(strlen(str) % 2 == 0);
151
152 size_t len = strlen(str);
153 if (len / 2 != size) {
154 return 0;
155 }
156 for (size_t pos = 0; pos < len; pos += 2) {
157 uint8_t byte = (uint8_t) ((HexToByte(str[pos]) << 4) | (HexToByte(str[pos + 1])));
158
159 if (byte != buf[pos / 2]) {
160 return false;
161 }
162 }
163 return 1;
164}
165
166static const char bin_to_hex_chars[] = "0123456789ABCDEF";
167
168std::string BinToHex(const uint8_t * buf, const size_t size) {
169 std::string result;
170 result.resize(size * 2);
171 // const char hex[] = "0123456789ABCDEF";
172 for (size_t i = 0; i < size; i++) {
173 result[i * 2] = bin_to_hex_chars[buf[i] >> 4];
174 result[i * 2 + 1] = bin_to_hex_chars[buf[i] & 0xf];
175 }
176 return result;
177}
178
179std::string HexStrToBinStr(std::string & hex_str) {
180 std::string result;
181 for (size_t pos = 0; pos < hex_str.size(); pos++) {
182 if (pos != 0) {
183 result.append(" ");
184 }
185 switch (hex_str[pos]) {
186 case '0':
187 result.append("0000");
188 break;
189 case '1':
190 result.append("0001");
191 break;
192 case '2':
193 result.append("0010");
194 break;
195 case '3':
196 result.append("0011");
197 break;
198 case '4':
199 result.append("0100");
200 break;
201 case '5':
202 result.append("0101");
203 break;
204 case '6':
205 result.append("0110");
206 break;
207 case '7':
208 result.append("0111");
209 break;
210 case '8':
211 result.append("1000");
212 break;
213 case '9':
214 result.append("1001");
215 break;
216 case 'a':
217 case 'A':
218 result.append("1010");
219 break;
220 case 'b':
221 case 'B':
222 result.append("1011");
223 break;
224 case 'c':
225 case 'C':
226 result.append("1100");
227 break;
228 case 'd':
229 case 'D':
230 result.append("1101");
231 break;
232 case 'e':
233 case 'E':
234 result.append("1110");
235 break;
236 case 'f':
237 case 'F':
238 result.append("1111");
239 break;
240 default:
241 result.append("????");
242 LOG_ERROR("Non hex symbol %c", hex_str[pos]);
243 break;
244 }
245 }
246 return result;
247}
248
249size_t BinToHexBuffer(const uint8_t * buf, const size_t size, char * str, const size_t str_size) {
250 ASSERT(buf);
251 ASSERT(str);
252 if (!str || !buf || !size || !str_size) {
253 return 0;
254 }
255 size_t max_size = std::min(size * 2, str_size - 1);
256 for (size_t i = 0; i < size && (i * 2 < max_size); i++) {
257 str[i * 2] = bin_to_hex_chars[buf[i] >> 4];
258 str[i * 2 + 1] = bin_to_hex_chars[buf[i] & 0xf];
259 }
260 str[max_size] = '\0';
261 return max_size;
262}
263
265 return "";
266}
267/*
268std::string Logger::GetStackTrace() {
269 std::string result("\n");
270 llvm::raw_string_ostream stack(result);
271 llvm::sys::PrintStackTrace(stack, 1);
272 return result;
273}
274*/
static Logger * m_instance
Definition logger.h:397
FuncCallback * m_func
Definition logger.h:399
static std::string log_printf(uint8_t level, char const *prefix, char const *file, int line, char const *format,...)
Definition logger.cpp:33
uint8_t LogLevelType
Definition logger.h:319
LogLevelType GetLogLevel()
Definition logger.h:322
static std::string GetStackTrace()
Definition jit.cpp:2789
static const char * GetLogLevelDesc(LogLevelType level)
Definition logger.cpp:11
static Logger * Instance()
Definition logger.h:377
void * m_func_param
Definition logger.h:400
int result
Definition lexer.l:367
static const char bin_to_hex_chars[]
Definition logger.cpp:166
__attribute__((weak)) std
Definition logger.cpp:264
size_t HexToBin(const char *str, uint8_t *buf, const size_t size)
Definition logger.cpp:130
size_t BinToHexBuffer(const uint8_t *buf, const size_t size, char *str, const size_t str_size)
Definition logger.cpp:249
std::string HexStrToBinStr(std::string &hex_str)
Definition logger.cpp:179
std::string BinToHex(const uint8_t *buf, const size_t size)
Definition logger.cpp:168
uint8_t HexToByte(const char c)
Definition logger.cpp:117
int HexToBinEq(const char *str, const uint8_t *buf, size_t size)
Definition logger.cpp:147
#define LOG_LEVEL_ABORT
Definition logger.h:91
#define LOG_RUNTIME(format,...)
Definition logger.h:26
#define LOG_LEVEL_DEBUG
Definition logger.h:86
#define LOG_LEVEL_INFO
Definition logger.h:87
#define LOG_LEVEL_DEFAULT
Definition logger.h:83
#define VERIFY(exp)
Definition logger.h:65
#define LOG_LEVEL_ERROR
Definition logger.h:89
#define LOG_LEVEL_FAULT
Definition logger.h:90
#define ASSERT(condition)
Definition logger.h:60
#define LOG_ERROR(...)
Definition logger.h:122
#define LOG_LEVEL_DUMP
Definition logger.h:85
#define LOG_LEVEL_WARNING
Definition logger.h:88
Definition nlc.h:59