14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ 2*4131Sdlw char id_libF77[] = "@(#)main.c 2.2"; 34130Sdlw 44130Sdlw #include <stdio.h> 54130Sdlw #include <signal.h> 6*4131Sdlw #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 { 164130Sdlw int sigfdie(), sigidie(), sigqdie(), sigindie(), sigtdie(); 17*4131Sdlw int sigildie(), sigedie(), sigbdie(), sigsdie(); 184130Sdlw long int (*sigf)(); 194130Sdlw 204130Sdlw xargc = argc; 214130Sdlw xargv = argv; 224130Sdlw signal(SIGFPE, sigfdie); /* ignore underflow, enable overflow */ 234130Sdlw signal(SIGIOT, sigidie); 244130Sdlw if(sigf=signal(SIGQUIT, sigqdie) != SIG_DFL) signal(SIGQUIT, sigf); 254130Sdlw if(sigf=signal(SIGINT, sigindie) != SIG_DFL) signal(SIGINT, sigf); 264130Sdlw if(sigf=signal(SIGTERM, sigtdie) != SIG_DFL) signal(SIGTERM, sigf); 27*4131Sdlw if(sigf=signal(SIGILL, sigildie) != SIG_DFL) signal(SIGILL, sigf); 28*4131Sdlw if(sigf=signal(SIGEMT, sigedie) != SIG_DFL) signal(SIGEMT, sigf); 29*4131Sdlw if(sigf=signal(SIGBUS, sigbdie) != SIG_DFL) signal(SIGBUS, sigf); 30*4131Sdlw if(sigf=signal(SIGSEGV, sigsdie) != SIG_DFL) signal(SIGSEGV, sigf); 314130Sdlw 324130Sdlw #ifdef pdp11 334130Sdlw ldfps(01200); /* detect overflow as an exception */ 344130Sdlw #endif 354130Sdlw 364130Sdlw f_init(); 374130Sdlw MAIN__(); 384130Sdlw f_exit(); 394130Sdlw } 404130Sdlw 414130Sdlw 424130Sdlw static sigfdie() 434130Sdlw { 444130Sdlw sigdie("Floating Exception", 1); 454130Sdlw } 464130Sdlw 474130Sdlw 484130Sdlw static sigidie() 494130Sdlw { 504130Sdlw sigdie("IOT Trap", 1); 514130Sdlw } 524130Sdlw 534130Sdlw 544130Sdlw static sigqdie() 554130Sdlw { 564130Sdlw sigdie("Quit signal", 1); 574130Sdlw } 584130Sdlw 594130Sdlw 604130Sdlw static sigindie() 614130Sdlw { 624130Sdlw sigdie("Interrupt!", 0); 634130Sdlw } 644130Sdlw 654130Sdlw 664130Sdlw static sigtdie() 674130Sdlw { 684130Sdlw sigdie("Killed", 0); 694130Sdlw } 704130Sdlw 714130Sdlw 72*4131Sdlw static sigildie() 73*4131Sdlw { 74*4131Sdlw sigdie("Illegal instruction", 1); 75*4131Sdlw } 764130Sdlw 77*4131Sdlw 78*4131Sdlw static sigedie() 79*4131Sdlw { 80*4131Sdlw sigdie("EMT trap", 1); 81*4131Sdlw } 82*4131Sdlw 83*4131Sdlw 84*4131Sdlw static sigbdie() 85*4131Sdlw { 86*4131Sdlw sigdie("Bus error", 1); 87*4131Sdlw } 88*4131Sdlw 89*4131Sdlw 90*4131Sdlw static sigsdie() 91*4131Sdlw { 92*4131Sdlw sigdie("Segmentation violation", 1); 93*4131Sdlw } 94*4131Sdlw 95*4131Sdlw 96*4131Sdlw static sigdie(s, core) 974130Sdlw register char *s; 98*4131Sdlw int core; 994130Sdlw { 100*4131Sdlw extern unit units[]; 101*4131Sdlw /* clear buffers, then print error message */ 1024130Sdlw f_exit(); 103*4131Sdlw fprintf(units[STDERR].ufd, "%s\n", s); 1044130Sdlw _cleanup(); 1054130Sdlw 106*4131Sdlw if(core) 1074130Sdlw { 1084130Sdlw /* now get a core */ 1094130Sdlw signal(SIGIOT, 0); 1104130Sdlw abort(); 1114130Sdlw } 1124130Sdlw else 1134130Sdlw exit(1); 1144130Sdlw } 115