xref: /csrg-svn/usr.bin/f77/libF77/main.c (revision 4130)
1*4130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */
2*4130Sdlw 
3*4130Sdlw #include <stdio.h>
4*4130Sdlw #include <signal.h>
5*4130Sdlw 
6*4130Sdlw int xargc;
7*4130Sdlw char **xargv;
8*4130Sdlw 
9*4130Sdlw main(argc, argv, arge)
10*4130Sdlw int argc;
11*4130Sdlw char **argv;
12*4130Sdlw char **arge;
13*4130Sdlw {
14*4130Sdlw int sigfdie(), sigidie(), sigqdie(), sigindie(), sigtdie();
15*4130Sdlw long int (*sigf)();
16*4130Sdlw 
17*4130Sdlw xargc = argc;
18*4130Sdlw xargv = argv;
19*4130Sdlw signal(SIGFPE, sigfdie);	/* ignore underflow, enable overflow */
20*4130Sdlw signal(SIGIOT, sigidie);
21*4130Sdlw if(sigf=signal(SIGQUIT, sigqdie) != SIG_DFL) signal(SIGQUIT, sigf);
22*4130Sdlw if(sigf=signal(SIGINT, sigindie) != SIG_DFL) signal(SIGINT, sigf);
23*4130Sdlw if(sigf=signal(SIGTERM, sigtdie) != SIG_DFL) signal(SIGTERM, sigf);
24*4130Sdlw 
25*4130Sdlw #ifdef pdp11
26*4130Sdlw 	ldfps(01200); /* detect overflow as an exception */
27*4130Sdlw #endif
28*4130Sdlw 
29*4130Sdlw f_init();
30*4130Sdlw MAIN__();
31*4130Sdlw f_exit();
32*4130Sdlw }
33*4130Sdlw 
34*4130Sdlw 
35*4130Sdlw static sigfdie()
36*4130Sdlw {
37*4130Sdlw sigdie("Floating Exception", 1);
38*4130Sdlw }
39*4130Sdlw 
40*4130Sdlw 
41*4130Sdlw 
42*4130Sdlw static sigidie()
43*4130Sdlw {
44*4130Sdlw sigdie("IOT Trap", 1);
45*4130Sdlw }
46*4130Sdlw 
47*4130Sdlw 
48*4130Sdlw static sigqdie()
49*4130Sdlw {
50*4130Sdlw sigdie("Quit signal", 1);
51*4130Sdlw }
52*4130Sdlw 
53*4130Sdlw 
54*4130Sdlw 
55*4130Sdlw static sigindie()
56*4130Sdlw {
57*4130Sdlw sigdie("Interrupt!", 0);
58*4130Sdlw }
59*4130Sdlw 
60*4130Sdlw 
61*4130Sdlw 
62*4130Sdlw static sigtdie()
63*4130Sdlw {
64*4130Sdlw sigdie("Killed", 0);
65*4130Sdlw }
66*4130Sdlw 
67*4130Sdlw 
68*4130Sdlw 
69*4130Sdlw static sigdie(s, kill)
70*4130Sdlw register char *s;
71*4130Sdlw int kill;
72*4130Sdlw {
73*4130Sdlw /* print error message, then clear buffers */
74*4130Sdlw fprintf(stderr, "%s\n", s);
75*4130Sdlw f_exit();
76*4130Sdlw _cleanup();
77*4130Sdlw 
78*4130Sdlw if(kill)
79*4130Sdlw 	{
80*4130Sdlw 	/* now get a core */
81*4130Sdlw 	signal(SIGIOT, 0);
82*4130Sdlw 	abort();
83*4130Sdlw 	}
84*4130Sdlw else
85*4130Sdlw 	exit(1);
86*4130Sdlw }
87