|
|
1.1 root 1: /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */
2: char id_libF77[] = "@(#)main.c 2.15 8/25/83";
3:
4: #include <stdio.h>
5: #include <signal.h>
6: #include "../libI77/fiodefs.h"
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 sigdie();
17: long int (*sigf)();
18: int signum;
19:
20: xargc = argc;
21: xargv = argv;
22:
23: for (signum=1; signum<=16; signum++)
24: {
25: if((sigf=signal(signum, sigdie)) != SIG_DFL) signal(signum, sigf);
26: }
27:
28: #ifdef pdp11
29: ldfps(01200); /* detect overflow as an exception */
30: #endif
31:
32: f_init();
33: MAIN_();
34: f_exit();
35: }
36:
37: struct action {
38: char *mesg;
39: int core;
40: } sig_act[16] = {
41: {"Hangup", 0}, /* SIGHUP */
42: {"Interrupt!", 0}, /* SIGINT */
43: {"Quit!", 1}, /* SIGQUIT */
44: {"Illegal ", 1}, /* SIGILL */
45: {"Trace Trap", 1}, /* SIGTRAP */
46: {"IOT Trap", 1}, /* SIGIOT */
47: {"EMT Trap", 1}, /* SIGEMT */
48: {"Arithmetic Exception", 1}, /* SIGFPE */
49: { 0, 0}, /* SIGKILL */
50: {"Bus error", 1}, /* SIGBUS */
51: {"Segmentation violation", 1}, /* SIGSEGV */
52: {"Sys arg", 1}, /* SIGSYS */
53: {"Open pipe", 0}, /* SIGPIPE */
54: {"Alarm", 0}, /* SIGALRM */
55: {"Terminated", 0}, /* SIGTERM */
56: {"Sig 16", 0}, /* unassigned */
57: };
58:
59: struct action act_fpe[] = {
60: {"Integer overflow", 1},
61: {"Integer divide by 0", 1},
62: {"Floating point overflow trap", 1},
63: {"Floating divide by zero trap", 1},
64: {"Floating point underflow trap", 1},
65: {"Decimal overflow", 1},
66: {"Subscript range", 1},
67: {"Floating point overflow", 0},
68: {"Floating divide by zero", 0},
69: {"Floating point underflow", 0},
70: };
71:
72: struct action act_ill[] = {
73: {"addr mode", 1},
74: {"instruction", 1},
75: {"operand", 0},
76: };
77:
78: #if vax
79: sigdie(s, t, sc)
80: int s; int t; struct sigcontext *sc;
81:
82: #else pdp11
83: sigdie(s, t, pc)
84: int s; int t; long pc;
85:
86: #endif
87: {
88: extern unit units[];
89: register struct action *act = &sig_act[s-1];
90: /* print error message, then flush buffers */
91:
92: if (s == SIGHUP || s == SIGINT || s == SIGQUIT)
93: signal(s, SIG_IGN); /* don't allow it again */
94: else
95: signal(s, SIG_DFL); /* shouldn't happen again, but ... */
96:
97: #if vax
98: sigsetmask(0); /* don't block */
99: #endif
100:
101: if (act->mesg)
102: {
103: fprintf(units[STDERR].ufd, "*** %s", act->mesg);
104: if (s == SIGFPE)
105: {
106: if (t >= 1 && t <= 10)
107: fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg);
108: else
109: fprintf(units[STDERR].ufd, ": Type=%d?", t);
110: }
111: else if (s == SIGILL)
112: {
113: if (t == 4) t = 2; /* 4.0bsd botch */
114: if (t >= 0 && t <= 2)
115: fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg);
116: else
117: fprintf(units[STDERR].ufd, "compat mode: Code=%d", t);
118: }
119: putc('\n', units[STDERR].ufd);
120: }
121: f_exit();
122: _cleanup();
123:
124: if(act->core)
125: {
126: /* now get a core */
127: #if vax
128: signal(SIGILL, SIG_DFL);
129: #else pdp11
130: signal(SIGIOT, SIG_DFL);
131: #endif
132: abort();
133: }
134: exit(s);
135: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.