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