Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Indent the rest of the code (examples, buildtools, doc...) except for examples/SMPI...
[simgrid.git] / tools / tesh2 / src / xsignal.c
1 /* $Id: signal.c 3483 2007-05-07 11:18:56Z mquinson $ */  \r
2     \r
3 /* signal -- what TESH needs to know about signals                          */ \r
4     \r
5 /* Copyright (c) 2007 Martin Quinson.                                       */ \r
6 /* All rights reserved.                                                     */ \r
7     \r
8 /* This program is free software; you can redistribute it and/or modify it\r
9  * under the terms of the license (GNU LGPL) which comes with this package. */ \r
10     \r
11 #include <xsignal.h>\r
12     \r
13 #ifdef _XBT_WIN32\r
14 int \r is_an_unhandled_exception(DWORD exit_code);
15 \r\rtypedef struct s_exception_entry \r {
16   \rDWORD value;
17   \rconst char *signal;
18 \r} s_exception_entry_t, *exception_entry_t;
19 \r\rstatic const s_exception_entry_t exceptions[] = \r
20     { \r
21 {EXCEPTION_ACCESS_VIOLATION, "SIGSEGV"}, \r
22 {EXCEPTION_ARRAY_BOUNDS_EXCEEDED, "SIGSEGV"}, \r
23 {EXCEPTION_BREAKPOINT, "SIGTRAP"}, \r
24 {EXCEPTION_DATATYPE_MISALIGNMENT, "SIGBUS"}, \r
25 {EXCEPTION_FLT_DENORMAL_OPERAND, "SIGFPE"}, \r
26 {EXCEPTION_FLT_DIVIDE_BY_ZERO, "SIGFPE"}, \r
27 {EXCEPTION_FLT_INEXACT_RESULT, "SIGFPE"}, \r
28 {EXCEPTION_FLT_INVALID_OPERATION, "SIGFPE"}, \r
29 {EXCEPTION_FLT_OVERFLOW, "SIGFPE"}, \r
30 {EXCEPTION_FLT_STACK_CHECK, "SIGFPE"}, \r
31 {EXCEPTION_FLT_UNDERFLOW, "SIGFPE"}, \r
32 {EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL"}, \r
33 {EXCEPTION_IN_PAGE_ERROR, "SIGSEGV"}, \r
34 {EXCEPTION_INT_DIVIDE_BY_ZERO, "SIGFPE"}, \r
35 {EXCEPTION_INT_OVERFLOW, "SIGFPE"}, \r
36 {EXCEPTION_STACK_OVERFLOW, "SIGILL"}, \r
37 {EXCEPTION_SINGLE_STEP, "SIGTRAP"}, \r
38 {EXCEPTION_NONCONTINUABLE_EXCEPTION, "SIGILL"}, \r{EXCEPTION_PRIV_INSTRUCTION, "SIGILL"} \r
39 };
40
41 \r
42 /* number of the entries in the table of exceptions */ \r
43 #define MAX_EXECPTION                   ((unsigned int)19)\r
44     \r
45 #endif  /* \r */
46     \rtypedef struct s_signal_entry {
47   \rconst char *name;
48   \r int number;
49 \r} s_signal_entry_t, *signal_entry_t;
50 \r\rstatic const s_signal_entry_t signals[] = { \r
51       {"SIGHUP", SIGHUP}, \r
52     {"SIGINT", SIGINT}, \r
53     {"SIGQUIT", SIGQUIT}, \r
54     {"SIGILL", SIGILL}, \r
55     {"SIGTRAP", SIGTRAP}, \r
56     {"SIGABRT", SIGABRT}, \r
57     {"SIGFPE", SIGFPE}, \r
58     {"SIGKILL", SIGKILL}, \r
59     {"SIGBUS", SIGBUS}, \r
60     {"SIGSEGV", SIGSEGV}, \r
61     {"SIGSYS", SIGSYS}, \r
62     {"SIGPIPE", SIGPIPE}, \r
63     {"SIGALRM", SIGALRM}, \r
64     {"SIGTERM", SIGTERM}, \r
65     {"SIGURG", SIGURG}, \r
66     {"SIGSTOP", SIGSTOP}, \r
67     {"SIGTSTP", SIGTSTP}, \r
68     {"SIGCONT", SIGCONT}, \r
69     {"SIGCHLD", SIGCHLD}, \r
70     {"SIGTTIN", SIGTTIN}, \r
71     {"SIGTTOU", SIGTTOU}, \r
72     {"SIGIO", SIGIO}, \r
73     {"SIGXCPU", SIGXCPU}, \r
74     {"SIGXFSZ", SIGXFSZ}, \r
75     {"SIGVTALRM", SIGVTALRM}, \r
76     {"SIGPROF", SIGPROF}, \r
77     {"SIGWINCH", SIGWINCH}, \r
78     {"SIGUSR1", SIGUSR1}, \r{"SIGUSR2", SIGUSR2}, \r{"SIG UNKNOWN", -1} \r
79 };
80
81 \r\r
82 #ifdef _XBT_WIN32\r
83 const char *signal_name(DWORD got, const char *expected) \r
84 #else   /* \r */
85 const char *signal_name(unsigned int got, char *expected) \r
86 #endif  /* \r */
87 {
88   \rint i;
89   \r\r
90 #ifdef _XBT_WIN32\r
91       \rfor (i = 0; i < MAX_EXECPTION; i++)
92     \rif (exceptions[i].value == got)
93       \rreturn (exceptions[i].signal);
94   \r
95 #else   /* \r */
96       if ((got == SIGBUS) && !strcmp("SIGSEGV", expected))
97     \rgot = SIGSEGV;
98   \r\rfor (i = 0; signals[i].number != -1; i++)
99     \rif (signals[i].number == got)
100       \rreturn (signals[i].name);
101   \r\r
102 #endif  /* \r */
103       return bprintf("SIG UNKNOWN (%d)", got);
104 \r}
105
106 \r\rint \r sig_exists(const char *sig_name) \r
107 {
108   \rint i;
109   \r\rfor (i = 0; signals[i].number != -1; i++)
110     \rif (!strcmp(signals[i].name, sig_name))
111       \rreturn 1;
112   \r\r
113       /* not found */ \r
114       return 0;
115 \r}
116
117 \r\r\r
118 #ifdef _XBT_WIN32\r
119 int \r is_an_unhandled_exception(DWORD exit_code) \r
120 {
121   \runsigned int i;
122   \r\rfor (i = 0; i < MAX_EXECPTION; i++)
123     \rif (exceptions[i].value == exit_code)
124       \rreturn 1;
125   \r\rreturn 0;
126 \r}
127
128 \r
129 #endif  /* \r */