|
|
1.1 ! root 1: static char *sccsid = "@(#)sh.err.c 4.1 10/9/80"; ! 2: ! 3: #include "sh.h" ! 4: #include <sys/ioctl.h> ! 5: ! 6: /* ! 7: * C Shell ! 8: */ ! 9: ! 10: bool errspl; /* Argument to error was spliced by seterr2 */ ! 11: char one[2] = { '1', 0 }; ! 12: char *onev[2] = { one, NOSTR }; ! 13: /* ! 14: * Print error string s with optional argument arg. ! 15: * This routine always resets or exits. The flag haderr ! 16: * is set so the routine who catches the unwind can propogate ! 17: * it if they want. ! 18: * ! 19: * Note that any open files at the point of error will eventually ! 20: * be closed in the routine process in sh.c which is the only ! 21: * place error unwinds are ever caught. ! 22: */ ! 23: error(s, arg) ! 24: char *s; ! 25: { ! 26: register char **v; ! 27: register char *ep; ! 28: ! 29: /* ! 30: * Must flush before we print as we wish output before the error ! 31: * to go on (some form of) standard output, while output after ! 32: * goes on (some form of) diagnostic output. ! 33: * If didfds then output will go to 1/2 else to FSHOUT/FSHDIAG. ! 34: * See flush in sh.print.c. ! 35: */ ! 36: flush(); ! 37: haderr = 1; /* Now to diagnostic output */ ! 38: timflg = 0; /* This isn't otherwise reset */ ! 39: if (v = pargv) ! 40: pargv = 0, blkfree(v); ! 41: if (v = gargv) ! 42: gargv = 0, blkfree(v); ! 43: ! 44: /* ! 45: * A zero arguments causes no printing, else print ! 46: * an error diagnostic here. ! 47: */ ! 48: if (s) ! 49: printf(s, arg), printf(".\n"); ! 50: ! 51: didfds = 0; /* Forget about 0,1,2 */ ! 52: if ((ep = err) && errspl) { ! 53: errspl = 0; ! 54: xfree(ep); ! 55: } ! 56: errspl = 0; ! 57: ! 58: /* ! 59: * Reset the state of the input. ! 60: * This buffered seek to end of file will also ! 61: * clear the while/foreach stack. ! 62: */ ! 63: btoeof(); ! 64: ! 65: /* ! 66: * Go away if -e or we are a child shell ! 67: */ ! 68: if (exiterr || child) ! 69: exit(1); ! 70: ! 71: setq("status", onev, &shvhed); ! 72: if (tpgrp > 0) ! 73: ioctl(FSHTTY, TIOCSPGRP, &tpgrp); ! 74: reset(); /* Unwind */ ! 75: } ! 76: ! 77: /* ! 78: * Perror is the shells version of perror which should otherwise ! 79: * never be called. ! 80: */ ! 81: Perror(s) ! 82: char *s; ! 83: { ! 84: ! 85: /* ! 86: * Perror uses unit 2, thus if we didn't set up the fd's ! 87: * we must set up unit 2 now else the diagnostic will disappear ! 88: */ ! 89: if (!didfds) { ! 90: register int oerrno = errno; ! 91: ! 92: dcopy(SHDIAG, 2); ! 93: errno = oerrno; ! 94: } ! 95: perror(s); ! 96: error(NOSTR); /* To exit or unwind */ ! 97: } ! 98: ! 99: bferr(cp) ! 100: char *cp; ! 101: { ! 102: ! 103: flush(); ! 104: haderr = 1; ! 105: printf("%s: ", bname); ! 106: error(cp); ! 107: } ! 108: ! 109: /* ! 110: * The parser and scanner set up errors for later by calling seterr, ! 111: * which sets the variable err as a side effect; later to be tested, ! 112: * e.g. in process. ! 113: */ ! 114: seterr(s) ! 115: char *s; ! 116: { ! 117: ! 118: if (err == 0) ! 119: err = s, errspl = 0; ! 120: } ! 121: ! 122: /* Set err to a splice of cp and dp, to be freed later in error() */ ! 123: seterr2(cp, dp) ! 124: char *cp, *dp; ! 125: { ! 126: ! 127: if (err) ! 128: return; ! 129: err = strspl(cp, dp); ! 130: errspl++; ! 131: } ! 132: ! 133: /* Set err to a splice of cp with a string form of character d */ ! 134: seterrc(cp, d) ! 135: char *cp, d; ! 136: { ! 137: char chbuf[2]; ! 138: ! 139: chbuf[0] = d; ! 140: chbuf[1] = 0; ! 141: seterr2(cp, chbuf); ! 142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.