Annotation of researchv9/cmd/adb/comm/main.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * adb - main command loop and error/interrupt handling
                      3:  */
                      4: #include "defs.h"
                      5: #include <signal.h>
                      6: #include <setjmp.h>
                      7: 
                      8: char *errflg;
                      9: BOOL wtflag;
                     10: 
                     11: BOOL mkfault;
                     12: ADDR maxoff;
                     13: 
                     14: int xargc;             /* bullshit */
                     15: 
                     16: extern BOOL    executing;
                     17: extern int     infile;
                     18: static int     exitflg;
                     19: int    (*sigint)();
                     20: int    (*sigqit)();
                     21: 
                     22: extern char    lastc;
                     23: extern int     eof;
                     24: 
                     25: extern char    *Ipath;
                     26: static jmp_buf env;
                     27: 
                     28: main(argc, argv)
                     29: register char **argv;
                     30: int argc;
                     31: {
                     32:        extern int fault();
                     33: 
                     34:        maxoff = MAXOFF;
                     35: another:
                     36:        if (argc>1) {
                     37:                if (strcmp("-w", argv[1]) == 0) {
                     38:                        wtflag = 2;             /* suitable for open() */
                     39:                        argc--, argv++;
                     40:                        goto another;
                     41:                }
                     42:                if (argv[1][0] == '-' && argv[1][1] == 'I') {
                     43:                        Ipath = argv[1]+2;
                     44:                        argc--, argv++;
                     45:                }
                     46:        }
                     47:        if (argc > 1)
                     48:                symfil = argv[1];
                     49:        if (argc > 2)
                     50:                corfil = argv[2];
                     51:        xargc = argc;
                     52:        mchinit();
                     53:        setsym();
                     54:        setcor();
                     55:        setvar();
                     56: 
                     57:        if ((sigint=signal(SIGINT,SIG_IGN)) != SIG_IGN) {
                     58:                sigint = fault;
                     59:                signal(SIGINT, fault);
                     60:        }
                     61:        sigqit = signal(SIGQUIT, SIG_IGN);
                     62:        setjmp(env);
                     63:        if (executing)
                     64:                delbp();
                     65:        executing = FALSE;
                     66:        for (;;) {
                     67:                flushbuf();
                     68:                if (errflg) {
                     69:                        printf("%s\n", errflg);
                     70:                        exitflg = 1;
                     71:                        errflg = NULL;
                     72:                }
                     73:                if (mkfault) {
                     74:                        mkfault=0;
                     75:                        printc('\n');
                     76:                        prints(DBNAME);
                     77:                }
                     78:                clrinp();
                     79:                rdc();
                     80:                reread();
                     81:                if (eof) {
                     82:                        if (infile == STDIN)
                     83:                                done();
                     84:                        iclose(-1, 0);
                     85:                        eof = 0;
                     86:                        longjmp(env, 1);
                     87:                }
                     88:                exitflg = 0;
                     89:                command((char *)NULL, 0);
                     90:                reread();
                     91:                if (rdc() != '\n')
                     92:                        error("newline expected");
                     93:        }
                     94: }
                     95: 
                     96: done()
                     97: {
                     98:        if (pid)
                     99:                endpcs();
                    100:        exit(exitflg);
                    101: }
                    102: 
                    103: WORD
                    104: round(a,b)
                    105: register WORD a, b;
                    106: {
                    107:        register WORD w;
                    108: 
                    109:        w = (a/b)*b;
                    110:        if (a!=w)
                    111:                w += b;
                    112:        return(w);
                    113: }
                    114: 
                    115: /*
                    116:  * If there has been an error or a fault, take the error.
                    117:  */
                    118: chkerr()
                    119: {
                    120:        if (errflg || mkfault)
                    121:                error(errflg);
                    122: }
                    123: 
                    124: /*
                    125:  * An error occurred; save the message for later printing,
                    126:  * close open files, and reset to main command loop.
                    127:  */
                    128: error(n)
                    129: char *n;
                    130: {
                    131:        errflg = n;
                    132:        iclose(0, 1);
                    133:        oclose();
                    134:        longjmp(env, 1);
                    135: }
                    136: 
                    137: /*
                    138:  * An interrupt occurred; reset the interrupt
                    139:  * catch, seek to the end of the current file
                    140:  * and remember that there was a fault.
                    141:  */
                    142: fault(a)
                    143: {
                    144:        signal(a, fault);
                    145:        lseek(infile, 0L, 2);
                    146:        mkfault++;
                    147: }

unix.superglobalmegacorp.com

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