xref: /original-bsd/usr.bin/f77/libF77/main.c (revision 0fc6f013)
1 /*
2  * Copyright (c) 1980 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)main.c	5.2	06/26/85
7  */
8 #include <stdio.h>
9 #include <signal.h>
10 #include "../libI77/fiodefs.h"
11 
12 int xargc;
13 char **xargv;
14 
15 main(argc, argv, arge)
16 int argc;
17 char **argv;
18 char **arge;
19 {
20 int sigdie();
21 long int (*sigf)();
22 int signum;
23 
24 xargc = argc;
25 xargv = argv;
26 
27 for (signum=1; signum<=16; signum++)
28 {
29 	if((sigf=signal(signum, sigdie)) != SIG_DFL) signal(signum, sigf);
30 }
31 
32 #ifdef pdp11
33 	ldfps(01200); /* detect overflow as an exception */
34 #endif
35 
36 f_init();
37 MAIN_();
38 f_exit();
39 return 0;
40 }
41 
42 struct action {
43 	char *mesg;
44 	int   core;
45 } sig_act[16] = {
46 	{"Hangup", 0},			/* SIGHUP  */
47 	{"Interrupt!", 0},		/* SIGINT  */
48 	{"Quit!", 1},			/* SIGQUIT */
49 	{"Illegal ", 1},		/* SIGILL  */
50 	{"Trace Trap", 1},		/* SIGTRAP */
51 	{"IOT Trap", 1},		/* SIGIOT  */
52 	{"EMT Trap", 1},		/* SIGEMT  */
53 	{"Arithmetic Exception", 1},	/* SIGFPE  */
54 	{ 0, 0},			/* SIGKILL */
55 	{"Bus error", 1},		/* SIGBUS  */
56 	{"Segmentation violation", 1},	/* SIGSEGV */
57 	{"Sys arg", 1},			/* SIGSYS  */
58 	{"Open pipe", 0},		/* SIGPIPE */
59 	{"Alarm", 0},			/* SIGALRM */
60 	{"Terminated", 0},		/* SIGTERM */
61 	{"Sig 16", 0},			/* unassigned */
62 };
63 
64 struct action act_fpe[] = {
65 	{"Integer overflow", 1},
66 	{"Integer divide by 0", 1},
67 	{"Floating point overflow trap", 1},
68 	{"Floating divide by zero trap", 1},
69 	{"Floating point underflow trap", 1},
70 	{"Decimal overflow", 1},
71 	{"Subscript range", 1},
72 	{"Floating point overflow", 0},
73 	{"Floating divide by zero", 0},
74 	{"Floating point underflow", 0},
75 };
76 
77 struct action act_ill[] = {
78 	{"addr mode", 1},
79 	{"instruction", 1},
80 	{"operand", 0},
81 };
82 
83 #if	vax
84 sigdie(s, t, sc)
85 int s; int t; struct sigcontext *sc;
86 
87 #else	pdp11
88 sigdie(s, t, pc)
89 int s; int t; long pc;
90 
91 #endif
92 {
93 extern unit units[];
94 register struct action *act = &sig_act[s-1];
95 /* print error message, then flush buffers */
96 
97 if (s == SIGHUP || s == SIGINT || s == SIGQUIT)
98 	signal(s, SIG_IGN);	/* don't allow it again */
99 else
100 	signal(s, SIG_DFL);	/* shouldn't happen again, but ... */
101 
102 if (act->mesg)
103 	{
104 	fprintf(units[STDERR].ufd, "*** %s", act->mesg);
105 	if (s == SIGFPE)
106 		{
107 		if (t >= 1 && t <= 10)
108 			fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg);
109 		else
110 			fprintf(units[STDERR].ufd, ": Type=%d?", t);
111 		}
112 	else if (s == SIGILL)
113 		{
114 		if (t == 4) t = 2;	/* 4.0bsd botch */
115 		if (t >= 0 && t <= 2)
116 			fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg);
117 		else
118 			fprintf(units[STDERR].ufd, "compat mode: Code=%d", t);
119 		}
120 	putc('\n', units[STDERR].ufd);
121 	}
122 f77_abort( s, act->core );
123 }
124