luaur_repl_cli/functions/sigint_handler_repl_alt_b.rs
1use core::ffi::c_int;
2use core::sync::atomic::Ordering;
3
4use luaur_vm::functions::lua_callbacks::lua_callbacks;
5
6use crate::functions::sigint_callback::{sigint_callback, REPL_STATE};
7
8// Windows console control event for Ctrl-C (CTRL_C_EVENT).
9const CTRL_C_EVENT: u32 = 0;
10
11// Windows variant of Repl.cpp's `sigintHandler`:
12//
13// BOOL WINAPI sigintHandler(DWORD signal)
14// {
15// if (signal == CTRL_C_EVENT && replState)
16// lua_callbacks(replState)->interrupt = &sigintCallback;
17// return TRUE;
18// }
19//
20// Registered via `SetConsoleCtrlHandler`; returning TRUE (1) tells Windows the
21// event was handled. Arms the same interrupt callback as the POSIX variant.
22pub unsafe extern "C" fn sigint_handler(signal: u32) -> c_int {
23 let repl_state = REPL_STATE.load(Ordering::SeqCst);
24 if signal == CTRL_C_EVENT && !repl_state.is_null() {
25 (*lua_callbacks(repl_state)).interrupt = Some(sigint_callback);
26 }
27 1 // TRUE
28}