Commit | Line | Data |
---|---|---|
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 | ||
17 | word() | |
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 | ||
70 | nextc(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 | ||
85 | readc() | |
86 | { | |
87 | REG CHAR c; | |
88 | REG INT len; | |
89 | REG FILE f; | |
90 | ||
91 | retry: | |
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 | ||
116 | LOCAL 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 | } |