按源验证API百分号文件模式

源依据:LinuxCNC src/emc/rs274ngc/rs274ngc_pre.cc 的 Interp::open() 在首个非空行是 % 时启用 percent-file mode,src/emc/rs274ngc/interp_read.cc read_text() 在匹配 % 处结束读取并忽略后续文本。

结论:native API source-linked smoke 增加 CNC_SIM_RS274_FILE_MODE 下的百分号文件断言,确认 cnc_sim API 文件模式走 LinuxCNC open/read 语义而非逐行桥接或 smoke fallback。

检查:./test-linuxcnc-api-native.sh;./test-native.sh;./test-linuxcnc-source-link.sh。
This commit is contained in:
cnc
2026-06-06 13:10:02 +08:00
parent c75eec1057
commit c81f9d0111

View File

@@ -303,6 +303,45 @@ int main() {
}
}
{
std::vector<CncSimEvent> percent_events;
CncSimHandle *percent_sim = cnc_sim_create();
cnc_sim_set_event_callback(percent_sim, collect_event, &percent_events);
ScopedEnv file_mode_env("CNC_SIM_RS274_FILE_MODE", "1");
const char percent_program[] =
"%\n"
"G21 G90\n"
"F100\n"
"G1 X1\n"
"%\n"
"G1 X99\n";
bool percent_ok = true;
percent_ok &= expect(cnc_sim_parse_program(percent_sim,
percent_program,
sizeof(percent_program) - 1) == 0,
cnc_sim_last_error(percent_sim));
std::vector<int> feed_lines;
std::vector<double> feed_x;
for (const auto &event : percent_events) {
if (event.type == CNC_SIM_EVENT_LINEAR_FEED) {
feed_lines.push_back(event.line);
feed_x.push_back(event.end.x);
}
}
// LinuxCNC source basis: rs274ngc_pre.cc open() enables percent-file
// mode when the first nonblank line is '%'; interp_read.cc read_text()
// stops at the matching '%', so later program text is ignored.
percent_ok &= expect(feed_lines.size() == 1 &&
feed_lines[0] == 4 &&
feed_x.size() == 1 &&
near(feed_x[0], 1.0),
"expected LinuxCNC percent-file mode to ignore trailing text");
cnc_sim_destroy(percent_sim);
if (!percent_ok) {
return 1;
}
}
const char config[] =
"{\"backend\":\"linuxcnc-rs274\",\"rtcp\":{\"enabled\":true,\"toolLength\":100,\"toolLengths\":{\"7\":125}}}";
const char program[] =