+++ /dev/null
-/* $Id: signal.c 3483 2007-05-07 11:18:56Z mquinson $ */ \r
- \r
-/* signal -- what TESH needs to know about signals */ \r
- \r
-/* Copyright (c) 2007 Martin Quinson. */ \r
-/* All rights reserved. */ \r
- \r
-/* This program is free software; you can redistribute it and/or modify it\r
- * under the terms of the license (GNU LGPL) which comes with this package. */ \r
- \r
-#include <xsignal.h>\r
- \r
-#ifdef _XBT_WIN32\r
-int \r is_an_unhandled_exception(DWORD exit_code);
-\r\rtypedef struct s_exception_entry \r {
- \rDWORD value;
- \rconst char *signal;
-\r} s_exception_entry_t, *exception_entry_t;
-\r\rstatic const s_exception_entry_t exceptions[] = \r
- { \r
-{EXCEPTION_ACCESS_VIOLATION, "SIGSEGV"}, \r
-{EXCEPTION_ARRAY_BOUNDS_EXCEEDED, "SIGSEGV"}, \r
-{EXCEPTION_BREAKPOINT, "SIGTRAP"}, \r
-{EXCEPTION_DATATYPE_MISALIGNMENT, "SIGBUS"}, \r
-{EXCEPTION_FLT_DENORMAL_OPERAND, "SIGFPE"}, \r
-{EXCEPTION_FLT_DIVIDE_BY_ZERO, "SIGFPE"}, \r
-{EXCEPTION_FLT_INEXACT_RESULT, "SIGFPE"}, \r
-{EXCEPTION_FLT_INVALID_OPERATION, "SIGFPE"}, \r
-{EXCEPTION_FLT_OVERFLOW, "SIGFPE"}, \r
-{EXCEPTION_FLT_STACK_CHECK, "SIGFPE"}, \r
-{EXCEPTION_FLT_UNDERFLOW, "SIGFPE"}, \r
-{EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL"}, \r
-{EXCEPTION_IN_PAGE_ERROR, "SIGSEGV"}, \r
-{EXCEPTION_INT_DIVIDE_BY_ZERO, "SIGFPE"}, \r
-{EXCEPTION_INT_OVERFLOW, "SIGFPE"}, \r
-{EXCEPTION_STACK_OVERFLOW, "SIGILL"}, \r
-{EXCEPTION_SINGLE_STEP, "SIGTRAP"}, \r
-{EXCEPTION_NONCONTINUABLE_EXCEPTION, "SIGILL"}, \r{EXCEPTION_PRIV_INSTRUCTION, "SIGILL"} \r
-};
-
-\r
-/* number of the entries in the table of exceptions */ \r
-#define MAX_EXECPTION ((unsigned int)19)\r
- \r
-#endif /* \r */
- \rtypedef struct s_signal_entry {
- \rconst char *name;
- \r int number;
-\r} s_signal_entry_t, *signal_entry_t;
-\r\rstatic const s_signal_entry_t signals[] = { \r
- {"SIGHUP", SIGHUP}, \r
- {"SIGINT", SIGINT}, \r
- {"SIGQUIT", SIGQUIT}, \r
- {"SIGILL", SIGILL}, \r
- {"SIGTRAP", SIGTRAP}, \r
- {"SIGABRT", SIGABRT}, \r
- {"SIGFPE", SIGFPE}, \r
- {"SIGKILL", SIGKILL}, \r
- {"SIGBUS", SIGBUS}, \r
- {"SIGSEGV", SIGSEGV}, \r
- {"SIGSYS", SIGSYS}, \r
- {"SIGPIPE", SIGPIPE}, \r
- {"SIGALRM", SIGALRM}, \r
- {"SIGTERM", SIGTERM}, \r
- {"SIGURG", SIGURG}, \r
- {"SIGSTOP", SIGSTOP}, \r
- {"SIGTSTP", SIGTSTP}, \r
- {"SIGCONT", SIGCONT}, \r
- {"SIGCHLD", SIGCHLD}, \r
- {"SIGTTIN", SIGTTIN}, \r
- {"SIGTTOU", SIGTTOU}, \r
- {"SIGIO", SIGIO}, \r
- {"SIGXCPU", SIGXCPU}, \r
- {"SIGXFSZ", SIGXFSZ}, \r
- {"SIGVTALRM", SIGVTALRM}, \r
- {"SIGPROF", SIGPROF}, \r
- {"SIGWINCH", SIGWINCH}, \r
- {"SIGUSR1", SIGUSR1}, \r{"SIGUSR2", SIGUSR2}, \r{"SIG UNKNOWN", -1} \r
-};
-
-\r\r
-#ifdef _XBT_WIN32\r
-const char *signal_name(DWORD got, const char *expected) \r
-#else /* \r */
-const char *signal_name(unsigned int got, char *expected) \r
-#endif /* \r */
-{
- \rint i;
- \r\r
-#ifdef _XBT_WIN32\r
- \rfor (i = 0; i < MAX_EXECPTION; i++)
- \rif (exceptions[i].value == got)
- \rreturn (exceptions[i].signal);
- \r
-#else /* \r */
- if ((got == SIGBUS) && !strcmp("SIGSEGV", expected))
- \rgot = SIGSEGV;
- \r\rfor (i = 0; signals[i].number != -1; i++)
- \rif (signals[i].number == got)
- \rreturn (signals[i].name);
- \r\r
-#endif /* \r */
- return bprintf("SIG UNKNOWN (%d)", got);
-\r}
-
-\r\rint \r sig_exists(const char *sig_name) \r
-{
- \rint i;
- \r\rfor (i = 0; signals[i].number != -1; i++)
- \rif (!strcmp(signals[i].name, sig_name))
- \rreturn 1;
- \r\r
- /* not found */ \r
- return 0;
-\r}
-
-\r\r\r
-#ifdef _XBT_WIN32\r
-int \r is_an_unhandled_exception(DWORD exit_code) \r
-{
- \runsigned int i;
- \r\rfor (i = 0; i < MAX_EXECPTION; i++)
- \rif (exceptions[i].value == exit_code)
- \rreturn 1;
- \r\rreturn 0;
-\r}
-
-\r
-#endif /* \r */