14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ 2*13232Sdlw char id_libF77[] = "@(#)main.c 2.13 06/21/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}, 62*13232Sdlw {"Floating point overflow trap", 1}, 63*13232Sdlw {"Floating divide by zero trap", 1}, 64*13232Sdlw {"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 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]; 834726Sdlw /* print error message, then flush buffers */ 844726Sdlw 854137Sdlw if (act->mesg) 864137Sdlw { 874173Sdlw fprintf(units[STDERR].ufd, "*** %s", act->mesg); 884137Sdlw if (s == SIGFPE) 894168Sdlw { 904168Sdlw if (t >= 1 && t <= 10) 914168Sdlw fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg); 924168Sdlw else 934168Sdlw fprintf(units[STDERR].ufd, ": Type=%d?", t); 944168Sdlw } 954168Sdlw else if (s == SIGILL) 964170Sdlw { 974170Sdlw if (t == 4) t = 2; /* 4.0bsd botch */ 984170Sdlw if (t >= 0 && t <= 2) 994170Sdlw fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg); 1004170Sdlw else 1014170Sdlw fprintf(units[STDERR].ufd, "compat mode: Code=%d", t); 1024170Sdlw } 1034168Sdlw putc('\n', units[STDERR].ufd); 1044137Sdlw } 1054726Sdlw f_exit(); 1064130Sdlw _cleanup(); 1074130Sdlw 1084134Sdlw if(act->core) 1094130Sdlw { 1104130Sdlw /* now get a core */ 1118949Sdlw #if vax 1124137Sdlw signal(SIGILL, SIG_DFL); 1138949Sdlw #else vax 1144134Sdlw signal(SIGIOT, SIG_DFL); 1158949Sdlw #endif vax 1164130Sdlw abort(); 1174130Sdlw } 1184134Sdlw exit(s); 1194130Sdlw } 120