|
|
1.1 root 1: /* @(#)word.c 1.4 */
2: /*
3: * UNIX shell
4: *
5: * Bell Telephone Laboratories
6: *
7: */
8:
9: #include "defs.h"
10: #include "sym.h"
11: #include <errno.h>
12:
13: static int readb();
14: static int histc();
15:
16: /* ======== character handling for command lines ========*/
17:
18:
19: word()
20: {
21: register char c, d;
22: int alpha = 1;
23: int lbrok, rbrok;
24:
25: wdnum = 0;
26: wdset = 0;
27:
28: while (1)
29: {
30: while (c = nextc(0), space(c)) /* skipc() */
31: ;
32:
33: if (c == COMCHAR)
34: {
35: while ((c = readc()) != NL && c != EOF);
36: peekc = c;
37: }
38: else
39: {
40: break; /* out of comment - white space loop */
41: }
42: }
43: if (!eofmeta(c))
44: {
45: struct argnod *arg = (struct argnod *)locstak();
46: /* pushstak() starting at arg->argval[0] */
47:
48: staktop += BYTESPERWORD;
49:
50: lbrok = rbrok = 0;
51: do
52: {
53: if (c == LITERAL)
54: {
55: pushstak(DQUOTE);
56: while ((c = readc()) && c != LITERAL)
57: {
58: pushstak(c | QUOTE);
59: if (c == NL)
60: chkpr();
61: }
62: pushstak(DQUOTE);
63: }
64: else
65: {
66: pushstak(c);
67: if (c == '=')
68: wdset |= alpha;
69: /* hack for ${} */
70: else if (c == '$')
71: lbrok++;
72: else if (lbrok)
73: {
74: if (c == '{')
75: rbrok++;
76: lbrok = 0;
77: }
78: else if (rbrok && c == '}')
79: rbrok--;
80: if (!alphanum(c))
81: alpha = 0;
82: if (qotchar(c))
83: {
84: d = c;
85: while ((pushstak(c = nextc(d)), c) && c != d)
86: {
87: if (c == NL)
88: chkpr();
89: }
90: }
91: }
92: } while ((c = nextc(0), !eofmeta(c) || (lbrok && c=='{') || (rbrok && c=='}')));
93: fixstak();
94: if (!letter(arg->argval[0]))
95: wdset = 0;
96:
97: peekn = c | MARK;
98: if (arg->argval[1] == 0 &&
99: (d = arg->argval[0], digit(d)) &&
100: (c == '>' || c == '<'))
101: {
102: word();
103: wdnum = d - '0';
104: }
105: else /*check for reserved words*/
106: {
107: if (reserv == FALSE || (wdval = syslook(arg->argval,reserved, no_reserved)) == 0)
108: {
109: wdarg = arg;
110: wdval = 0;
111: }
112: }
113: }
114: else if (dipchar(c))
115: {
116: if ((d = nextc(0)) == c)
117: {
118: wdval = c | SYMREP;
119: if (c == '<')
120: peekn = nextc(0) | MARK;
121: }
122: else
123: {
124: peekn = d | MARK;
125: wdval = c;
126: }
127: }
128: else
129: {
130: if ((wdval = c) == EOF)
131: wdval = EOFSYM;
132: if (iopend && eolchar(c))
133: {
134: copy(iopend);
135: iopend = 0;
136: }
137: }
138: reserv = FALSE;
139: return(wdval);
140: }
141:
142: skipc()
143: {
144: register char c;
145:
146: while (c = nextc(0), space(c))
147: ;
148: return(c);
149: }
150:
151: nextc(quote)
152: char quote;
153: {
154: register char c, d;
155:
156: retry:
157: if ((d = readc()) == ESCAPE)
158: {
159: if ((c = readc()) == NL)
160: {
161: chkpr();
162: goto retry;
163: }
164: else if (quote && c != quote && !escchar(c))
165: peekc = c | MARK;
166: else
167: d = c | QUOTE;
168: }
169: return(d);
170: }
171: readc()
172: {
173: register char c;
174: register int len;
175: register struct fileblk *f;
176:
177: if (peekn)
178: {
179: peekc = peekn;
180: peekn = 0;
181: }
182: if (peekc)
183: {
184: c = peekc;
185: peekc = 0;
186: return(c);
187: }
188: f = standin;
189: retry:
190: if (f->fnxt != f->fend)
191: {
192: if ((c = *f->fnxt++) == 0)
193: {
194: if (f->feval)
195: {
196: if (estabf(*f->feval++))
197: c = EOF;
198: else
199: c = SP;
200: }
201: else
202: goto retry; /* = c = readc(); */
203: }
204: if (standin->fstak == 0) {
205: if (flags & readpr)
206: prc(c);
207: if (flags & prompt && histnod.namval.val)
208: histc (c);
209: }
210: if (c == NL)
211: f->flin++;
212: }
213: else if (f->feof || f->fdes < 0)
214: {
215: c = EOF;
216: f->feof++;
217: }
218: else if ((len = readb()) <= 0)
219: {
220: close(f->fdes);
221: f->fdes = -1;
222: c = EOF;
223: f->feof++;
224: }
225: else
226: {
227: f->fend = (f->fnxt = f->fbuf) + len;
228: goto retry;
229: }
230: return(c);
231: }
232:
233: static
234: readb()
235: {
236: register struct fileblk *f = standin;
237: register int len;
238:
239: do
240: {
241: if (trapnote & SIGSET)
242: {
243: newline();
244: sigchk();
245: }
246: else if ((trapnote & TRAPSET) && (rwait > 0))
247: {
248: newline();
249: chktrap();
250: clearup();
251: }
252: } while ((len = read(f->fdes, f->fbuf, f->fsiz)) < 0 && errno==EINTR && trapnote);
253: return(len);
254: }
255:
256: int histfd = 0;
257: static histc (c)
258: {
259: static char histbuf[256];
260: static char *histp=histbuf;
261:
262: if (histfd == 0) {
263: if ((histfd = open(histnod.namval.val, 1)) < 0 &&
264: (histfd = creat(histnod.namval.val, 0666)) < 0)
265: return;
266: }
267: if (histfd > 0) {
268: *histp++ = c;
269: if (c == '\n' || c == ';' || histp >= &histbuf[sizeof histbuf]) {
270: lseek(histfd, 0L, 2);
271: write(histfd, histbuf, histp-histbuf);
272: histp = histbuf;
273: }
274: }
275: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.