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