Commit | Line | Data |
---|---|---|
f6227721 | 1 | #ifndef lint |
c20151aa | 2 | static 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 | ||
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 | ||
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 | ||
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 | ||
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 | } |