14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ 2*4140Sdlw char id_libF77[] = "@(#)main.c 2.6 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 */ 50*4140Sdlw {"EMT Trap", 1}, /* SIGEMT */ 51*4140Sdlw #ifdef UCBVAX 524137Sdlw {"Arithmetic Exception", 1}, /* SIGFPE */ 53*4140Sdlw #else 54*4140Sdlw {"Floating Point Exception", 1},/* SIGFPE */ 55*4140Sdlw #endif 564134Sdlw { 0, 0}, /* SIGKILL */ 574134Sdlw {"Bus error", 1}, /* SIGBUS */ 584134Sdlw {"Segmentation violation", 1}, /* SIGSEGV */ 594134Sdlw { 0, 0}, /* SIGSYS */ 604134Sdlw { 0, 0}, /* SIGPIPE */ 614134Sdlw { 0, 0}, /* SIGALRM */ 624134Sdlw {"Terminated", 0}, /* SIGTERM */ 634134Sdlw { 0, 0}, /* unassigned */ 644134Sdlw }; 654130Sdlw 664137Sdlw #ifdef UCBVAX 674137Sdlw struct action act_fpe[] = { 684137Sdlw {"Integer overflow", 1}, 694137Sdlw {"Integer divide by 0", 1}, 704137Sdlw {"Floating point overflow", 1}, 714137Sdlw {"Floating divide by zero", 1}, 724137Sdlw {"Floating point underflow", 1}, 734137Sdlw {"Decimal overflow", 1}, 744137Sdlw {"Subscript range", 1}, 754137Sdlw {"Floating point overflow", 0}, 764137Sdlw {"Floating divide by zero", 0}, 774137Sdlw {"Floating point underflow", 0}, 784137Sdlw }; 794137Sdlw #endif 804130Sdlw 814137Sdlw sigdie(s, t, pc) 824137Sdlw int s; int t; long pc; 834130Sdlw { 844131Sdlw extern unit units[]; 854134Sdlw register struct action *act = &sig_act[s-1]; 864131Sdlw /* clear buffers, then print error message */ 874130Sdlw f_exit(); 884137Sdlw if (act->mesg) 894137Sdlw { 904137Sdlw #ifdef UCBVAX 914137Sdlw fprintf(units[STDERR].ufd, "%s", act->mesg); 924137Sdlw if (s == SIGFPE) 934137Sdlw fprintf(units[STDERR].ufd, ": %s\n", act_fpe[t-1].mesg); 944137Sdlw else 954137Sdlw putc('\n', units[STDERR].ufd); 964137Sdlw #else 974137Sdlw fprintf(units[STDERR].ufd, "%s\n", act->mesg); 984137Sdlw #endif 994137Sdlw } 1004130Sdlw _cleanup(); 1014130Sdlw 1024134Sdlw if(act->core) 1034130Sdlw { 1044130Sdlw /* now get a core */ 1054137Sdlw #ifdef VAX 1064137Sdlw signal(SIGILL, SIG_DFL); 1074137Sdlw #else 1084134Sdlw signal(SIGIOT, SIG_DFL); 1094137Sdlw #endif 1104130Sdlw abort(); 1114130Sdlw } 1124134Sdlw exit(s); 1134130Sdlw } 114