1: #ifndef lint
2: static char sccsid[] = "@(#)word.c 4.6 10/31/85";
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: INT alpha=1;
26:
27: wdnum=0; wdset=0;
28:
29: WHILE (c=nextc(0), space(c)) DONE
30:
31: IF c=='#' ANDF ((flags&prompt)==0 ORF ((flags&ttyflg) ANDF
32: standin->fstak!=0))
33: THEN WHILE (c=readc()) ANDF c!=NL DONE
34: FI
35:
36: IF !eofmeta(c)
37: THEN REP IF c==LITERAL
38: THEN *argp++=(DQUOTE);
39: WHILE (c=readc()) ANDF c!=LITERAL
40: DO *argp++=(c|QUOTE); chkpr(c) OD
41: *argp++=(DQUOTE);
42:
43: ELSE *argp++=(c);
44: IF c=='=' THEN wdset |= alpha FI
45: IF !alphanum(c) THEN alpha=0 FI
46: IF qotchar(c)
47: THEN d=c;
48: WHILE (*argp++=(c=nextc(d))) ANDF c!=d
49: DO chkpr(c) OD
50: FI
51: FI
52: PER (c=nextc(0), !eofmeta(c)) DONE
53: argp=endstak(argp);
54: IF !letter(argp->argval[0]) THEN wdset=0 FI
55:
56: peekc=c|MARK;
57: IF argp->argval[1]==0 ANDF (d=argp->argval[0], digit(d)) ANDF (c=='>' ORF c=='<')
58: THEN word(); wdnum=d-'0';
59: ELSE /*check for reserved words*/
60: IF reserv==FALSE ORF (wdval=syslook(argp->argval,reserved))==0
61: THEN wdarg=argp; wdval=0;
62: FI
63: FI
64:
65: ELIF dipchar(c)
66: THEN IF (d=nextc(0))==c
67: THEN wdval = c|SYMREP;
68: ELSE peekc = d|MARK; wdval = c;
69: FI
70: ELSE IF (wdval=c)==EOF
71: THEN wdval=EOFSYM;
72: FI
73: IF iopend ANDF eolchar(c)
74: THEN copy(iopend); iopend=0;
75: FI
76: FI
77: reserv=FALSE;
78: return(wdval);
79: }
80:
81: nextc(quote)
82: CHAR quote;
83: {
84: REG CHAR c, d;
85: IF (d=readc())==ESCAPE
86: THEN IF (c=readc())==NL
87: THEN chkpr(NL); d=nextc(quote);
88: ELIF quote ANDF c!=quote ANDF !escchar(c)
89: THEN peekc=c|MARK;
90: ELSE d = c|QUOTE;
91: FI
92: FI
93: return(d);
94: }
95:
96: readc()
97: {
98: REG CHAR c;
99: REG INT len;
100: REG FILE f;
101:
102: retry:
103: IF peekc
104: THEN c=peekc; peekc=0;
105: ELIF (f=standin, f->fnxt!=f->fend)
106: THEN IF (c = *f->fnxt++)==0
107: THEN IF f->feval
108: THEN IF estabf(*f->feval++)
109: THEN c=EOF;
110: ELSE c=SP;
111: FI
112: ELSE goto retry; /* = c=readc(); */
113: FI
114: FI
115: IF flags&readpr ANDF standin->fstak==0 THEN prc(c) FI
116: IF c==NL THEN f->flin++ FI
117: ELIF f->feof ORF f->fdes<0
118: THEN c=EOF; f->feof++;
119: ELIF (len=readb())<=0
120: THEN close(f->fdes); f->fdes = -1; c=EOF; f->feof++;
121: ELSE f->fend = (f->fnxt = f->fbuf)+len;
122: goto retry;
123: FI
124: return(c);
125: }
126:
127: LOCAL readb()
128: {
129: REG FILE f=standin;
130: REG INT len;
131:
132: IF setjmp(INTbuf) == 0 THEN trapjmp[INTR] = 1; FI
133: REP IF trapnote&SIGSET THEN newline(); sigchk() FI
134: PER (len=read(f->fdes,f->fbuf,f->fsiz))<0 ANDF trapnote DONE
135: trapjmp[INTR] = 0;
136: return(len);
137: }
Defined functions
nextc
defined in line
81; used 8 times
readc
defined in line
96; used 15 times
word
defined in line
21; used 9 times
Defined variables
sccsid
defined in line
2;
never used