Annotation of 43BSDReno/lib/libF77/main.c, revision 1.1.1.1

1.1       root        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.5     5/29/90
                      7:  */
                      8: #include <stdio.h>
                      9: #include <signal.h>
                     10: #include "../libI77/fiodefs.h"
                     11: 
                     12: extern int errno;
                     13: char *getenv();
                     14: int xargc;
                     15: char **xargv;
                     16: 
                     17: main(argc, argv, arge)
                     18: int argc;
                     19: char **argv;
                     20: char **arge;
                     21: {
                     22: void sigdie();
                     23: sig_t sigf;
                     24: int signum;
                     25: 
                     26: xargc = argc;
                     27: xargv = argv;
                     28: 
                     29: for (signum=1; signum<=16; signum++)
                     30: {
                     31:        if((sigf=signal(signum, sigdie)) != SIG_DFL) signal(signum, sigf);
                     32: }
                     33: 
                     34: #ifdef pdp11
                     35:        ldfps(01200); /* detect overflow as an exception */
                     36: #endif
                     37: 
                     38: f_init();
                     39: MAIN_();
                     40: f_exit();
                     41: return 0;
                     42: }
                     43: 
                     44: struct action {
                     45:        char *mesg;
                     46:        int   core;
                     47: } sig_act[16] = {
                     48:        {"Hangup", 0},                  /* SIGHUP  */
                     49:        {"Interrupt!", 0},              /* SIGINT  */
                     50:        {"Quit!", 1},                   /* SIGQUIT */
                     51:        {"Illegal ", 1},                /* SIGILL  */
                     52:        {"Trace Trap", 1},              /* SIGTRAP */
                     53:        {"IOT Trap", 1},                /* SIGIOT  */
                     54:        {"EMT Trap", 1},                /* SIGEMT  */
                     55:        {"Arithmetic Exception", 1},    /* SIGFPE  */
                     56:        { 0, 0},                        /* SIGKILL */
                     57:        {"Bus error", 1},               /* SIGBUS  */
                     58:        {"Segmentation violation", 1},  /* SIGSEGV */
                     59:        {"Sys arg", 1},                 /* SIGSYS  */
                     60:        {"Open pipe", 0},               /* SIGPIPE */
                     61:        {"Alarm", 0},                   /* SIGALRM */
                     62:        {"Terminated", 0},              /* SIGTERM */
                     63:        {"Sig 16", 0},                  /* unassigned */
                     64: };
                     65: 
                     66: #ifdef tahoe
                     67: /* The following arrays are defined & used assuming that signal codes are 
                     68:    1 to 5 for SIGFPE, and 0 to 3 for SIGILL. 
                     69:    Actually ILL_ALIGN_FAULT=14, and is mapped to 3. */
                     70: 
                     71: #define N_ACT_ILL 4                    /* number of entries in act_ill[] */
                     72: #define N_ACT_FPE 5                    /* number of entries in act_fpe[] */
                     73: #define ILL_ALIGN_FAULT 14
                     74: 
                     75: struct action act_fpe[] = {
                     76:        {"Integer overflow", 1},
                     77:        {"Integer divide by 0", 1},
                     78:        {"Floating divide by zero", 1},
                     79:        {"Floating point overflow", 1},
                     80:        {"Floating point underflow", 1},
                     81: };
                     82: 
                     83: #else vax || pdp11
                     84: 
                     85: struct action act_fpe[] = {
                     86:        {"Integer overflow", 1},
                     87:        {"Integer divide by 0", 1},
                     88:        {"Floating point overflow trap", 1},
                     89:        {"Floating divide by zero trap", 1},
                     90:        {"Floating point underflow trap", 1},
                     91:        {"Decimal overflow", 1},
                     92:        {"Subscript range", 1},
                     93:        {"Floating point overflow", 0},
                     94:        {"Floating divide by zero", 0},
                     95:        {"Floating point underflow", 0},
                     96: };
                     97: #endif vax || pdp11
                     98: 
                     99: struct action act_ill[] = {
                    100:        {"addr mode", 1},
                    101:        {"instruction", 1},
                    102:        {"operand", 0},
                    103: #ifdef tahoe
                    104:        {"alignment", 1},
                    105: #endif tahoe
                    106: };
                    107: 
                    108: #if (defined(vax) || defined(tahoe))
                    109: void
                    110: sigdie(s, t, sc)
                    111: int s; int t; struct sigcontext *sc;
                    112: 
                    113: #else  pdp11
                    114: 
                    115: void
                    116: sigdie(s, t, pc)
                    117: int s; int t; long pc;
                    118: 
                    119: #endif pdp11
                    120: {
                    121: extern unit units[];
                    122: register struct action *act = &sig_act[s-1];
                    123: /* print error message, then flush buffers */
                    124: 
                    125: if (s == SIGHUP || s == SIGINT || s == SIGQUIT)
                    126:        signal(s, SIG_IGN);     /* don't allow it again */
                    127: else
                    128:        signal(s, SIG_DFL);     /* shouldn't happen again, but ... */
                    129: 
                    130: if (act->mesg)
                    131:        {
                    132:        fprintf(units[STDERR].ufd, "*** %s", act->mesg);
                    133:        if (s == SIGFPE)
                    134:                {
                    135: #ifndef tahoe
                    136:                if (t >= 1 && t <= 10)
                    137: #else tahoe
                    138:                if ((t-1) >= 0 && t < N_ACT_FPE)
                    139: #endif tahoe
                    140:                        fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg);
                    141:                else
                    142:                        fprintf(units[STDERR].ufd, ": Type=%d?", t);
                    143:                }
                    144:        else if (s == SIGILL)
                    145:                {
                    146: #ifndef tahoe
                    147:                if (t == 4) t = 2;      /* 4.0bsd botch */
                    148:                if (t >= 0 && t <= 2)
                    149: #else tahoe
                    150:                if (t == ILL_ALIGN_FAULT)       /* ILL_ALIGN_FAULT maps to last
                    151:                        t = N_ACT_ILL-1;           entry in act_ill[] */
                    152:                if (t >= 0 && t < N_ACT_ILL)
                    153: #endif tahoe
                    154:                        fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg);
                    155:                else
                    156:                        fprintf(units[STDERR].ufd, "compat mode: Code=%d", t);
                    157:                }
                    158:        putc('\n', units[STDERR].ufd);
                    159:        }
                    160: f77_abort( s, act->core );
                    161: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.