xref: /csrg-svn/usr.bin/f77/libF77/main.c (revision 20197)
14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */
2*20197Slibs char id_libF77[] = "@(#)main.c	2.16	05/14/85";
34130Sdlw 
44130Sdlw #include <stdio.h>
54130Sdlw #include <signal.h>
64131Sdlw #include "../libI77/fiodefs.h"
74130Sdlw 
8*20197Slibs extern int errno;
9*20197Slibs char *getenv();
10*20197Slibs int f77_dump_flag;
11*20197Slibs 
124130Sdlw int xargc;
134130Sdlw char **xargv;
144130Sdlw 
154130Sdlw main(argc, argv, arge)
164130Sdlw int argc;
174130Sdlw char **argv;
184130Sdlw char **arge;
194130Sdlw {
204134Sdlw int sigdie();
214130Sdlw long int (*sigf)();
224168Sdlw int signum;
234130Sdlw 
244130Sdlw xargc = argc;
254130Sdlw xargv = argv;
264130Sdlw 
274168Sdlw for (signum=1; signum<=16; signum++)
284168Sdlw {
294168Sdlw 	if((sigf=signal(signum, sigdie)) != SIG_DFL) signal(signum, sigf);
304168Sdlw }
314168Sdlw 
324130Sdlw #ifdef pdp11
334130Sdlw 	ldfps(01200); /* detect overflow as an exception */
344130Sdlw #endif
354130Sdlw 
364130Sdlw f_init();
3712580Sfortran MAIN_();
384130Sdlw f_exit();
39*20197Slibs return 0;
404130Sdlw }
414130Sdlw 
424134Sdlw struct action {
434134Sdlw 	char *mesg;
444134Sdlw 	int   core;
454134Sdlw } sig_act[16] = {
464168Sdlw 	{"Hangup", 0},			/* SIGHUP  */
474134Sdlw 	{"Interrupt!", 0},		/* SIGINT  */
484134Sdlw 	{"Quit!", 1},			/* SIGQUIT */
494170Sdlw 	{"Illegal ", 1},		/* SIGILL  */
504168Sdlw 	{"Trace Trap", 1},		/* SIGTRAP */
514134Sdlw 	{"IOT Trap", 1},		/* SIGIOT  */
524140Sdlw 	{"EMT Trap", 1},		/* SIGEMT  */
534137Sdlw 	{"Arithmetic Exception", 1},	/* SIGFPE  */
544134Sdlw 	{ 0, 0},			/* SIGKILL */
554134Sdlw 	{"Bus error", 1},		/* SIGBUS  */
564134Sdlw 	{"Segmentation violation", 1},	/* SIGSEGV */
574168Sdlw 	{"Sys arg", 1},			/* SIGSYS  */
584168Sdlw 	{"Open pipe", 0},		/* SIGPIPE */
594168Sdlw 	{"Alarm", 0},			/* SIGALRM */
604134Sdlw 	{"Terminated", 0},		/* SIGTERM */
614168Sdlw 	{"Sig 16", 0},			/* unassigned */
624134Sdlw };
634130Sdlw 
644137Sdlw struct action act_fpe[] = {
654137Sdlw 	{"Integer overflow", 1},
664137Sdlw 	{"Integer divide by 0", 1},
6713232Sdlw 	{"Floating point overflow trap", 1},
6813232Sdlw 	{"Floating divide by zero trap", 1},
6913232Sdlw 	{"Floating point underflow trap", 1},
704137Sdlw 	{"Decimal overflow", 1},
714137Sdlw 	{"Subscript range", 1},
724137Sdlw 	{"Floating point overflow", 0},
734137Sdlw 	{"Floating divide by zero", 0},
744137Sdlw 	{"Floating point underflow", 0},
754137Sdlw };
764170Sdlw 
774170Sdlw struct action act_ill[] = {
784170Sdlw 	{"addr mode", 1},
794170Sdlw 	{"instruction", 1},
804170Sdlw 	{"operand", 0},
814170Sdlw };
824130Sdlw 
8314399Sdlw #if	vax
8414399Sdlw sigdie(s, t, sc)
8514399Sdlw int s; int t; struct sigcontext *sc;
8614399Sdlw 
8714399Sdlw #else	pdp11
884137Sdlw sigdie(s, t, pc)
894137Sdlw int s; int t; long pc;
9014399Sdlw 
9114399Sdlw #endif
924130Sdlw {
934131Sdlw extern unit units[];
944134Sdlw register struct action *act = &sig_act[s-1];
954726Sdlw /* print error message, then flush buffers */
964726Sdlw 
9714840Sdlw if (s == SIGHUP || s == SIGINT || s == SIGQUIT)
9814840Sdlw 	signal(s, SIG_IGN);	/* don't allow it again */
9914840Sdlw else
10014840Sdlw 	signal(s, SIG_DFL);	/* shouldn't happen again, but ... */
10114840Sdlw 
1024137Sdlw if (act->mesg)
1034137Sdlw 	{
1044173Sdlw 	fprintf(units[STDERR].ufd, "*** %s", act->mesg);
1054137Sdlw 	if (s == SIGFPE)
1064168Sdlw 		{
1074168Sdlw 		if (t >= 1 && t <= 10)
1084168Sdlw 			fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg);
1094168Sdlw 		else
1104168Sdlw 			fprintf(units[STDERR].ufd, ": Type=%d?", t);
1114168Sdlw 		}
1124168Sdlw 	else if (s == SIGILL)
1134170Sdlw 		{
1144170Sdlw 		if (t == 4) t = 2;	/* 4.0bsd botch */
1154170Sdlw 		if (t >= 0 && t <= 2)
1164170Sdlw 			fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg);
1174170Sdlw 		else
1184170Sdlw 			fprintf(units[STDERR].ufd, "compat mode: Code=%d", t);
1194170Sdlw 		}
1204168Sdlw 	putc('\n', units[STDERR].ufd);
1214137Sdlw 	}
122*20197Slibs f77_abort( s, act->core );
123*20197Slibs }
1244130Sdlw 
125*20197Slibs f77_abort( err_val, act_core )
126*20197Slibs {
127*20197Slibs 	char first_char, *env_var;
128*20197Slibs 	int core_dump;
129*20197Slibs 
130*20197Slibs 	env_var = getenv("f77_dump_flag");
131*20197Slibs 	first_char = (env_var == NULL) ? 0 : *env_var;
132*20197Slibs 
1334137Sdlw 	signal(SIGILL, SIG_DFL);
134*20197Slibs 	sigsetmask(0);			/* don't block */
135*20197Slibs 
136*20197Slibs 	core_dump = ((nargs() != 2) || act_core) &&
137*20197Slibs 	    ( (f77_dump_flag && (first_char != 'n')) || first_char == 'y');
138*20197Slibs 
139*20197Slibs 	if( !core_dump )
140*20197Slibs 		fprintf(units[STDERR].ufd,"*** Execution terminated\n");
141*20197Slibs 
142*20197Slibs 	f_exit();
143*20197Slibs 	_cleanup();
144*20197Slibs 	if( nargs() ) errno = err_val;
145*20197Slibs 	else errno = -2;   /* prior value will be meaningless,
146*20197Slibs 				so set it to undefined value */
147*20197Slibs 
148*20197Slibs 	if( core_dump ) abort();
149*20197Slibs 	else  exit( errno );
1504130Sdlw }
151