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