14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ 2*20197Slibs char id_libF77[] = "@(#)main.c 2.16 05/14/85"; 34130Sdlw 44130Sdlw #include <stdio.h> 54130Sdlw #include <signal.h> 64131Sdlw #include "../libI77/fiodefs.h" 74130Sdlw 8*20197Slibs extern int errno; 9*20197Slibs char *getenv(); 10*20197Slibs int f77_dump_flag; 11*20197Slibs 124130Sdlw int xargc; 134130Sdlw char **xargv; 144130Sdlw 154130Sdlw main(argc, argv, arge) 164130Sdlw int argc; 174130Sdlw char **argv; 184130Sdlw char **arge; 194130Sdlw { 204134Sdlw int sigdie(); 214130Sdlw long int (*sigf)(); 224168Sdlw int signum; 234130Sdlw 244130Sdlw xargc = argc; 254130Sdlw xargv = argv; 264130Sdlw 274168Sdlw for (signum=1; signum<=16; signum++) 284168Sdlw { 294168Sdlw if((sigf=signal(signum, sigdie)) != SIG_DFL) signal(signum, sigf); 304168Sdlw } 314168Sdlw 324130Sdlw #ifdef pdp11 334130Sdlw ldfps(01200); /* detect overflow as an exception */ 344130Sdlw #endif 354130Sdlw 364130Sdlw f_init(); 3712580Sfortran MAIN_(); 384130Sdlw f_exit(); 39*20197Slibs return 0; 404130Sdlw } 414130Sdlw 424134Sdlw struct action { 434134Sdlw char *mesg; 444134Sdlw int core; 454134Sdlw } sig_act[16] = { 464168Sdlw {"Hangup", 0}, /* SIGHUP */ 474134Sdlw {"Interrupt!", 0}, /* SIGINT */ 484134Sdlw {"Quit!", 1}, /* SIGQUIT */ 494170Sdlw {"Illegal ", 1}, /* SIGILL */ 504168Sdlw {"Trace Trap", 1}, /* SIGTRAP */ 514134Sdlw {"IOT Trap", 1}, /* SIGIOT */ 524140Sdlw {"EMT Trap", 1}, /* SIGEMT */ 534137Sdlw {"Arithmetic Exception", 1}, /* SIGFPE */ 544134Sdlw { 0, 0}, /* SIGKILL */ 554134Sdlw {"Bus error", 1}, /* SIGBUS */ 564134Sdlw {"Segmentation violation", 1}, /* SIGSEGV */ 574168Sdlw {"Sys arg", 1}, /* SIGSYS */ 584168Sdlw {"Open pipe", 0}, /* SIGPIPE */ 594168Sdlw {"Alarm", 0}, /* SIGALRM */ 604134Sdlw {"Terminated", 0}, /* SIGTERM */ 614168Sdlw {"Sig 16", 0}, /* unassigned */ 624134Sdlw }; 634130Sdlw 644137Sdlw struct action act_fpe[] = { 654137Sdlw {"Integer overflow", 1}, 664137Sdlw {"Integer divide by 0", 1}, 6713232Sdlw {"Floating point overflow trap", 1}, 6813232Sdlw {"Floating divide by zero trap", 1}, 6913232Sdlw {"Floating point underflow trap", 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 }; 764170Sdlw 774170Sdlw struct action act_ill[] = { 784170Sdlw {"addr mode", 1}, 794170Sdlw {"instruction", 1}, 804170Sdlw {"operand", 0}, 814170Sdlw }; 824130Sdlw 8314399Sdlw #if vax 8414399Sdlw sigdie(s, t, sc) 8514399Sdlw int s; int t; struct sigcontext *sc; 8614399Sdlw 8714399Sdlw #else pdp11 884137Sdlw sigdie(s, t, pc) 894137Sdlw int s; int t; long pc; 9014399Sdlw 9114399Sdlw #endif 924130Sdlw { 934131Sdlw extern unit units[]; 944134Sdlw register struct action *act = &sig_act[s-1]; 954726Sdlw /* print error message, then flush buffers */ 964726Sdlw 9714840Sdlw if (s == SIGHUP || s == SIGINT || s == SIGQUIT) 9814840Sdlw signal(s, SIG_IGN); /* don't allow it again */ 9914840Sdlw else 10014840Sdlw signal(s, SIG_DFL); /* shouldn't happen again, but ... */ 10114840Sdlw 1024137Sdlw if (act->mesg) 1034137Sdlw { 1044173Sdlw fprintf(units[STDERR].ufd, "*** %s", act->mesg); 1054137Sdlw if (s == SIGFPE) 1064168Sdlw { 1074168Sdlw if (t >= 1 && t <= 10) 1084168Sdlw fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg); 1094168Sdlw else 1104168Sdlw fprintf(units[STDERR].ufd, ": Type=%d?", t); 1114168Sdlw } 1124168Sdlw else if (s == SIGILL) 1134170Sdlw { 1144170Sdlw if (t == 4) t = 2; /* 4.0bsd botch */ 1154170Sdlw if (t >= 0 && t <= 2) 1164170Sdlw fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg); 1174170Sdlw else 1184170Sdlw fprintf(units[STDERR].ufd, "compat mode: Code=%d", t); 1194170Sdlw } 1204168Sdlw putc('\n', units[STDERR].ufd); 1214137Sdlw } 122*20197Slibs f77_abort( s, act->core ); 123*20197Slibs } 1244130Sdlw 125*20197Slibs f77_abort( err_val, act_core ) 126*20197Slibs { 127*20197Slibs char first_char, *env_var; 128*20197Slibs int core_dump; 129*20197Slibs 130*20197Slibs env_var = getenv("f77_dump_flag"); 131*20197Slibs first_char = (env_var == NULL) ? 0 : *env_var; 132*20197Slibs 1334137Sdlw signal(SIGILL, SIG_DFL); 134*20197Slibs sigsetmask(0); /* don't block */ 135*20197Slibs 136*20197Slibs core_dump = ((nargs() != 2) || act_core) && 137*20197Slibs ( (f77_dump_flag && (first_char != 'n')) || first_char == 'y'); 138*20197Slibs 139*20197Slibs if( !core_dump ) 140*20197Slibs fprintf(units[STDERR].ufd,"*** Execution terminated\n"); 141*20197Slibs 142*20197Slibs f_exit(); 143*20197Slibs _cleanup(); 144*20197Slibs if( nargs() ) errno = err_val; 145*20197Slibs else errno = -2; /* prior value will be meaningless, 146*20197Slibs so set it to undefined value */ 147*20197Slibs 148*20197Slibs if( core_dump ) abort(); 149*20197Slibs else exit( errno ); 1504130Sdlw } 151