14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ 2*4168Sdlw char id_libF77[] = "@(#)main.c 2.7 08/19/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)(); 18*4168Sdlw int signum; 194130Sdlw 204130Sdlw xargc = argc; 214130Sdlw xargv = argv; 224130Sdlw 23*4168Sdlw for (signum=1; signum<=16; signum++) 24*4168Sdlw { 25*4168Sdlw if((sigf=signal(signum, sigdie)) != SIG_DFL) signal(signum, sigf); 26*4168Sdlw } 27*4168Sdlw 284130Sdlw #ifdef pdp11 294130Sdlw ldfps(01200); /* detect overflow as an exception */ 304130Sdlw #endif 314130Sdlw 324130Sdlw f_init(); 334130Sdlw MAIN__(); 344130Sdlw f_exit(); 354130Sdlw } 364130Sdlw 374134Sdlw struct action { 384134Sdlw char *mesg; 394134Sdlw int core; 404134Sdlw } sig_act[16] = { 41*4168Sdlw {"Hangup", 0}, /* SIGHUP */ 424134Sdlw {"Interrupt!", 0}, /* SIGINT */ 434134Sdlw {"Quit!", 1}, /* SIGQUIT */ 444134Sdlw {"Illegal instruction", 1}, /* SIGILL */ 45*4168Sdlw {"Trace Trap", 1}, /* SIGTRAP */ 464134Sdlw {"IOT Trap", 1}, /* SIGIOT */ 474140Sdlw {"EMT Trap", 1}, /* SIGEMT */ 484140Sdlw #ifdef UCBVAX 494137Sdlw {"Arithmetic Exception", 1}, /* SIGFPE */ 504140Sdlw #else 514140Sdlw {"Floating Point Exception", 1},/* SIGFPE */ 524140Sdlw #endif 534134Sdlw { 0, 0}, /* SIGKILL */ 544134Sdlw {"Bus error", 1}, /* SIGBUS */ 554134Sdlw {"Segmentation violation", 1}, /* SIGSEGV */ 56*4168Sdlw {"Sys arg", 1}, /* SIGSYS */ 57*4168Sdlw {"Open pipe", 0}, /* SIGPIPE */ 58*4168Sdlw {"Alarm", 0}, /* SIGALRM */ 594134Sdlw {"Terminated", 0}, /* SIGTERM */ 60*4168Sdlw {"Sig 16", 0}, /* unassigned */ 614134Sdlw }; 624130Sdlw 634137Sdlw #ifdef UCBVAX 644137Sdlw struct action act_fpe[] = { 654137Sdlw {"Integer overflow", 1}, 664137Sdlw {"Integer divide by 0", 1}, 674137Sdlw {"Floating point overflow", 1}, 684137Sdlw {"Floating divide by zero", 1}, 694137Sdlw {"Floating point underflow", 1}, 704137Sdlw {"Decimal overflow", 1}, 714137Sdlw {"Subscript range", 1}, 724137Sdlw {"Floating point overflow", 0}, 734137Sdlw {"Floating divide by zero", 0}, 744137Sdlw {"Floating point underflow", 0}, 754137Sdlw }; 764137Sdlw #endif 774130Sdlw 784137Sdlw sigdie(s, t, pc) 794137Sdlw int s; int t; long pc; 804130Sdlw { 814131Sdlw extern unit units[]; 824134Sdlw register struct action *act = &sig_act[s-1]; 834131Sdlw /* clear buffers, then print error message */ 844130Sdlw f_exit(); 854137Sdlw if (act->mesg) 864137Sdlw { 874137Sdlw #ifdef UCBVAX 884137Sdlw fprintf(units[STDERR].ufd, "%s", act->mesg); 894137Sdlw if (s == SIGFPE) 90*4168Sdlw { 91*4168Sdlw if (t >= 1 && t <= 10) 92*4168Sdlw fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg); 93*4168Sdlw else 94*4168Sdlw fprintf(units[STDERR].ufd, ": Type=%d?", t); 95*4168Sdlw } 96*4168Sdlw else if (s == SIGILL) 97*4168Sdlw fprintf(units[STDERR].ufd, ": Code=%d", t); 98*4168Sdlw putc('\n', units[STDERR].ufd); 994137Sdlw #else 1004137Sdlw fprintf(units[STDERR].ufd, "%s\n", act->mesg); 1014137Sdlw #endif 1024137Sdlw } 1034130Sdlw _cleanup(); 1044130Sdlw 1054134Sdlw if(act->core) 1064130Sdlw { 1074130Sdlw /* now get a core */ 1084137Sdlw #ifdef VAX 1094137Sdlw signal(SIGILL, SIG_DFL); 1104137Sdlw #else 1114134Sdlw signal(SIGIOT, SIG_DFL); 1124137Sdlw #endif 1134130Sdlw abort(); 1144130Sdlw } 1154134Sdlw exit(s); 1164130Sdlw } 117