/* Check for interrupts */ #ifdef MSDOS /* This might work for MS-DOS (untested though): */ void initintr() { } int intrcheck() { int interrupted = 0; while (kbhit()) { if (getch() == '\003') interrupted = 1; } return interrupted; } #define OK #endif #ifdef THINK_C /* This is for THINK C 4.0. For 3.0, you may have to remove the signal stuff. */ #include #include #include "sigtype.h" static int interrupted; static SIGTYPE intcatcher(sig) int sig; { interrupted = 1; signal(SIGINT, intcatcher); } void initintr() { if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, intcatcher); } int intrcheck() { register EvQElPtr q; /* This is like THINK C 4.0's . I'm not sure why FlushEvents must be called from asm{}. */ for (q = (EvQElPtr)EventQueue.qHead; q; q = (EvQElPtr)q->qLink) { if (q->evtQWhat == keyDown && (char)q->evtQMessage == '.' && (q->evtQModifiers & cmdKey) != 0) { asm { moveq #keyDownMask,d0 _FlushEvents } interrupted = 1; break; } } if (interrupted) { interrupted = 0; return 1; } return 0; } #define OK #endif /* THINK_C */ #ifndef OK /* Default version -- for real operating systems and for Standard C */ #include #include #include "sigtype.h" static int interrupted; static SIGTYPE intcatcher(sig) int sig; { interrupted = 1; signal(SIGINT, intcatcher); } void initintr() { if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, intcatcher); } int intrcheck() { if (!interrupted) return 0; interrupted = 0; return 1; } #endif /* !OK */