xref: /csrg-svn/usr.bin/f77/libF77/main.c (revision 4134)
14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */
2*4134Sdlw char id_libF77[] = "@(#)main.c	2.3	08/13/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 {
16*4134Sdlw int sigdie();
174130Sdlw long int (*sigf)();
184130Sdlw 
194130Sdlw xargc = argc;
204130Sdlw xargv = argv;
21*4134Sdlw signal(SIGFPE, sigdie);	/* ignore underflow, enable overflow */
22*4134Sdlw signal(SIGIOT, sigdie);
23*4134Sdlw if(sigf=signal(SIGQUIT, sigdie) != SIG_DFL) signal(SIGQUIT, sigf);
24*4134Sdlw if(sigf=signal(SIGINT,  sigdie) != SIG_DFL) signal(SIGINT,  sigf);
25*4134Sdlw if(sigf=signal(SIGTERM, sigdie) != SIG_DFL) signal(SIGTERM, sigf);
26*4134Sdlw if(sigf=signal(SIGILL,  sigdie) != SIG_DFL) signal(SIGILL,  sigf);
27*4134Sdlw if(sigf=signal(SIGEMT,  sigdie) != SIG_DFL) signal(SIGEMT,  sigf);
28*4134Sdlw if(sigf=signal(SIGBUS,  sigdie) != SIG_DFL) signal(SIGBUS,  sigf);
29*4134Sdlw if(sigf=signal(SIGSEGV, sigdie) != SIG_DFL) signal(SIGSEGV, sigf);
304130Sdlw 
314130Sdlw #ifdef pdp11
324130Sdlw 	ldfps(01200); /* detect overflow as an exception */
334130Sdlw #endif
344130Sdlw 
354130Sdlw f_init();
364130Sdlw MAIN__();
374130Sdlw f_exit();
384130Sdlw }
394130Sdlw 
40*4134Sdlw struct action {
41*4134Sdlw 	char *mesg;
42*4134Sdlw 	int   core;
43*4134Sdlw } sig_act[16] = {
44*4134Sdlw 	{ 0, 0},			/* SIGHUP  */
45*4134Sdlw 	{"Interrupt!", 0},		/* SIGINT  */
46*4134Sdlw 	{"Quit!", 1},			/* SIGQUIT */
47*4134Sdlw 	{"Illegal instruction", 1},	/* SIGILL  */
48*4134Sdlw 	{ 0, 0},			/* SIGTRAP */
49*4134Sdlw 	{"IOT Trap", 1},		/* SIGIOT  */
50*4134Sdlw 	{"EMT trap", 1},		/* SIGEMT  */
51*4134Sdlw 	{"Floating Point Exception", 1},/* SIGFPE  */
52*4134Sdlw 	{ 0, 0},			/* SIGKILL */
53*4134Sdlw 	{"Bus error", 1},		/* SIGBUS  */
54*4134Sdlw 	{"Segmentation violation", 1},	/* SIGSEGV */
55*4134Sdlw 	{ 0, 0},			/* SIGSYS  */
56*4134Sdlw 	{ 0, 0},			/* SIGPIPE */
57*4134Sdlw 	{ 0, 0},			/* SIGALRM */
58*4134Sdlw 	{"Terminated", 0},		/* SIGTERM */
59*4134Sdlw 	{ 0, 0},			/* unassigned */
60*4134Sdlw };
614130Sdlw 
624130Sdlw 
63*4134Sdlw sigdie(s)
64*4134Sdlw int s;
654130Sdlw {
664131Sdlw extern unit units[];
67*4134Sdlw register struct action *act = &sig_act[s-1];
684131Sdlw /* clear buffers, then print error message */
694130Sdlw f_exit();
70*4134Sdlw if (act->mesg) fprintf(units[STDERR].ufd, "%s\n", act->mesg);
714130Sdlw _cleanup();
724130Sdlw 
73*4134Sdlw if(act->core)
744130Sdlw 	{
754130Sdlw 	/* now get a core */
76*4134Sdlw 	signal(SIGIOT, SIG_DFL);
774130Sdlw 	abort();
784130Sdlw 	}
79*4134Sdlw exit(s);
804130Sdlw }
81