Commit | Line | Data |
---|---|---|
dd27c76e | 1 | /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ |
3b2461dc | 2 | char id_libF77[] = "@(#)main.c 2.4 %G%"; |
dd27c76e DW |
3 | |
4 | #include <stdio.h> | |
5 | #include <signal.h> | |
d2397273 | 6 | #include "../libI77/fiodefs.h" |
dd27c76e DW |
7 | |
8 | int xargc; | |
9 | char **xargv; | |
10 | ||
11 | main(argc, argv, arge) | |
12 | int argc; | |
13 | char **argv; | |
14 | char **arge; | |
15 | { | |
be7a6737 | 16 | int sigdie(); |
dd27c76e DW |
17 | long int (*sigf)(); |
18 | ||
19 | xargc = argc; | |
20 | xargv = argv; | |
be7a6737 DW |
21 | signal(SIGFPE, sigdie); /* ignore underflow, enable overflow */ |
22 | signal(SIGIOT, sigdie); | |
3b2461dc DW |
23 | if((sigf=signal(SIGQUIT, sigdie)) != SIG_DFL) signal(SIGQUIT, sigf); |
24 | if((sigf=signal(SIGINT, sigdie)) != SIG_DFL) signal(SIGINT, sigf); | |
25 | if((sigf=signal(SIGTERM, sigdie)) != SIG_DFL) signal(SIGTERM, sigf); | |
26 | if((sigf=signal(SIGILL, sigdie)) != SIG_DFL) signal(SIGILL, sigf); | |
27 | if((sigf=signal(SIGEMT, sigdie)) != SIG_DFL) signal(SIGEMT, sigf); | |
28 | if((sigf=signal(SIGBUS, sigdie)) != SIG_DFL) signal(SIGBUS, sigf); | |
29 | if((sigf=signal(SIGSEGV, sigdie)) != SIG_DFL) signal(SIGSEGV, sigf); | |
dd27c76e DW |
30 | |
31 | #ifdef pdp11 | |
32 | ldfps(01200); /* detect overflow as an exception */ | |
33 | #endif | |
34 | ||
35 | f_init(); | |
36 | MAIN__(); | |
37 | f_exit(); | |
38 | } | |
39 | ||
be7a6737 DW |
40 | struct action { |
41 | char *mesg; | |
42 | int core; | |
43 | } sig_act[16] = { | |
44 | { 0, 0}, /* SIGHUP */ | |
45 | {"Interrupt!", 0}, /* SIGINT */ | |
46 | {"Quit!", 1}, /* SIGQUIT */ | |
47 | {"Illegal instruction", 1}, /* SIGILL */ | |
48 | { 0, 0}, /* SIGTRAP */ | |
49 | {"IOT Trap", 1}, /* SIGIOT */ | |
50 | {"EMT trap", 1}, /* SIGEMT */ | |
51 | {"Floating Point Exception", 1},/* SIGFPE */ | |
52 | { 0, 0}, /* SIGKILL */ | |
53 | {"Bus error", 1}, /* SIGBUS */ | |
54 | {"Segmentation violation", 1}, /* SIGSEGV */ | |
55 | { 0, 0}, /* SIGSYS */ | |
56 | { 0, 0}, /* SIGPIPE */ | |
57 | { 0, 0}, /* SIGALRM */ | |
58 | {"Terminated", 0}, /* SIGTERM */ | |
59 | { 0, 0}, /* unassigned */ | |
60 | }; | |
61 | ||
62 | ||
63 | sigdie(s) | |
64 | int s; | |
dd27c76e | 65 | { |
d2397273 | 66 | extern unit units[]; |
be7a6737 | 67 | register struct action *act = &sig_act[s-1]; |
d2397273 | 68 | /* clear buffers, then print error message */ |
dd27c76e | 69 | f_exit(); |
be7a6737 | 70 | if (act->mesg) fprintf(units[STDERR].ufd, "%s\n", act->mesg); |
dd27c76e DW |
71 | _cleanup(); |
72 | ||
be7a6737 | 73 | if(act->core) |
dd27c76e DW |
74 | { |
75 | /* now get a core */ | |
be7a6737 | 76 | signal(SIGIOT, SIG_DFL); |
dd27c76e DW |
77 | abort(); |
78 | } | |
be7a6737 | 79 | exit(s); |
dd27c76e | 80 | } |