Code:
PAW_OPEN_C_API
PAW_API void _pawinit_pawsig_list(void);
typedef struct
{
pawd sys;
/* This will be one of the enum values below */
pawd paw;
/* Can execution continue after this signal? */
pawb light;
/* Whatever you wanted to pass */
pawp ud;
} pawsig;
typedef struct _pawsig_cb pawsig_cb;
typedef void (*_pawsig_cb_)( pawsig *sig );
/* Always declare static and always as { NULL, NULL, <callback> },
* the pointers will be set during the pawsig_catcb call */
struct _pawsig_cb { pawsig_cb *prev, *next; _pawsig_cb_ cb; };
extern const pawsig *_pawsigs;
extern const int _pawsignals;
enum
{
_PAWSIG_NONE = 0,
_PAWSIG_HANG_UP,
_PAWSIG_UNDEF_INST,
# define PAWSIG_UNDEF_INST _pawsig_list[_PAWSIG_UNDEF_INST]
_PAWSIG_UNDEF_MATH,
# define PAWSIG_UNDEF_MATH _pawsig_list[_PAWSIG_UNDEF_MATH]
_PAWSIG_INT_DIVBY0,
_PAWSIG_INT_PARTIAL,
_PAWSIG_INT_OVERFLOW,
_PAWSIG_INT_UNDERFLOW,
_PAWSIG_FPN_DIVBY0,
_PAWSIG_FPN_2SMALL,
_PAWSIG_FPN_PARTIAL,
_PAWSIG_FPN_STACKCHK,
_PAWSIG_FPN_OVERFLOW,
_PAWSIG_FPN_UNDERFLOW,
_PAWSIG_URGENT_SOCKET_IO,
_PAWSIG_ERROR_BREAKPOINT,
_PAWSIG_FORCE_BREAKPOINT,
_PAWSIG_KEYBD_BREAKPOINT,
_PAWSIG_DEBUG_BREAKPOINT,
_PAWSIG_TIMER_BREAKPOINT,
_PAWSIG_RESUME_EXECUTION,
_PAWSIG_BACKGROUND_TTYRD,
# define PAWSIG_BACKGROUND_TTYRD _pawsig_list[_PAWSIG_BACKGROUND_TTYRD]
_PAWSIG_BACKGROUND_TTYWR,
# define PAWSIG_BACKGROUND_TTYWR _pawsig_list[_PAWSIG_BACKGROUND_TTYWR]
_PAWSIG_EXCEEDED_ENTSIZE,
_PAWSIG_EXCEEDED_CPUTIME,
_PAWSIG_FAULTY_PIPE_HOOK,
_PAWSIG_FAULTY_LOCATION,
_PAWSIG_FORCE_TERMINATE,
_PAWSIG_ORDER_TERMINATE,
_PAWSIG_ASKED_TERMINATE,
_PAWSIG_WEIRD_TERMINATE,
_PAWSIG_IO_STATE_CHANGE,
_PAWSIG_CHILD_PROC_DIED,
_PAWSIG_CUSTOM_MSG_CODE,
_PAWSIG_CUSTOM_MSG_TEXT,
/* Just in case there's signals I haven't accounted for to start with */
_PAWSIG_COUNT = 0xFF
};
# ifdef CODE_PAW
pawsig _pawsigs_[_PAWSIG_COUNT] = {{0}};
const pawsig *_pawsigs = _pawsigs_;
const int _pawsignals = _PAWSIG_COUNT;
pawsig_cb _pawsig_head_cb = {NULL}, _pawsig_last_cb = {NULL};
# ifdef PAW_API_MSW
void *_pawthisapp_light = NULL, *_pawthisapp_fatal = NULL;
LONG _pawsigthisapp( EXCEPTION_POINTERS *info )
{
pawsig_cb *link = _pawsig_head_cb.next;
EXCEPTION_RECORD *rec = info->ExceptionRecord;
pawp **all = rec->ExceptionInformation;
pawsig *sig = all[1];
/* Ensure the exception is for this handler */
if ( all[0] != &_pawsig_head_cb )
return EXCEPTION_CONTINUE_SEARCH;
for ( ; link; link = link->next )
link->cb( sig );
return sig->light ? EXCEPTION_CONTINUE_EXECUTION : 0;
}
void pawsigall( pawsig *sig )
{
pawp pass[2] = { &_pawsig_head_cb, sig };
RaiseException( sig->sys, sig->light * EXCEPTION_NONCONTINUABLE, 2, pass );
}
void pawsig_catcb( pawsig_cb *link )
{
pawsig_cb *last = _pawsig_last_cb.prev;
link->prev = last;
last->next = link;
}
PAW_API void _pawinit_pawsig_list(void)
{
unsigned int i = 0;
pawsig *all = _pawsigs_;
_pawsig_last_cb.prev = &_pawsig_head_cb;
_pawthisapp_light = AddVectoredContinueHandler(1,_pawsigthisapp);
_pawthisapp_fatal = AddVectoredExceptionHandler(1,_pawsigthisapp);
for ( ; i < _PAWSIG_COUNT; ++i )
_pawsigs_[i].paw = i;
all[ _PAWSIG_NONE ].sys = 0;
all[ _PAWSIG_HANG_UP ].sys = EXCEPTION_BREAKPOINT;
all[ _PAWSIG_UNDEF_INST ].sys = EXCEPTION_ILLEGAL_INSTRUCTION;
all[ _PAWSIG_UNDEF_MATH ].sys = EXCEPTION_FLT_INVALID_OPERATION;
all[ _PAWSIG_FPN_DIVBY0 ].sys = EXCEPTION_FLT_DIVIDE_BY_ZERO;
all[ _PAWSIG_FPN_2SMALL ].sys = EXCEPTION_FLT_DENORMAL_OPERAND;
all[ _PAWSIG_FPN_PARTIAL ].sys = EXCEPTION_FLT_INEXACT_RESULT;
all[ _PAWSIG_FPN_STACKCHK ].sys = EXCEPTION_FLT_STACK_CHECK;
all[ _PAWSIG_FPN_OVERFLOW ].sys = EXCEPTION_FLT_OVERFLOW;
all[ _PAWSIG_FPN_UNDERFLOW ].sys = EXCEPTION_FLT_UNDERFLOW;
all[ _PAWSIG_URGENT_SOCKET_IO ].sys =;
all[ _PAWSIG_ERROR_BREAKPOINT ].sys =;
all[ _PAWSIG_FORCE_BREAKPOINT ].sys = EXCEPTION_BREAKPOINT;
all[ _PAWSIG_KEYBD_BREAKPOINT ].sys = WM_KEYDOWN;
all[ _PAWSIG_DEBUG_BREAKPOINT ].sys = DBG_CONTROL_C;
all[ _PAWSIG_TIMER_BREAKPOINT ].sys = WM_TIMER;
all[ _PAWSIG_RESUME_EXECUTION ].sys =;
all[ _PAWSIG_BACKGROUND_TTYRD ].sys =;
all[ _PAWSIG_BACKGROUND_TTYWR ].sys =;
all[ _PAWSIG_EXCEEDED_ENTSIZE ].sys =;
all[ _PAWSIG_EXCEEDED_CPUTIME ].sys =;
all[ _PAWSIG_FAULTY_PIPE_HOOK ].sys =;
all[ _PAWSIG_FAULTY_LOCATION ].sys = EXCEPTION_ACCESS_VIOLATION;
all[ _PAWSIG_FORCE_TERMINATE ].sys = WM_QUIT;
all[ _PAWSIG_ORDER_TERMINATE ].sys = WM_ENDSESSION;
all[ _PAWSIG_ASKED_TERMINATE ].sys = WM_QUERYENDSESSION;
all[ _PAWSIG_WEIRD_TERMINATE ].sys = -WM_QUIT;
all[ _PAWSIG_IO_STATE_CHANGE ].sys = WM_INPUT_DEVICE_CHANGE;
all[ _PAWSIG_CHILD_PROC_DIED ].sys = -WM_QUIT;
all[ _PAWSIG_CUSTOM_MSG_CODE ].sys = WM_APP;
all[ _PAWSIG_CUSTOM_MSG_TEXT ].sys = 0xC000;
};
#else
Still editing atm but that's the rough direction I plan to go now.