void catatonia_trigger (void) { int mes_result; static BOOL already_exitting = FALSE; SCHEME_OBJECT saved = win32_catatonia_block[CATATONIA_BLOCK_LIMIT]; win32_catatonia_block[CATATONIA_BLOCK_LIMIT] = 0; mes_result = (MessageBox (master_tty_window, "Scheme appears to have become catatonic.\n" "OK to kill it?", "MIT/GNU Scheme", (MB_ICONSTOP | MB_OKCANCEL))); win32_catatonia_block[CATATONIA_BLOCK_COUNTER] = 0; win32_catatonia_block[CATATONIA_BLOCK_LIMIT] = saved; if (mes_result != IDOK) return; else if (already_exitting) exit (1); else { already_exitting = TRUE; termination_normal (0); } }
int signal_keyboard_character_interrupt (int c) { if (c == -1) { if (keyboard_interrupt_enables & TERMINATE_INTERRUPT_ENABLE) goto interactive_interrupt; else return (0); } if (c == -2) { /* Special kludge for hard attn. */ if (keyboard_interrupt_enables & TERMINATE_INTERRUPT_ENABLE) { hard_attn_counter += 1; if (hard_attn_counter >= hard_attn_limit) { console_write_string ("\nTerminating scheme!"); termination_normal (0); } tty_set_next_interrupt_char (CONTROL_G_INTERRUPT_CHAR); } return (0); } else if ((c >= 0) && (c < KB_INT_TABLE_SIZE)) { int interrupt_p, interrupt_char; interrupt_char = keyboard_interrupt_table[c]; switch (interrupt_char) { case CONTROL_B_INTERRUPT_CHAR: REQUEST_INTERRUPT_IF_ENABLED (CONTROL_B_ENABLE); break; case CONTROL_G_INTERRUPT_CHAR: REQUEST_INTERRUPT_IF_ENABLED (CONTROL_G_ENABLE); break; case CONTROL_U_INTERRUPT_CHAR: REQUEST_INTERRUPT_IF_ENABLED (CONTROL_U_ENABLE); break; case CONTROL_X_INTERRUPT_CHAR: REQUEST_INTERRUPT_IF_ENABLED (CONTROL_X_ENABLE); break; case INTERACTIVE_INTERRUPT_CHAR: if (! (keyboard_interrupt_enables & INTERACTIVE_INTERRUPT_ENABLE)) { interrupt_p = 0; break; } interactive_interrupt: print_interrupt_help (); interrupt_p = 1; break; default: interrupt_p = 0; } return (interrupt_p); } return (0); }