|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)word.c 4.7 4/24/88";
3: #endif
4:
5: #
6: /*
7: * UNIX shell
8: *
9: * S. R. Bourne
10: * Bell Telephone Laboratories
11: *
12: */
13:
14: #include "defs.h"
15: #include "sym.h"
16:
17:
18: /* ======== character handling for command lines ========*/
19:
20:
21: word()
22: {
23: REG CHAR c, d;
24: REG CHAR *argp=locstak()+BYTESPERWORD;
25: REG ARGPTR ap;
26: INT alpha=1;
27:
28: wdnum=0; wdset=0;
29:
30: WHILE (c=nextc(0), space(c)) DONE
31:
32: IF c=='#' ANDF ((flags&prompt)==0 ORF ((flags&ttyflg) ANDF
33: standin->fstak!=0))
34: THEN WHILE (c=readc()) ANDF c!=NL DONE
35: FI
36:
37: IF !eofmeta(c)
38: THEN REP IF c==LITERAL
39: THEN *argp++=(DQUOTE);
40: WHILE (c=readc()) ANDF c!=LITERAL
41: DO *argp++=(c|QUOTE); chkpr(c) OD
42: *argp++=(DQUOTE);
43:
44: ELSE *argp++=(c);
45: IF c=='=' THEN wdset |= alpha FI
46: IF !alphanum(c) THEN alpha=0 FI
47: IF qotchar(c)
48: THEN d=c;
49: WHILE (*argp++=(c=nextc(d))) ANDF c!=d
50: DO chkpr(c) OD
51: FI
52: FI
53: PER (c=nextc(0), !eofmeta(c)) DONE
54: ap=(ARGPTR)endstak(argp);
55: IF !letter(ap->argval[0]) THEN wdset=0 FI
56:
57: peekc=c|MARK;
58: IF ap->argval[1]==0 ANDF (d=ap->argval[0], digit(d)) ANDF (c=='>' ORF c=='<')
59: THEN word(); wdnum=d-'0';
60: ELSE /*check for reserved words*/
61: IF reserv==FALSE ORF (wdval=syslook(ap->argval,reserved))==0
62: THEN wdarg=ap; wdval=0;
63: FI
64: FI
65:
66: ELIF dipchar(c)
67: THEN IF (d=nextc(0))==c
68: THEN wdval = c|SYMREP;
69: ELSE peekc = d|MARK; wdval = c;
70: FI
71: ELSE IF (wdval=c)==EOF
72: THEN wdval=EOFSYM;
73: FI
74: IF iopend ANDF eolchar(c)
75: THEN copy(iopend); iopend=0;
76: FI
77: FI
78: reserv=FALSE;
79: return(wdval);
80: }
81:
82: nextc(quote)
83: CHAR quote;
84: {
85: REG CHAR c, d;
86: IF (d=readc())==ESCAPE
87: THEN IF (c=readc())==NL
88: THEN chkpr(NL); d=nextc(quote);
89: ELIF quote ANDF c!=quote ANDF !escchar(c)
90: THEN peekc=c|MARK;
91: ELSE d = c|QUOTE;
92: FI
93: FI
94: return(d);
95: }
96:
97: readc()
98: {
99: REG CHAR c;
100: REG INT len;
101: REG FILE f;
102:
103: retry:
104: IF peekc
105: THEN c=peekc; peekc=0;
106: ELIF (f=standin, f->fnxt!=f->fend)
107: THEN IF (c = *f->fnxt++)==0
108: THEN IF f->feval
109: THEN IF estabf(*f->feval++)
110: THEN c=EOF;
111: ELSE c=SP;
112: FI
113: ELSE goto retry; /* = c=readc(); */
114: FI
115: FI
116: IF flags&readpr ANDF standin->fstak==0 THEN prc(c) FI
117: IF c==NL THEN f->flin++ FI
118: ELIF f->feof ORF f->fdes<0
119: THEN c=EOF; f->feof++;
120: ELIF (len=readb())<=0
121: THEN close(f->fdes); f->fdes = -1; c=EOF; f->feof++;
122: ELSE f->fend = (f->fnxt = f->fbuf)+len;
123: goto retry;
124: FI
125: return(c);
126: }
127:
128: LOCAL readb()
129: {
130: REG FILE f=standin;
131: REG INT len;
132:
133: IF setjmp(INTbuf) == 0 THEN trapjmp[INTR] = 1; FI
134: REP IF trapnote&SIGSET THEN newline(); sigchk() FI
135: PER (len=read(f->fdes,f->fbuf,f->fsiz))<0 ANDF trapnote DONE
136: trapjmp[INTR] = 0;
137: return(len);
138: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.