14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ 2*4726Sdlw char id_libF77[] = "@(#)main.c 2.10 11/03/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)(); 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(); 334130Sdlw 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 #ifdef UCBVAX 454170Sdlw {"Illegal ", 1}, /* SIGILL */ 464170Sdlw #else 474134Sdlw {"Illegal instruction", 1}, /* SIGILL */ 484170Sdlw #endif 494168Sdlw {"Trace Trap", 1}, /* SIGTRAP */ 504134Sdlw {"IOT Trap", 1}, /* SIGIOT */ 514140Sdlw {"EMT Trap", 1}, /* SIGEMT */ 524140Sdlw #ifdef UCBVAX 534137Sdlw {"Arithmetic Exception", 1}, /* SIGFPE */ 544140Sdlw #else 554140Sdlw {"Floating Point Exception", 1},/* SIGFPE */ 564140Sdlw #endif 574134Sdlw { 0, 0}, /* SIGKILL */ 584134Sdlw {"Bus error", 1}, /* SIGBUS */ 594134Sdlw {"Segmentation violation", 1}, /* SIGSEGV */ 604168Sdlw {"Sys arg", 1}, /* SIGSYS */ 614168Sdlw {"Open pipe", 0}, /* SIGPIPE */ 624168Sdlw {"Alarm", 0}, /* SIGALRM */ 634134Sdlw {"Terminated", 0}, /* SIGTERM */ 644168Sdlw {"Sig 16", 0}, /* unassigned */ 654134Sdlw }; 664130Sdlw 674137Sdlw #ifdef UCBVAX 684137Sdlw struct action act_fpe[] = { 694137Sdlw {"Integer overflow", 1}, 704137Sdlw {"Integer divide by 0", 1}, 714137Sdlw {"Floating point overflow", 1}, 724137Sdlw {"Floating divide by zero", 1}, 734137Sdlw {"Floating point underflow", 1}, 744137Sdlw {"Decimal overflow", 1}, 754137Sdlw {"Subscript range", 1}, 764137Sdlw {"Floating point overflow", 0}, 774137Sdlw {"Floating divide by zero", 0}, 784137Sdlw {"Floating point underflow", 0}, 794137Sdlw }; 804170Sdlw 814170Sdlw struct action act_ill[] = { 824170Sdlw {"addr mode", 1}, 834170Sdlw {"instruction", 1}, 844170Sdlw {"operand", 0}, 854170Sdlw }; 864137Sdlw #endif 874130Sdlw 884137Sdlw sigdie(s, t, pc) 894137Sdlw int s; int t; long pc; 904130Sdlw { 914131Sdlw extern unit units[]; 924134Sdlw register struct action *act = &sig_act[s-1]; 93*4726Sdlw /* print error message, then flush buffers */ 94*4726Sdlw 954137Sdlw if (act->mesg) 964137Sdlw { 974137Sdlw #ifdef UCBVAX 984173Sdlw fprintf(units[STDERR].ufd, "*** %s", act->mesg); 994137Sdlw if (s == SIGFPE) 1004168Sdlw { 1014168Sdlw if (t >= 1 && t <= 10) 1024168Sdlw fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg); 1034168Sdlw else 1044168Sdlw fprintf(units[STDERR].ufd, ": Type=%d?", t); 1054168Sdlw } 1064168Sdlw else if (s == SIGILL) 1074170Sdlw { 1084170Sdlw if (t == 4) t = 2; /* 4.0bsd botch */ 1094170Sdlw if (t >= 0 && t <= 2) 1104170Sdlw fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg); 1114170Sdlw else 1124170Sdlw fprintf(units[STDERR].ufd, "compat mode: Code=%d", t); 1134170Sdlw } 1144168Sdlw putc('\n', units[STDERR].ufd); 1154137Sdlw #else 1164173Sdlw fprintf(units[STDERR].ufd, "*** %s\n", act->mesg); 1174137Sdlw #endif 1184137Sdlw } 119*4726Sdlw f_exit(); 1204130Sdlw _cleanup(); 1214130Sdlw 1224134Sdlw if(act->core) 1234130Sdlw { 1244130Sdlw /* now get a core */ 1254137Sdlw #ifdef VAX 1264137Sdlw signal(SIGILL, SIG_DFL); 1274137Sdlw #else 1284134Sdlw signal(SIGIOT, SIG_DFL); 1294137Sdlw #endif 1304130Sdlw abort(); 1314130Sdlw } 1324134Sdlw exit(s); 1334130Sdlw } 134