refactor: 重构前端代码并添加日志功能
- 重命名和重构了多个文件,包括 lexer、parser 和 AST 相关代码 - 添加了日志功能,使用 LOG_* 宏替代原有的 error 和 warn 函数 - 优化了错误处理和内存分配方式 - 调整了代码结构,提高了模块化和可读性
This commit is contained in:
33
lib/rt/log/color.h
Normal file
33
lib/rt/log/color.h
Normal file
@ -0,0 +1,33 @@
|
||||
#ifndef __SMCC_TERMINAL_COLOR_H__
|
||||
#define __SMCC_TERMINAL_COLOR_H__
|
||||
|
||||
#define ANSI_FG_BLACK "\33[30m"
|
||||
#define ANSI_FG_RED "\33[31m"
|
||||
#define ANSI_FG_GREEN "\33[32m"
|
||||
#define ANSI_FG_YELLOW "\33[33m"
|
||||
#define ANSI_FG_BLUE "\33[34m"
|
||||
#define ANSI_FG_MAGENTA "\33[35m"
|
||||
#define ANSI_FG_CYAN "\33[36m"
|
||||
#define ANSI_FG_WHITE "\33[37m"
|
||||
|
||||
#define ANSI_BG_BLACK "\33[40m"
|
||||
#define ANSI_BG_RED "\33[41m"
|
||||
#define ANSI_BG_GREEN "\33[42m"
|
||||
#define ANSI_BG_YELLOW "\33[43m"
|
||||
#define ANSI_BG_BLUE "\33[44m"
|
||||
#define ANSI_BG_MAGENTA "\33[35m"
|
||||
#define ANSI_BG_CYAN "\33[46m"
|
||||
#define ANSI_BG_WHITE "\33[47m"
|
||||
|
||||
#define ANSI_UNDERLINED "\33[4m"
|
||||
#define ANSI_BOLD "\33[1m"
|
||||
#define ANSI_NONE "\33[0m"
|
||||
|
||||
// Maybe Some Terminal Doesn't Support Color
|
||||
#ifndef ANSI_FMT_DISABLE
|
||||
#define ANSI_FMT(str, fmt) fmt str ANSI_NONE
|
||||
#else
|
||||
#define ANSI_FMT(str, fmt) str
|
||||
#endif
|
||||
|
||||
#endif
|
65
lib/rt/log/log.c
Normal file
65
lib/rt/log/log.c
Normal file
@ -0,0 +1,65 @@
|
||||
#include "log.h"
|
||||
|
||||
typedef void (*log_handler)(
|
||||
log_level_t level,
|
||||
const char* module,
|
||||
const char* file,
|
||||
int line,
|
||||
const char* message
|
||||
);
|
||||
|
||||
static void default_handler(log_level_t level, const char* module, const char* file, int line, const char* message) {
|
||||
if (!rt_stderr) return;
|
||||
const char* level_str;
|
||||
switch (level) {
|
||||
case LOG_LEVEL_DEBUG: level_str = "DEBUG"; break;
|
||||
case LOG_LEVEL_INFO: level_str = "INFO "; break;
|
||||
case LOG_LEVEL_WARN: level_str = "WARN "; break;
|
||||
case LOG_LEVEL_ERROR: level_str = "ERROR"; break;
|
||||
case LOG_LEVEL_FATAL: level_str = "FATAL"; break;
|
||||
case LOG_LEVEL_TRACE: level_str = "TRACE"; break;
|
||||
default: level_str = "NOTSET"; break;
|
||||
}
|
||||
|
||||
#ifndef __LOG_NO_COLOR__
|
||||
const char* color_code = ANSI_NONE;
|
||||
switch (level) {
|
||||
case LOG_LEVEL_DEBUG: color_code = ANSI_FG_CYAN; break;
|
||||
case LOG_LEVEL_INFO: color_code = ANSI_FG_GREEN; break;
|
||||
case LOG_LEVEL_TRACE: color_code = ANSI_FG_BLUE; break;
|
||||
case LOG_LEVEL_WARN: color_code = ANSI_FG_YELLOW; break;
|
||||
case LOG_LEVEL_ERROR: color_code = ANSI_FG_RED; break;
|
||||
case LOG_LEVEL_FATAL: color_code = ANSI_FG_RED ANSI_UNDERLINED; break; // 增强对比度
|
||||
default: color_code = ANSI_NONE;
|
||||
}
|
||||
|
||||
rt.fprintf(rt_stderr, ANSI_BOLD "%s[%s] - %s - %s:%d | %s" ANSI_NONE "\n", color_code,
|
||||
level_str, module, file, line, message);
|
||||
#else
|
||||
rt.fprintf(rt_stderr, "[%s] %s:%d | %s: %s\n",
|
||||
level_str, file, line, module, message);
|
||||
#endif
|
||||
if (level & LOG_LEVEL_FATAL) {
|
||||
rt.exit(-LOG_LEVEL_FATAL);
|
||||
}
|
||||
}
|
||||
|
||||
static logger_t root_logger = {
|
||||
.name = "root",
|
||||
.level = LOG_LEVEL_ALL,
|
||||
.handler = default_handler,
|
||||
};
|
||||
|
||||
logger_t* log_get(const char* name) {
|
||||
return &root_logger;
|
||||
}
|
||||
|
||||
void log_set_level(logger_t* logger, log_level_t level) {
|
||||
if (logger) logger->level = level;
|
||||
else root_logger.level = level;
|
||||
}
|
||||
|
||||
void log_set_handler(logger_t* logger, log_handler handler) {
|
||||
if (logger) logger->handler = handler;
|
||||
else root_logger.handler = handler;
|
||||
}
|
75
lib/rt/log/log.h
Normal file
75
lib/rt/log/log.h
Normal file
@ -0,0 +1,75 @@
|
||||
#ifndef __SMCC_LOG_H__
|
||||
#define __SMCC_LOG_H__
|
||||
|
||||
#include "../std/rt_api_def.h"
|
||||
#include "color.h"
|
||||
|
||||
typedef enum log_level {
|
||||
LOG_LEVEL_NOTSET = 0,
|
||||
LOG_LEVEL_DEBUG = 1 << 0,
|
||||
LOG_LEVEL_INFO = 1 << 1,
|
||||
LOG_LEVEL_WARN = 1 << 2,
|
||||
LOG_LEVEL_ERROR = 1 << 3,
|
||||
LOG_LEVEL_FATAL = 1 << 4,
|
||||
|
||||
LOG_LEVEL_TRACE = 1 << 5,
|
||||
LOG_LEVEL_ALL = 0xFF,
|
||||
} log_level_t;
|
||||
|
||||
typedef void (*log_handler)(
|
||||
log_level_t level,
|
||||
const char* module,
|
||||
const char* file,
|
||||
int line,
|
||||
const char* message
|
||||
);
|
||||
|
||||
#ifndef LOGGER_MAX_BUF_SIZE
|
||||
#define LOGGER_MAX_BUF_SIZE 256
|
||||
#endif
|
||||
|
||||
typedef struct logger {
|
||||
const char* name;
|
||||
log_level_t level;
|
||||
log_handler handler;
|
||||
char buf[LOGGER_MAX_BUF_SIZE];
|
||||
} logger_t;
|
||||
|
||||
logger_t* log_get(const char* name);
|
||||
void log_set_level(logger_t* logger, log_level_t level);
|
||||
void log_set_handler(logger_t* logger, log_handler handler);
|
||||
|
||||
#ifndef LOG_MAX_MAROC_BUF_SIZE
|
||||
#define LOG_MAX_MAROC_BUF_SIZE LOGGER_MAX_BUF_SIZE
|
||||
#endif
|
||||
#define _LOG(_level_, _msg_, ...) \
|
||||
do { \
|
||||
logger_t* _logger = log_get(NULL); \
|
||||
if (_logger && _logger->handler && (_logger->level & (_level_))) { \
|
||||
rt.snprintf(_logger->buf, sizeof(_logger->buf), (_msg_), ##__VA_ARGS__); \
|
||||
_logger->handler((_level_), _logger->name, __FILE__, __LINE__, _logger->buf); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define LOG_NOTSET(...) _LOG(LOG_LEVEL_NOTSET, __VA_ARGS__)
|
||||
#define LOG_DEBUG(...) _LOG(LOG_LEVEL_DEBUG, __VA_ARGS__)
|
||||
#define LOG_INFO(...) _LOG(LOG_LEVEL_INFO, __VA_ARGS__)
|
||||
#define LOG_WARN(...) _LOG(LOG_LEVEL_WARN, __VA_ARGS__)
|
||||
#define LOG_ERROR(...) _LOG(LOG_LEVEL_ERROR, __VA_ARGS__)
|
||||
#define LOG_FATAL(...) _LOG(LOG_LEVEL_FATAL, __VA_ARGS__)
|
||||
#define LOG_TRACE(...) _LOG(LOG_LEVEL_TRACE, __VA_ARGS__)
|
||||
|
||||
|
||||
#define _Assert(cond, ...) \
|
||||
do { \
|
||||
if (!(cond)) { \
|
||||
LOG_FATAL(__VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
#define AssertFmt(cond, format, ...) _Assert(cond, "Assertion Failure: " format, ## __VA_ARGS__)
|
||||
#define PanicFmt(format, ...) _Assert(0, "Panic: " format, ## __VA_ARGS__)
|
||||
#define Assert(cond) AssertFmt(cond, "cond is `" SMCC_STR(cond) "`")
|
||||
#define Panic(...) PanicFmt(__VA_ARGS__)
|
||||
#define TODO() PanicFmt("TODO please implement me")
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user