added UCBVAX compile flag for FPE reporting. DLW
[unix-history] / usr / src / usr.bin / f77 / libF77 / main.c
CommitLineData
dd27c76e 1/* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */
3b2461dc 2char 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
8int xargc;
9char **xargv;
10
11main(argc, argv, arge)
12int argc;
13char **argv;
14char **arge;
15{
be7a6737 16int sigdie();
dd27c76e
DW
17long int (*sigf)();
18
19xargc = argc;
20xargv = argv;
be7a6737
DW
21signal(SIGFPE, sigdie); /* ignore underflow, enable overflow */
22signal(SIGIOT, sigdie);
3b2461dc
DW
23if((sigf=signal(SIGQUIT, sigdie)) != SIG_DFL) signal(SIGQUIT, sigf);
24if((sigf=signal(SIGINT, sigdie)) != SIG_DFL) signal(SIGINT, sigf);
25if((sigf=signal(SIGTERM, sigdie)) != SIG_DFL) signal(SIGTERM, sigf);
26if((sigf=signal(SIGILL, sigdie)) != SIG_DFL) signal(SIGILL, sigf);
27if((sigf=signal(SIGEMT, sigdie)) != SIG_DFL) signal(SIGEMT, sigf);
28if((sigf=signal(SIGBUS, sigdie)) != SIG_DFL) signal(SIGBUS, sigf);
29if((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
35f_init();
36MAIN__();
37f_exit();
38}
39
be7a6737
DW
40struct 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
63sigdie(s)
64int s;
dd27c76e 65{
d2397273 66extern unit units[];
be7a6737 67register struct action *act = &sig_act[s-1];
d2397273 68/* clear buffers, then print error message */
dd27c76e 69f_exit();
be7a6737 70if (act->mesg) fprintf(units[STDERR].ufd, "%s\n", act->mesg);
dd27c76e
DW
71_cleanup();
72
be7a6737 73if(act->core)
dd27c76e
DW
74 {
75 /* now get a core */
be7a6737 76 signal(SIGIOT, SIG_DFL);
dd27c76e
DW
77 abort();
78 }
be7a6737 79exit(s);
dd27c76e 80}