14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ 2*4137Sdlw char id_libF77[] = "@(#)main.c 2.5 08/13/81"; 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)(); 184130Sdlw 194130Sdlw xargc = argc; 204130Sdlw xargv = argv; 214134Sdlw signal(SIGFPE, sigdie); /* ignore underflow, enable overflow */ 224134Sdlw signal(SIGIOT, sigdie); 234135Sdlw if((sigf=signal(SIGQUIT, sigdie)) != SIG_DFL) signal(SIGQUIT, sigf); 244135Sdlw if((sigf=signal(SIGINT, sigdie)) != SIG_DFL) signal(SIGINT, sigf); 254135Sdlw if((sigf=signal(SIGTERM, sigdie)) != SIG_DFL) signal(SIGTERM, sigf); 264135Sdlw if((sigf=signal(SIGILL, sigdie)) != SIG_DFL) signal(SIGILL, sigf); 274135Sdlw if((sigf=signal(SIGEMT, sigdie)) != SIG_DFL) signal(SIGEMT, sigf); 284135Sdlw if((sigf=signal(SIGBUS, sigdie)) != SIG_DFL) signal(SIGBUS, sigf); 294135Sdlw if((sigf=signal(SIGSEGV, sigdie)) != SIG_DFL) signal(SIGSEGV, sigf); 304130Sdlw 314130Sdlw #ifdef pdp11 324130Sdlw ldfps(01200); /* detect overflow as an exception */ 334130Sdlw #endif 344130Sdlw 354130Sdlw f_init(); 364130Sdlw MAIN__(); 374130Sdlw f_exit(); 384130Sdlw } 394130Sdlw 404134Sdlw struct action { 414134Sdlw char *mesg; 424134Sdlw int core; 434134Sdlw } sig_act[16] = { 444134Sdlw { 0, 0}, /* SIGHUP */ 454134Sdlw {"Interrupt!", 0}, /* SIGINT */ 464134Sdlw {"Quit!", 1}, /* SIGQUIT */ 474134Sdlw {"Illegal instruction", 1}, /* SIGILL */ 484134Sdlw { 0, 0}, /* SIGTRAP */ 494134Sdlw {"IOT Trap", 1}, /* SIGIOT */ 504134Sdlw {"EMT trap", 1}, /* SIGEMT */ 51*4137Sdlw {"Arithmetic Exception", 1}, /* SIGFPE */ 524134Sdlw { 0, 0}, /* SIGKILL */ 534134Sdlw {"Bus error", 1}, /* SIGBUS */ 544134Sdlw {"Segmentation violation", 1}, /* SIGSEGV */ 554134Sdlw { 0, 0}, /* SIGSYS */ 564134Sdlw { 0, 0}, /* SIGPIPE */ 574134Sdlw { 0, 0}, /* SIGALRM */ 584134Sdlw {"Terminated", 0}, /* SIGTERM */ 594134Sdlw { 0, 0}, /* unassigned */ 604134Sdlw }; 614130Sdlw 62*4137Sdlw #ifdef UCBVAX 63*4137Sdlw struct action act_fpe[] = { 64*4137Sdlw {"Integer overflow", 1}, 65*4137Sdlw {"Integer divide by 0", 1}, 66*4137Sdlw {"Floating point overflow", 1}, 67*4137Sdlw {"Floating divide by zero", 1}, 68*4137Sdlw {"Floating point underflow", 1}, 69*4137Sdlw {"Decimal overflow", 1}, 70*4137Sdlw {"Subscript range", 1}, 71*4137Sdlw {"Floating point overflow", 0}, 72*4137Sdlw {"Floating divide by zero", 0}, 73*4137Sdlw {"Floating point underflow", 0}, 74*4137Sdlw }; 75*4137Sdlw #endif 764130Sdlw 77*4137Sdlw sigdie(s, t, pc) 78*4137Sdlw int s; int t; long pc; 794130Sdlw { 804131Sdlw extern unit units[]; 814134Sdlw register struct action *act = &sig_act[s-1]; 824131Sdlw /* clear buffers, then print error message */ 834130Sdlw f_exit(); 84*4137Sdlw if (act->mesg) 85*4137Sdlw { 86*4137Sdlw #ifdef UCBVAX 87*4137Sdlw fprintf(units[STDERR].ufd, "%s", act->mesg); 88*4137Sdlw if (s == SIGFPE) 89*4137Sdlw fprintf(units[STDERR].ufd, ": %s\n", act_fpe[t-1].mesg); 90*4137Sdlw else 91*4137Sdlw putc('\n', units[STDERR].ufd); 92*4137Sdlw #else 93*4137Sdlw fprintf(units[STDERR].ufd, "%s\n", act->mesg); 94*4137Sdlw #endif 95*4137Sdlw } 964130Sdlw _cleanup(); 974130Sdlw 984134Sdlw if(act->core) 994130Sdlw { 1004130Sdlw /* now get a core */ 101*4137Sdlw #ifdef VAX 102*4137Sdlw signal(SIGILL, SIG_DFL); 103*4137Sdlw #else 1044134Sdlw signal(SIGIOT, SIG_DFL); 105*4137Sdlw #endif 1064130Sdlw abort(); 1074130Sdlw } 1084134Sdlw exit(s); 1094130Sdlw } 110