1 /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ 2 char id_libF77[] = "@(#)main.c 2.15 08/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 } 136