14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ 2*14399Sdlw char id_libF77[] = "@(#)main.c 2.14 08/08/83"; 34130Sdlw 44130Sdlw #include <stdio.h> 54130Sdlw #include <signal.h> 64131Sdlw #include "../libI77/fiodefs.h" 74130Sdlw 84130Sdlw int xargc; 94130Sdlw char **xargv; 104130Sdlw 114130Sdlw main(argc, argv, arge) 124130Sdlw int argc; 134130Sdlw char **argv; 144130Sdlw char **arge; 154130Sdlw { 164134Sdlw int sigdie(); 174130Sdlw long int (*sigf)(); 184168Sdlw int signum; 194130Sdlw 204130Sdlw xargc = argc; 214130Sdlw xargv = argv; 224130Sdlw 234168Sdlw for (signum=1; signum<=16; signum++) 244168Sdlw { 254168Sdlw if((sigf=signal(signum, sigdie)) != SIG_DFL) signal(signum, sigf); 264168Sdlw } 274168Sdlw 284130Sdlw #ifdef pdp11 294130Sdlw ldfps(01200); /* detect overflow as an exception */ 304130Sdlw #endif 314130Sdlw 324130Sdlw f_init(); 3312580Sfortran MAIN_(); 344130Sdlw f_exit(); 354130Sdlw } 364130Sdlw 374134Sdlw struct action { 384134Sdlw char *mesg; 394134Sdlw int core; 404134Sdlw } sig_act[16] = { 414168Sdlw {"Hangup", 0}, /* SIGHUP */ 424134Sdlw {"Interrupt!", 0}, /* SIGINT */ 434134Sdlw {"Quit!", 1}, /* SIGQUIT */ 444170Sdlw {"Illegal ", 1}, /* SIGILL */ 454168Sdlw {"Trace Trap", 1}, /* SIGTRAP */ 464134Sdlw {"IOT Trap", 1}, /* SIGIOT */ 474140Sdlw {"EMT Trap", 1}, /* SIGEMT */ 484137Sdlw {"Arithmetic Exception", 1}, /* SIGFPE */ 494134Sdlw { 0, 0}, /* SIGKILL */ 504134Sdlw {"Bus error", 1}, /* SIGBUS */ 514134Sdlw {"Segmentation violation", 1}, /* SIGSEGV */ 524168Sdlw {"Sys arg", 1}, /* SIGSYS */ 534168Sdlw {"Open pipe", 0}, /* SIGPIPE */ 544168Sdlw {"Alarm", 0}, /* SIGALRM */ 554134Sdlw {"Terminated", 0}, /* SIGTERM */ 564168Sdlw {"Sig 16", 0}, /* unassigned */ 574134Sdlw }; 584130Sdlw 594137Sdlw struct action act_fpe[] = { 604137Sdlw {"Integer overflow", 1}, 614137Sdlw {"Integer divide by 0", 1}, 6213232Sdlw {"Floating point overflow trap", 1}, 6313232Sdlw {"Floating divide by zero trap", 1}, 6413232Sdlw {"Floating point underflow trap", 1}, 654137Sdlw {"Decimal overflow", 1}, 664137Sdlw {"Subscript range", 1}, 674137Sdlw {"Floating point overflow", 0}, 684137Sdlw {"Floating divide by zero", 0}, 694137Sdlw {"Floating point underflow", 0}, 704137Sdlw }; 714170Sdlw 724170Sdlw struct action act_ill[] = { 734170Sdlw {"addr mode", 1}, 744170Sdlw {"instruction", 1}, 754170Sdlw {"operand", 0}, 764170Sdlw }; 774130Sdlw 78*14399Sdlw #if vax 79*14399Sdlw sigdie(s, t, sc) 80*14399Sdlw int s; int t; struct sigcontext *sc; 81*14399Sdlw 82*14399Sdlw #else pdp11 834137Sdlw sigdie(s, t, pc) 844137Sdlw int s; int t; long pc; 85*14399Sdlw 86*14399Sdlw #endif 874130Sdlw { 884131Sdlw extern unit units[]; 894134Sdlw register struct action *act = &sig_act[s-1]; 904726Sdlw /* print error message, then flush buffers */ 914726Sdlw 924137Sdlw if (act->mesg) 934137Sdlw { 944173Sdlw fprintf(units[STDERR].ufd, "*** %s", act->mesg); 954137Sdlw if (s == SIGFPE) 964168Sdlw { 974168Sdlw if (t >= 1 && t <= 10) 984168Sdlw fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg); 994168Sdlw else 1004168Sdlw fprintf(units[STDERR].ufd, ": Type=%d?", t); 1014168Sdlw } 1024168Sdlw else if (s == SIGILL) 1034170Sdlw { 1044170Sdlw if (t == 4) t = 2; /* 4.0bsd botch */ 1054170Sdlw if (t >= 0 && t <= 2) 1064170Sdlw fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg); 1074170Sdlw else 1084170Sdlw fprintf(units[STDERR].ufd, "compat mode: Code=%d", t); 1094170Sdlw } 1104168Sdlw putc('\n', units[STDERR].ufd); 1114137Sdlw } 1124726Sdlw f_exit(); 1134130Sdlw _cleanup(); 1144130Sdlw 1154134Sdlw if(act->core) 1164130Sdlw { 1174130Sdlw /* now get a core */ 1188949Sdlw #if vax 1194137Sdlw signal(SIGILL, SIG_DFL); 120*14399Sdlw sigsetmask(0); 121*14399Sdlw #else pdp11 1224134Sdlw signal(SIGIOT, SIG_DFL); 123*14399Sdlw #endif 1244130Sdlw abort(); 1254130Sdlw } 1264134Sdlw exit(s); 1274130Sdlw } 128