|
|
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.