From d934d213232da4fe608665ea97c0df521a4e07f8 Mon Sep 17 00:00:00 2001 From: LHY0125 <3364451258@qq.com> Date: Thu, 26 Mar 2026 12:47:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=A4=84=E7=90=86=E5=92=8C=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E7=B3=BB=E7=BB=9F=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 safe_string 模块,提供安全的字符串复制、拼接和复制功能 - 添加 logger 模块,支持多级别日志记录和文件输出 - 添加 error_code 模块,定义统一的错误代码枚举 - 添加 layout_config 模块,定义布局配置结构 - 更新 CMakeLists.txt 包含新增的源文件 --- CMakeLists.txt | 2 + include/core/layout_config.h | 19 ++++++ include/utils/error_code.h | 19 ++++++ include/utils/logger.h | 33 +++++++++ include/utils/safe_string.h | 15 +++++ src/utils/logger.c | 126 +++++++++++++++++++++++++++++++++++ src/utils/safe_string.c | 49 ++++++++++++++ 7 files changed, 263 insertions(+) create mode 100644 include/core/layout_config.h create mode 100644 include/utils/error_code.h create mode 100644 include/utils/logger.h create mode 100644 include/utils/safe_string.h create mode 100644 src/utils/logger.c create mode 100644 src/utils/safe_string.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d76343..dbb42a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,8 @@ set(SOURCES src/main.c src/utils/string_ext.c src/utils/os_env.c + src/utils/safe_string.c + src/utils/logger.c src/ui/ui_utils.c src/ui/dialogs.c src/ui/main_window.c diff --git a/include/core/layout_config.h b/include/core/layout_config.h new file mode 100644 index 0000000..3a7df3c --- /dev/null +++ b/include/core/layout_config.h @@ -0,0 +1,19 @@ +#ifndef LAYOUT_CONFIG_H +#define LAYOUT_CONFIG_H + +// 布局配置结构体 +typedef struct { + int vbox_gap; // 垂直布局间距 + int vbox_margin_width; // 垂直布局外边距宽度 + int vbox_margin_height; // 垂直布局外边距高度 + int hbox_gap; // 水平布局间距 + int hbox_margin_width; // 水平布局外边距宽度 + int hbox_margin_height; // 水平布局外边距高度 + int button_width; // 按钮宽度 + int button_height; // 按钮高度 +} LayoutConfig; + +// 默认布局配置 +extern const LayoutConfig DEFAULT_LAYOUT; + +#endif // LAYOUT_CONFIG_H \ No newline at end of file diff --git a/include/utils/error_code.h b/include/utils/error_code.h new file mode 100644 index 0000000..1d0bc79 --- /dev/null +++ b/include/utils/error_code.h @@ -0,0 +1,19 @@ +#ifndef ERROR_CODE_H +#define ERROR_CODE_H + +typedef enum { + ERR_OK = 0, // 成功 + ERR_FAILED = -1, // 失败 + ERR_NULL_PTR = -2, // 空指针 + ERR_OUT_OF_MEMORY = -3, // 内存不足 + ERR_FILE_NOT_FOUND = -4, // 文件不存在 + ERR_PERMISSION_DENIED = -5, // 权限拒绝 + ERR_INVALID_FORMAT = -6, // 无效格式 + ERR_REGISTRY_FAILED = -7, // 注册表操作失败 + ERR_NOT_FOUND = -8, // 未找到 + ERR_EXISTS = -9 // 已存在 +} ErrorCode; + +const char* error_code_to_string(ErrorCode code); + +#endif // ERROR_CODE_H diff --git a/include/utils/logger.h b/include/utils/logger.h new file mode 100644 index 0000000..9246bd1 --- /dev/null +++ b/include/utils/logger.h @@ -0,0 +1,33 @@ +#ifndef LOGGER_H +#define LOGGER_H + +// 日志级别 +typedef enum { + LOG_LEVEL_DEBUG, // 调试日志级别 + LOG_LEVEL_INFO, // 信息日志级别 + LOG_LEVEL_WARN, // 警告日志级别 + LOG_LEVEL_ERROR // 错误日志级别 +} LogLevel; + +// 初始化日志系统 +void log_init(const char *log_file, LogLevel level); + +// 销毁日志系统 +void log_destroy(void); + +// 日志函数 +void log_debug(const char *fmt, ...); + +// 信息日志函数 +void log_info(const char *fmt, ...); + +// 警告日志函数 +void log_warn(const char *fmt, ...); + +// 错误日志函数 +void log_error(const char *fmt, ...); + +// 设置日志级别 +void log_set_level(LogLevel level); + +#endif // LOGGER_H \ No newline at end of file diff --git a/include/utils/safe_string.h b/include/utils/safe_string.h new file mode 100644 index 0000000..3e204b0 --- /dev/null +++ b/include/utils/safe_string.h @@ -0,0 +1,15 @@ +#ifndef SAFE_STRING_H +#define SAFE_STRING_H + +#include + +// 安全字符串操作函数 +char* safe_strcpy(char *dst, size_t dst_size, const char *src); + +// 安全字符串拼接函数 +char* safe_strcat(char *dst, size_t dst_size, const char *src); + +// 安全字符串复制函数 +char* safe_strdup(const char *src); + +#endif // SAFE_STRING_H diff --git a/src/utils/logger.c b/src/utils/logger.c new file mode 100644 index 0000000..96a9f0b --- /dev/null +++ b/src/utils/logger.c @@ -0,0 +1,126 @@ +#include "utils/logger.h" +#include +#include +#include +#include +#include + +// 全局日志文件指针 +static FILE *G_log_file = NULL; +// 全局日志级别 +static LogLevel G_log_level = LOG_LEVEL_INFO; + +// 将日志级别转换为字符串 +static const char *level_to_string(LogLevel level) +{ + switch (level) + { + case LOG_LEVEL_DEBUG: + return "DEBUG"; + case LOG_LEVEL_INFO: + return "INFO "; + case LOG_LEVEL_WARN: + return "WARN "; + case LOG_LEVEL_ERROR: + return "ERROR"; + default: + return "UNKN "; + } +} + +// 获取当前时间戳 +static void get_timestamp(char *buffer, size_t size) +{ + time_t now = time(NULL); + struct tm *tm_info = localtime(&now); + strftime(buffer, size, "%Y-%m-%d %H:%M:%S", tm_info); +} + +// 写入日志 +static void log_write(LogLevel level, const char *fmt, va_list args) +{ + if (level < G_log_level) + return; + + char timestamp[64]; + get_timestamp(timestamp, sizeof(timestamp)); + + char message[1024]; + vsnprintf(message, sizeof(message), fmt, args); + + const char *level_str = level_to_string(level); + + if (G_log_file) + { + fprintf(G_log_file, "[%s] [%s] %s\n", timestamp, level_str, message); + fflush(G_log_file); + } + + fprintf(stdout, "[%s] [%s] %s\n", timestamp, level_str, message); +} + +// 初始化日志系统 +void log_init(const char *log_file, LogLevel level) +{ + if (log_file) + { + G_log_file = fopen(log_file, "a"); + if (!G_log_file) + { + fprintf(stderr, "Failed to open log file: %s\n", log_file); + } + } + G_log_level = level; +} + +// 销毁日志系统 +void log_destroy(void) +{ + if (G_log_file) + { + fclose(G_log_file); + G_log_file = NULL; + } +} + +// 设置日志级别 +void log_set_level(LogLevel level) +{ + G_log_level = level; +} + +// 调试日志 +void log_debug(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + log_write(LOG_LEVEL_DEBUG, fmt, args); + va_end(args); +} + +// 信息日志 +void log_info(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + log_write(LOG_LEVEL_INFO, fmt, args); + va_end(args); +} + +// 警告日志 +void log_warn(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + log_write(LOG_LEVEL_WARN, fmt, args); + va_end(args); +} + +// 错误日志 +void log_error(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + log_write(LOG_LEVEL_ERROR, fmt, args); + va_end(args); +} \ No newline at end of file diff --git a/src/utils/safe_string.c b/src/utils/safe_string.c new file mode 100644 index 0000000..a983de4 --- /dev/null +++ b/src/utils/safe_string.c @@ -0,0 +1,49 @@ +#include "utils/safe_string.h" +#include +#include + +// 安全字符串复制 +char *safe_strcpy(char *dst, size_t dst_size, const char *src) +{ + if (!dst || !src || dst_size == 0) + return NULL; + + size_t len = strlen(src); + if (len >= dst_size) + { + memcpy(dst, src, dst_size - 1); + dst[dst_size - 1] = '\0'; + } + else + { + strcpy(dst, src); + } + return dst; +} + +// 安全字符串拼接 +char *safe_strcat(char *dst, size_t dst_size, const char *src) +{ + if (!dst || !src || dst_size == 0) + return NULL; + + size_t dst_len = strlen(dst); + if (dst_len >= dst_size) + return NULL; + + return safe_strcpy(dst + dst_len, dst_size - dst_len, src); +} + +// 安全字符串复制(返回新分配的内存) +char *safe_strdup(const char *src) +{ + if (!src) + return NULL; + + size_t len = strlen(src); + char *result = (char *)malloc(len + 1); + if (result) + strcpy(result, src); + + return result; +} \ No newline at end of file