Annotation of 43BSDReno/lib/libF77/main.c, revision 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.