added depend label
[unix-history] / usr / src / old / sh / word.c
CommitLineData
f6227721 1#ifndef lint
c20151aa 2static char sccsid[] = "@(#)word.c 4.6 %G%";
f6227721 3#endif
f2b29b41
KM
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
21word()
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
c20151aa
JB
31 IF c=='#' ANDF ((flags&prompt)==0 ORF ((flags&ttyflg) ANDF
32 standin->fstak!=0))
f2b29b41
KM
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
81nextc(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
96readc()
97{
98 REG CHAR c;
99 REG INT len;
100 REG FILE f;
101
102retry:
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
127LOCAL readb()
128{
129 REG FILE f=standin;
130 REG INT len;
131
22674779 132 IF setjmp(INTbuf) == 0 THEN trapjmp[INTR] = 1; FI
f2b29b41
KM
133 REP IF trapnote&SIGSET THEN newline(); sigchk() FI
134 PER (len=read(f->fdes,f->fbuf,f->fsiz))<0 ANDF trapnote DONE
22674779 135 trapjmp[INTR] = 0;
f2b29b41
KM
136 return(len);
137}