Skip to main content

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}