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