|
|
1.1 ! root 1: /* ! 2: * adb - main command loop and error/interrupt handling ! 3: */ ! 4: #include "defs.h" ! 5: ! 6: MSG NOEOR; ! 7: ! 8: INT mkfault; ! 9: INT executing; ! 10: INT infile; ! 11: CHAR *lp; ! 12: L_INT maxoff; ! 13: L_INT maxpos; ! 14: SIG sigint; ! 15: SIG sigqit; ! 16: INT wtflag; ! 17: STRING errflg; ! 18: L_INT exitflg; ! 19: ! 20: CHAR lastc; ! 21: INT eof; ! 22: ! 23: INT lastcom; ! 24: ! 25: L_INT maxoff = MAXOFF; ! 26: L_INT maxpos = MAXPOS; ! 27: ! 28: main(argc, argv) ! 29: register char **argv; ! 30: int argc; ! 31: { ! 32: ! 33: mkioptab(); ! 34: while (argc>1 && !strcmp("-w", argv[1])) { ! 35: wtflag = 2; /* suitable for open() */ ! 36: argc--, argv++; ! 37: } ! 38: while (argc>1 && !strcmp("-k", argv[1])) { ! 39: kernel = 1; ! 40: argc--, argv++; ! 41: } ! 42: if (argc > 1) ! 43: symfil = argv[1]; ! 44: if (argc > 2) ! 45: corfil = argv[2]; ! 46: xargc = argc; ! 47: setsym(); setcor(); setvar(); ! 48: ! 49: if ((sigint=signal(SIGINT,SIG_IGN)) != SIG_IGN) { ! 50: sigint = fault; ! 51: signal(SIGINT, fault); ! 52: } ! 53: sigqit = signal(SIGQUIT, SIG_IGN); ! 54: setexit(); ! 55: if (executing) ! 56: delbp(); ! 57: executing = 0; ! 58: for (;;) { ! 59: flushbuf(); ! 60: if (errflg) { ! 61: printf("%s\n", errflg); ! 62: exitflg = 1; ! 63: errflg = 0; ! 64: } ! 65: if (mkfault) { ! 66: mkfault=0; ! 67: printc('\n'); ! 68: printf(DBNAME); ! 69: } ! 70: lp=0; rdc(); lp--; ! 71: if (eof) { ! 72: if (infile) { ! 73: iclose(); eof=0; reset(); ! 74: } else ! 75: done(); ! 76: } else ! 77: exitflg = 0; ! 78: command(0, lastcom); ! 79: if (lp && lastc!='\n') ! 80: error(NOEOR); ! 81: } ! 82: } ! 83: ! 84: done() ! 85: { ! 86: endpcs(); ! 87: exit(exitflg); ! 88: } ! 89: ! 90: L_INT ! 91: round(a,b) ! 92: REG L_INT a, b; ! 93: { ! 94: REG L_INT w; ! 95: w = (a/b)*b; ! 96: IF a!=w THEN w += b; FI ! 97: return(w); ! 98: } ! 99: ! 100: /* ! 101: * If there has been an error or a fault, take the error. ! 102: */ ! 103: chkerr() ! 104: { ! 105: if (errflg || mkfault) ! 106: error(errflg); ! 107: } ! 108: ! 109: /* ! 110: * An error occurred; save the message for later printing, ! 111: * close open files, and reset to main command loop. ! 112: */ ! 113: error(n) ! 114: char *n; ! 115: { ! 116: errflg = n; ! 117: iclose(); oclose(); ! 118: reset(); ! 119: } ! 120: ! 121: /* ! 122: * An interrupt occurred; reset the interrupt ! 123: * catch, seek to the end of the current file ! 124: * and remember that there was a fault. ! 125: */ ! 126: fault(a) ! 127: { ! 128: signal(a, fault); ! 129: lseek(infile, 0L, 2); ! 130: mkfault++; ! 131: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.