xref: /csrg-svn/usr.bin/f77/libF77/main.c (revision 4726)
14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */
2*4726Sdlw char id_libF77[] = "@(#)main.c	2.10	11/03/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)();
184168Sdlw int signum;
194130Sdlw 
204130Sdlw xargc = argc;
214130Sdlw xargv = argv;
224130Sdlw 
234168Sdlw for (signum=1; signum<=16; signum++)
244168Sdlw {
254168Sdlw 	if((sigf=signal(signum, sigdie)) != SIG_DFL) signal(signum, sigf);
264168Sdlw }
274168Sdlw 
284130Sdlw #ifdef pdp11
294130Sdlw 	ldfps(01200); /* detect overflow as an exception */
304130Sdlw #endif
314130Sdlw 
324130Sdlw f_init();
334130Sdlw MAIN__();
344130Sdlw f_exit();
354130Sdlw }
364130Sdlw 
374134Sdlw struct action {
384134Sdlw 	char *mesg;
394134Sdlw 	int   core;
404134Sdlw } sig_act[16] = {
414168Sdlw 	{"Hangup", 0},			/* SIGHUP  */
424134Sdlw 	{"Interrupt!", 0},		/* SIGINT  */
434134Sdlw 	{"Quit!", 1},			/* SIGQUIT */
444170Sdlw #ifdef UCBVAX
454170Sdlw 	{"Illegal ", 1},		/* SIGILL  */
464170Sdlw #else
474134Sdlw 	{"Illegal instruction", 1},	/* SIGILL  */
484170Sdlw #endif
494168Sdlw 	{"Trace Trap", 1},		/* SIGTRAP */
504134Sdlw 	{"IOT Trap", 1},		/* SIGIOT  */
514140Sdlw 	{"EMT Trap", 1},		/* SIGEMT  */
524140Sdlw #ifdef UCBVAX
534137Sdlw 	{"Arithmetic Exception", 1},	/* SIGFPE  */
544140Sdlw #else
554140Sdlw 	{"Floating Point Exception", 1},/* SIGFPE  */
564140Sdlw #endif
574134Sdlw 	{ 0, 0},			/* SIGKILL */
584134Sdlw 	{"Bus error", 1},		/* SIGBUS  */
594134Sdlw 	{"Segmentation violation", 1},	/* SIGSEGV */
604168Sdlw 	{"Sys arg", 1},			/* SIGSYS  */
614168Sdlw 	{"Open pipe", 0},		/* SIGPIPE */
624168Sdlw 	{"Alarm", 0},			/* SIGALRM */
634134Sdlw 	{"Terminated", 0},		/* SIGTERM */
644168Sdlw 	{"Sig 16", 0},			/* unassigned */
654134Sdlw };
664130Sdlw 
674137Sdlw #ifdef UCBVAX
684137Sdlw struct action act_fpe[] = {
694137Sdlw 	{"Integer overflow", 1},
704137Sdlw 	{"Integer divide by 0", 1},
714137Sdlw 	{"Floating point overflow", 1},
724137Sdlw 	{"Floating divide by zero", 1},
734137Sdlw 	{"Floating point underflow", 1},
744137Sdlw 	{"Decimal overflow", 1},
754137Sdlw 	{"Subscript range", 1},
764137Sdlw 	{"Floating point overflow", 0},
774137Sdlw 	{"Floating divide by zero", 0},
784137Sdlw 	{"Floating point underflow", 0},
794137Sdlw };
804170Sdlw 
814170Sdlw struct action act_ill[] = {
824170Sdlw 	{"addr mode", 1},
834170Sdlw 	{"instruction", 1},
844170Sdlw 	{"operand", 0},
854170Sdlw };
864137Sdlw #endif
874130Sdlw 
884137Sdlw sigdie(s, t, pc)
894137Sdlw int s; int t; long pc;
904130Sdlw {
914131Sdlw extern unit units[];
924134Sdlw register struct action *act = &sig_act[s-1];
93*4726Sdlw /* print error message, then flush buffers */
94*4726Sdlw 
954137Sdlw if (act->mesg)
964137Sdlw 	{
974137Sdlw #ifdef UCBVAX
984173Sdlw 	fprintf(units[STDERR].ufd, "*** %s", act->mesg);
994137Sdlw 	if (s == SIGFPE)
1004168Sdlw 		{
1014168Sdlw 		if (t >= 1 && t <= 10)
1024168Sdlw 			fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg);
1034168Sdlw 		else
1044168Sdlw 			fprintf(units[STDERR].ufd, ": Type=%d?", t);
1054168Sdlw 		}
1064168Sdlw 	else if (s == SIGILL)
1074170Sdlw 		{
1084170Sdlw 		if (t == 4) t = 2;	/* 4.0bsd botch */
1094170Sdlw 		if (t >= 0 && t <= 2)
1104170Sdlw 			fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg);
1114170Sdlw 		else
1124170Sdlw 			fprintf(units[STDERR].ufd, "compat mode: Code=%d", t);
1134170Sdlw 		}
1144168Sdlw 	putc('\n', units[STDERR].ufd);
1154137Sdlw #else
1164173Sdlw 	fprintf(units[STDERR].ufd, "*** %s\n", act->mesg);
1174137Sdlw #endif
1184137Sdlw 	}
119*4726Sdlw f_exit();
1204130Sdlw _cleanup();
1214130Sdlw 
1224134Sdlw if(act->core)
1234130Sdlw 	{
1244130Sdlw 	/* now get a core */
1254137Sdlw #ifdef VAX
1264137Sdlw 	signal(SIGILL, SIG_DFL);
1274137Sdlw #else
1284134Sdlw 	signal(SIGIOT, SIG_DFL);
1294137Sdlw #endif
1304130Sdlw 	abort();
1314130Sdlw 	}
1324134Sdlw exit(s);
1334130Sdlw }
134