Commit | Line | Data |
---|---|---|
dd27c76e | 1 | /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ |
d2397273 | 2 | char id_libF77[] = "@(#)main.c 2.2"; |
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 | { | |
16 | int sigfdie(), sigidie(), sigqdie(), sigindie(), sigtdie(); | |
d2397273 | 17 | int sigildie(), sigedie(), sigbdie(), sigsdie(); |
dd27c76e DW |
18 | long int (*sigf)(); |
19 | ||
20 | xargc = argc; | |
21 | xargv = argv; | |
22 | signal(SIGFPE, sigfdie); /* ignore underflow, enable overflow */ | |
23 | signal(SIGIOT, sigidie); | |
24 | if(sigf=signal(SIGQUIT, sigqdie) != SIG_DFL) signal(SIGQUIT, sigf); | |
25 | if(sigf=signal(SIGINT, sigindie) != SIG_DFL) signal(SIGINT, sigf); | |
26 | if(sigf=signal(SIGTERM, sigtdie) != SIG_DFL) signal(SIGTERM, sigf); | |
d2397273 DW |
27 | if(sigf=signal(SIGILL, sigildie) != SIG_DFL) signal(SIGILL, sigf); |
28 | if(sigf=signal(SIGEMT, sigedie) != SIG_DFL) signal(SIGEMT, sigf); | |
29 | if(sigf=signal(SIGBUS, sigbdie) != SIG_DFL) signal(SIGBUS, sigf); | |
30 | if(sigf=signal(SIGSEGV, sigsdie) != SIG_DFL) signal(SIGSEGV, sigf); | |
dd27c76e DW |
31 | |
32 | #ifdef pdp11 | |
33 | ldfps(01200); /* detect overflow as an exception */ | |
34 | #endif | |
35 | ||
36 | f_init(); | |
37 | MAIN__(); | |
38 | f_exit(); | |
39 | } | |
40 | ||
41 | ||
42 | static sigfdie() | |
43 | { | |
44 | sigdie("Floating Exception", 1); | |
45 | } | |
46 | ||
47 | ||
dd27c76e DW |
48 | static sigidie() |
49 | { | |
50 | sigdie("IOT Trap", 1); | |
51 | } | |
52 | ||
53 | ||
54 | static sigqdie() | |
55 | { | |
56 | sigdie("Quit signal", 1); | |
57 | } | |
58 | ||
59 | ||
dd27c76e DW |
60 | static sigindie() |
61 | { | |
62 | sigdie("Interrupt!", 0); | |
63 | } | |
64 | ||
65 | ||
dd27c76e DW |
66 | static sigtdie() |
67 | { | |
68 | sigdie("Killed", 0); | |
69 | } | |
70 | ||
71 | ||
d2397273 DW |
72 | static sigildie() |
73 | { | |
74 | sigdie("Illegal instruction", 1); | |
75 | } | |
76 | ||
77 | ||
78 | static sigedie() | |
79 | { | |
80 | sigdie("EMT trap", 1); | |
81 | } | |
82 | ||
83 | ||
84 | static sigbdie() | |
85 | { | |
86 | sigdie("Bus error", 1); | |
87 | } | |
88 | ||
89 | ||
90 | static sigsdie() | |
91 | { | |
92 | sigdie("Segmentation violation", 1); | |
93 | } | |
94 | ||
dd27c76e | 95 | |
d2397273 | 96 | static sigdie(s, core) |
dd27c76e | 97 | register char *s; |
d2397273 | 98 | int core; |
dd27c76e | 99 | { |
d2397273 DW |
100 | extern unit units[]; |
101 | /* clear buffers, then print error message */ | |
dd27c76e | 102 | f_exit(); |
d2397273 | 103 | fprintf(units[STDERR].ufd, "%s\n", s); |
dd27c76e DW |
104 | _cleanup(); |
105 | ||
d2397273 | 106 | if(core) |
dd27c76e DW |
107 | { |
108 | /* now get a core */ | |
109 | signal(SIGIOT, 0); | |
110 | abort(); | |
111 | } | |
112 | else | |
113 | exit(1); | |
114 | } |