------------------------------------------------------------------------------
MC logo
Interrupt Utility
[^] Tom's Lisp Code
------------------------------------------------------------------------------
[Classes for Lisp Atoms] [Functions for Lisp Built-Ins] [Classes for Closures] [Context] [Base For Evaluable Objects] [Callable Objects] [Interrupt Utility] [Main Program] [Pairs] [Code Reader] [Reference Counting]
//*****************************************************************************
//***  Interrupt facility.
//***
//***    This uses the signal facility to control set a flag when the user
//***    hits ^c.  The evalution method simply checks this flag and turns
//***    it into a lisp error when it has been set.
//***    
//*****************************************************************************

#include <signal.h>

#ifndef _interrupt_h_
#define _interrupt_h_

// Interrupt facilty.  Actually needed by apply.
extern bool signalled;          // A signal has been received.

// Vector which just sets the flag.
extern void whap(int sig);

// This initializes the facility by asking the system to call whap() when
// the user hits ^c (SIGINT), or uses the kill command with no signal
// specified (SIGTERM is the default for the Unix kill command).
inline void initsig(void)
{
        signal(SIGINT, whap);
        signal(SIGTERM, whap);
}

// Test the flag, clearing it after the test.  This allows code to use
// if(zapped()) return Error() without having to worry about clearing the
// flag itself so it's not seen again.
inline bool zapped(void)
{
        bool oldsig = signalled;
        signalled = false;
        return oldsig;
}

#endif
#include "interrupt.h"

// Interrupt facilty.  Actually needed by apply.
bool signalled = false;         // A signal has been received.

// Vector which just sets the flag.
void whap(int sig) 
{
        signalled = true;
}