模拟器迁移 P5:2s 配置轮询 + --cfgtest 无头自检;修复 MSVC rename 覆盖与外科保存截断缺陷

This commit is contained in:
2026-09-14 09:33:32 +08:00
parent 97661415ca
commit bc4a7da8a0
6 changed files with 151 additions and 32 deletions
+27 -29
View File
@@ -105,8 +105,8 @@ static int s_str_ci_eq(const char *p_a, const char *p_b) {
* 入口参数:p_p - 当前位置指针(入/出) char **
* 返回值:行首指针 char *
* 限定条件:*p_p 指向可写缓冲内
* 函数说明:行界定 = '\n'(缺失时到 NUL);会修改缓冲(行末字节),
* 保存路径 Pass 1 后须经 s_restore_newlines 复原
* 函数说明:行界定 = '\n'(缺失时到 NUL);会修改缓冲(行末字节,
* 含 CRLF 的 '\r'),保存路径 Pass 1 须用一次性副本
*/
static char *s_split_line(char **p_p) {
char *p_line = *p_p;
@@ -136,22 +136,6 @@ static char *s_split_line(char **p_p) {
return p_line;
}
/*
* 函数功能:复原行末换行符(s_split_line 的逆操作,供保存 Pass 2 复用缓冲)
* 入口参数:p_buf - 行末已 NUL 化的缓冲 char *
* 返回值:无
* 限定条件:p_buf 非空
*/
static void s_restore_newlines(char *p_buf) {
char *p = p_buf;
while (*p != '\0') {
size_t l = strlen(p);
p[l] = '\n';
p = p + l + 1u;
}
}
/*
* 函数功能:识别段名行(非修改式)
* 入口参数:p_line - 行文本 const char *
@@ -802,7 +786,7 @@ static int s_surgical(char *p_in, size_t in_len, char *p_out, size_t out_cap, si
* 函数功能:保存 Pass 1——定位段头行号与各受管键行号
* 入口参数:p_in - 原文本(可修改) char *
* 返回值:无
* 限定条件:完成后须调 s_restore_newlines 复原行末
* 限定条件:行末被 NUL 化且不复原——调用方须传一次性副本
*/
static void s_surgical_pass1(char *p_in) {
char *p = p_in;
@@ -861,8 +845,6 @@ static void s_surgical_pass1(char *p_in) {
}
line_no++;
}
s_restore_newlines(p_in);
}
/*
@@ -1039,23 +1021,39 @@ int cfg_file_save(void) {
/* 外科手术式保存:保留注释/未知段/未知键 */
{
uint8_t *p_in = NULL;
char *p_out = (char *)malloc(CFG_OUT_MAX);
uint8_t *p_in = NULL; /* 加载原文(pristine,供 Pass 2 重切分) */
uint8_t *p_in1 = NULL; /* Pass 1 专用副本(s_split_line 破坏性 NUL 化后丢弃) */
char *p_out = NULL;
size_t in_len = 0u;
size_t out_len = 0u;
int r;
if (p_out == NULL) {
DBG_ERROR("save: malloc %uB FAIL", (unsigned)CFG_OUT_MAX);
return -1;
}
if (s_load_file(&p_in, &in_len) != 0) {
free(p_out);
DBG_ERROR("save: file read FAIL");
return -1;
}
s_surgical_pass1((char *)p_in);
/* Pass 1 在独立副本上切分(避免破坏原文的行结束符);
* 副本在 p_out 分配前释放,堆峰值维持 p_in + p_out(约 9KB) */
p_in1 = (uint8_t *)malloc(in_len + 1u);
if (p_in1 == NULL) {
free(p_in);
DBG_ERROR("save: malloc %uB FAIL", (unsigned)(in_len + 1u));
return -1;
}
(void)memcpy(p_in1, p_in, in_len + 1u);
s_surgical_pass1((char *)p_in1);
free(p_in1);
p_out = (char *)malloc(CFG_OUT_MAX);
if (p_out == NULL) {
free(p_in);
DBG_ERROR("save: malloc %uB FAIL", (unsigned)CFG_OUT_MAX);
return -1;
}
r = s_surgical((char *)p_in, in_len, p_out, CFG_OUT_MAX, &out_len);
free(p_in);