BSD 4_1_snap development
[unix-history] / usr / src / lib / libF77 / main.c
/* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */
#include <stdio.h>
#include <signal.h>
int xargc;
char **xargv;
int _sigfdie(), _sigidie(), _sigqdie(), _sigindie(), _sigtdie();
main(argc, argv, arge)
int argc;
char **argv;
char **arge;
{
xargc = argc;
xargv = argv;
signal(SIGFPE, _sigfdie); /* ignore underflow, enable overflow */
signal(SIGIOT, _sigidie);
if ((int)signal(SIGQUIT,_sigqdie) & 01)
signal(SIGQUIT, SIG_IGN);
if ((int)signal(SIGINT, _sigindie) & 01)
signal(SIGINT, SIG_IGN);
signal(SIGTERM,_sigtdie);
#ifdef pdp11
ldfps(01200); /* detect overflow as an exception */
#endif
f_init();
MAIN__();
f_exit();
}
#ifdef vax
static char *fpenames[] = {
"unknown floating exception",
"integer overflow",
"integer divide by zero",
"floating overflow",
"floating/decimal divide by zero",
"floating underflow",
"decimal overflow",
"subscript out of range",
"floating overflow",
"floating divide by zero",
"floating underflow"
};
_sigfdie(sig, code)
int sig, code;
{
if (code < 0 || code >= sizeof fpenames/sizeof fpenames[0])
code = 0;
_sigdie(fpenames[code], 1);
}
#else
_sigfdie() { _sigdie("floating exception, 1); }
#endif
_sigidie() { _sigdie("IOT Trap", 1); }
_sigqdie() { _sigdie("Quit signal", 1); }
_sigindie() { _sigdie("Interrupt", 0); }
_sigtdie() { _sigdie("Killed", 0); }
_sigdie(s, kill)
register char *s;
int kill;
{
/* print error message, then clear buffers */
fflush(stderr);
fprintf(stderr, "%s\n", s);
f_exit();
fflush(stderr);
if (kill) {
/* now get a core */
signal(SIGIOT, 0);
abort();
/*NOTREACHED*/
}
exit(1);
}