模拟器迁移 P5:2s 配置轮询 + --cfgtest 无头自检;修复 MSVC rename 覆盖与外科保存截断缺陷
This commit is contained in:
+27
-29
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user