提示词:补齐 rtapi_vsnprintf WASM shim
结论:按 LinuxCNC src/rtapi/uspace_common.h 和 src/rtapi/rtapi.h,将 userspace rtapi_vsnprintf 适配为 vsnprintf 包装,并在 WASM runtime probe 覆盖 snprintf、va_list 和截断返回值。 检查:./test-native.sh 通过;./test-linuxcnc-source-link.sh 通过。
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
#include "libnml/nml/stat_msg.hh"
|
||||
|
||||
#include <cmath>
|
||||
#include <cstdarg>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
@@ -16,6 +17,8 @@ extern "C" {
|
||||
extern PyObject *PyInit_interpreter(void);
|
||||
extern PyObject *PyInit_emccanon(void);
|
||||
extern struct _inittab builtin_modules[];
|
||||
extern int rtapi_snprintf(char *buf, unsigned long size, const char *fmt, ...);
|
||||
extern int rtapi_vsnprintf(char *buf, unsigned long size, const char *fmt, va_list ap);
|
||||
}
|
||||
|
||||
// LinuxCNC source basis: src/emc/rs274ngc/rs274ngc_pre.cc provides read(),
|
||||
@@ -155,6 +158,34 @@ bool builtin_modules_match_linuxcnc_preview_runtime() {
|
||||
builtin_modules[2].initfunc == nullptr;
|
||||
}
|
||||
|
||||
int call_rtapi_vsnprintf(char *buffer, unsigned long size, const char *format, ...) {
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
const int result = rtapi_vsnprintf(buffer, size, format, args);
|
||||
va_end(args);
|
||||
return result;
|
||||
}
|
||||
|
||||
bool rtapi_formatting_matches_linuxcnc_userspace() {
|
||||
// LinuxCNC source basis: src/rtapi/uspace_common.h implements both
|
||||
// rtapi_snprintf() and rtapi_vsnprintf() as userspace vsnprintf() wrappers.
|
||||
char formatted[32]{};
|
||||
if (rtapi_snprintf(formatted, sizeof(formatted), "HAL_%s_%d", "probe", 7) != 11 ||
|
||||
std::strcmp(formatted, "HAL_probe_7") != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
char via_va_list[32]{};
|
||||
if (call_rtapi_vsnprintf(via_va_list, sizeof(via_va_list), "%s.%02d", "axis", 3) != 7 ||
|
||||
std::strcmp(via_va_list, "axis.03") != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
char truncated[5]{};
|
||||
return rtapi_snprintf(truncated, sizeof(truncated), "abcdef") == 6 &&
|
||||
std::strcmp(truncated, "abcd") == 0;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
int main() {
|
||||
@@ -176,6 +207,9 @@ int main() {
|
||||
if (!builtin_modules_match_linuxcnc_preview_runtime()) {
|
||||
return 10;
|
||||
}
|
||||
if (!rtapi_formatting_matches_linuxcnc_userspace()) {
|
||||
return 11;
|
||||
}
|
||||
|
||||
std::vector<CncSimEvent> events;
|
||||
CncSimHandle *sim = cnc_sim_create();
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
#include <cstdio>
|
||||
|
||||
// LinuxCNC source basis: src/rtapi/uspace_common.h provides rtapi_snprintf()
|
||||
// for userspace RTAPI formatting; src/rtapi/rtapi.h declares the API.
|
||||
// and rtapi_vsnprintf() for userspace RTAPI formatting; src/rtapi/rtapi.h
|
||||
// declares both APIs.
|
||||
extern "C" int rtapi_snprintf(char *buf, unsigned long size, const char *fmt, ...) {
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
@@ -10,3 +11,7 @@ extern "C" int rtapi_snprintf(char *buf, unsigned long size, const char *fmt, ..
|
||||
va_end(ap);
|
||||
return rc;
|
||||
}
|
||||
|
||||
extern "C" int rtapi_vsnprintf(char *buf, unsigned long size, const char *fmt, va_list ap) {
|
||||
return std::vsnprintf(buf, static_cast<std::size_t>(size), fmt, ap);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user