93/93 regression tests pass (+ffi-06-callback).
Mirrors the `app->onInputEvent` install pattern from
library/modules/platform/android.sx:
1. (s32) -> s32 — single primitive arg/return
2. (*void, s32) -> s32 — opaque ctx pointer + value
(the onInputEvent shape)
Side effects via two file-level globals so the test observes both
the return value AND state mutation across multiple calls:
- g_callback_hits = N proves the callback fired N times.
- g_callback_sum = sum of args proves each individual call landed
with the correct value.
The ctx-pointer variant casts `*void` back to `*s32` inside the
callback and reads through it (`p.*`), proving the pointer survives
the round-trip with no aliasing weirdness.
14 lines
663 B
C
14 lines
663 B
C
// C-to-sx callback FFI baseline. C takes a function pointer + a value,
|
|
// invokes the callback with the value, and returns whatever the callback
|
|
// returned. Mirrors the `app->onInputEvent` pattern in
|
|
// library/modules/platform/android.sx where sx installs a handler that
|
|
// native_app_glue invokes from its input-event loop.
|
|
|
|
int ffi_apply_callback(int (*cb)(int), int value);
|
|
|
|
// Two-arg variant — the actual chess-on-Android shape:
|
|
// the callback receives a pointer + a value (mirrors
|
|
// onInputEvent(app, event) where both are opaque pointers from
|
|
// the C caller's point of view).
|
|
int ffi_apply_callback2(int (*cb)(void *ctx, int v), void *ctx, int v);
|