xref: /csrg-svn/usr.bin/f77/libF77/main.c (revision 4140)
14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */
2*4140Sdlw char id_libF77[] = "@(#)main.c	2.6	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 {
164134Sdlw int sigdie();
174130Sdlw long int (*sigf)();
184130Sdlw 
194130Sdlw xargc = argc;
204130Sdlw xargv = argv;
214134Sdlw signal(SIGFPE, sigdie);	/* ignore underflow, enable overflow */
224134Sdlw signal(SIGIOT, sigdie);
234135Sdlw if((sigf=signal(SIGQUIT, sigdie)) != SIG_DFL) signal(SIGQUIT, sigf);
244135Sdlw if((sigf=signal(SIGINT,  sigdie)) != SIG_DFL) signal(SIGINT,  sigf);
254135Sdlw if((sigf=signal(SIGTERM, sigdie)) != SIG_DFL) signal(SIGTERM, sigf);
264135Sdlw if((sigf=signal(SIGILL,  sigdie)) != SIG_DFL) signal(SIGILL,  sigf);
274135Sdlw if((sigf=signal(SIGEMT,  sigdie)) != SIG_DFL) signal(SIGEMT,  sigf);
284135Sdlw if((sigf=signal(SIGBUS,  sigdie)) != SIG_DFL) signal(SIGBUS,  sigf);
294135Sdlw 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 
404134Sdlw struct action {
414134Sdlw 	char *mesg;
424134Sdlw 	int   core;
434134Sdlw } sig_act[16] = {
444134Sdlw 	{ 0, 0},			/* SIGHUP  */
454134Sdlw 	{"Interrupt!", 0},		/* SIGINT  */
464134Sdlw 	{"Quit!", 1},			/* SIGQUIT */
474134Sdlw 	{"Illegal instruction", 1},	/* SIGILL  */
484134Sdlw 	{ 0, 0},			/* SIGTRAP */
494134Sdlw 	{"IOT Trap", 1},		/* SIGIOT  */
50*4140Sdlw 	{"EMT Trap", 1},		/* SIGEMT  */
51*4140Sdlw #ifdef UCBVAX
524137Sdlw 	{"Arithmetic Exception", 1},	/* SIGFPE  */
53*4140Sdlw #else
54*4140Sdlw 	{"Floating Point Exception", 1},/* SIGFPE  */
55*4140Sdlw #endif
564134Sdlw 	{ 0, 0},			/* SIGKILL */
574134Sdlw 	{"Bus error", 1},		/* SIGBUS  */
584134Sdlw 	{"Segmentation violation", 1},	/* SIGSEGV */
594134Sdlw 	{ 0, 0},			/* SIGSYS  */
604134Sdlw 	{ 0, 0},			/* SIGPIPE */
614134Sdlw 	{ 0, 0},			/* SIGALRM */
624134Sdlw 	{"Terminated", 0},		/* SIGTERM */
634134Sdlw 	{ 0, 0},			/* unassigned */
644134Sdlw };
654130Sdlw 
664137Sdlw #ifdef UCBVAX
674137Sdlw struct action act_fpe[] = {
684137Sdlw 	{"Integer overflow", 1},
694137Sdlw 	{"Integer divide by 0", 1},
704137Sdlw 	{"Floating point overflow", 1},
714137Sdlw 	{"Floating divide by zero", 1},
724137Sdlw 	{"Floating point underflow", 1},
734137Sdlw 	{"Decimal overflow", 1},
744137Sdlw 	{"Subscript range", 1},
754137Sdlw 	{"Floating point overflow", 0},
764137Sdlw 	{"Floating divide by zero", 0},
774137Sdlw 	{"Floating point underflow", 0},
784137Sdlw };
794137Sdlw #endif
804130Sdlw 
814137Sdlw sigdie(s, t, pc)
824137Sdlw int s; int t; long pc;
834130Sdlw {
844131Sdlw extern unit units[];
854134Sdlw register struct action *act = &sig_act[s-1];
864131Sdlw /* clear buffers, then print error message */
874130Sdlw f_exit();
884137Sdlw if (act->mesg)
894137Sdlw 	{
904137Sdlw #ifdef UCBVAX
914137Sdlw 	fprintf(units[STDERR].ufd, "%s", act->mesg);
924137Sdlw 	if (s == SIGFPE)
934137Sdlw 		fprintf(units[STDERR].ufd, ": %s\n", act_fpe[t-1].mesg);
944137Sdlw 	else
954137Sdlw 		putc('\n', units[STDERR].ufd);
964137Sdlw #else
974137Sdlw 	fprintf(units[STDERR].ufd, "%s\n", act->mesg);
984137Sdlw #endif
994137Sdlw 	}
1004130Sdlw _cleanup();
1014130Sdlw 
1024134Sdlw if(act->core)
1034130Sdlw 	{
1044130Sdlw 	/* now get a core */
1054137Sdlw #ifdef VAX
1064137Sdlw 	signal(SIGILL, SIG_DFL);
1074137Sdlw #else
1084134Sdlw 	signal(SIGIOT, SIG_DFL);
1094137Sdlw #endif
1104130Sdlw 	abort();
1114130Sdlw 	}
1124134Sdlw exit(s);
1134130Sdlw }
114