xref: /csrg-svn/usr.bin/f77/libF77/main.c (revision 4131)
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