xref: /original-bsd/old/sh/word.c (revision 28301386)
1 #ifndef lint
2 static char sccsid[] = "@(#)word.c	4.7 04/24/88";
3 #endif
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 	REG ARGPTR	ap;
26 	INT		alpha=1;
27 
28 	wdnum=0; wdset=0;
29 
30 	WHILE (c=nextc(0), space(c)) DONE
31 
32 	IF c=='#' ANDF ((flags&prompt)==0 ORF ((flags&ttyflg) ANDF
33 	    standin->fstak!=0))
34 	THEN	WHILE (c=readc()) ANDF c!=NL DONE
35 	FI
36 
37 	IF !eofmeta(c)
38 	THEN	REP	IF c==LITERAL
39 			THEN	*argp++=(DQUOTE);
40 				WHILE (c=readc()) ANDF c!=LITERAL
41 				DO *argp++=(c|QUOTE); chkpr(c) OD
42 				*argp++=(DQUOTE);
43 
44 			ELSE	*argp++=(c);
45 				IF c=='=' THEN wdset |= alpha FI
46 				IF !alphanum(c) THEN alpha=0 FI
47 				IF qotchar(c)
48 				THEN	d=c;
49 					WHILE (*argp++=(c=nextc(d))) ANDF c!=d
50 					DO chkpr(c) OD
51 				FI
52 			FI
53 		PER (c=nextc(0), !eofmeta(c)) DONE
54 		ap=(ARGPTR)endstak(argp);
55 		IF !letter(ap->argval[0]) THEN wdset=0 FI
56 
57 		peekc=c|MARK;
58 		IF ap->argval[1]==0 ANDF (d=ap->argval[0], digit(d)) ANDF (c=='>' ORF c=='<')
59 		THEN	word(); wdnum=d-'0';
60 		ELSE	/*check for reserved words*/
61 			IF reserv==FALSE ORF (wdval=syslook(ap->argval,reserved))==0
62 			THEN	wdarg=ap; wdval=0;
63 			FI
64 		FI
65 
66 	ELIF dipchar(c)
67 	THEN	IF (d=nextc(0))==c
68 		THEN	wdval = c|SYMREP;
69 		ELSE	peekc = d|MARK; wdval = c;
70 		FI
71 	ELSE	IF (wdval=c)==EOF
72 		THEN	wdval=EOFSYM;
73 		FI
74 		IF iopend ANDF eolchar(c)
75 		THEN	copy(iopend); iopend=0;
76 		FI
77 	FI
78 	reserv=FALSE;
79 	return(wdval);
80 }
81 
82 nextc(quote)
83 	CHAR		quote;
84 {
85 	REG CHAR	c, d;
86 	IF (d=readc())==ESCAPE
87 	THEN	IF (c=readc())==NL
88 		THEN	chkpr(NL); d=nextc(quote);
89 		ELIF quote ANDF c!=quote ANDF !escchar(c)
90 		THEN	peekc=c|MARK;
91 		ELSE	d = c|QUOTE;
92 		FI
93 	FI
94 	return(d);
95 }
96 
97 readc()
98 {
99 	REG CHAR	c;
100 	REG INT		len;
101 	REG FILE	f;
102 
103 retry:
104 	IF peekc
105 	THEN	c=peekc; peekc=0;
106 	ELIF (f=standin, f->fnxt!=f->fend)
107 	THEN	IF (c = *f->fnxt++)==0
108 		THEN	IF f->feval
109 			THEN	IF estabf(*f->feval++)
110 				THEN	c=EOF;
111 				ELSE	c=SP;
112 				FI
113 			ELSE	goto retry; /* = c=readc(); */
114 			FI
115 		FI
116 		IF flags&readpr ANDF standin->fstak==0 THEN prc(c) FI
117 		IF c==NL THEN f->flin++ FI
118 	ELIF f->feof ORF f->fdes<0
119 	THEN	c=EOF; f->feof++;
120 	ELIF (len=readb())<=0
121 	THEN	close(f->fdes); f->fdes = -1; c=EOF; f->feof++;
122 	ELSE	f->fend = (f->fnxt = f->fbuf)+len;
123 		goto retry;
124 	FI
125 	return(c);
126 }
127 
128 LOCAL	readb()
129 {
130 	REG FILE	f=standin;
131 	REG INT		len;
132 
133 	IF setjmp(INTbuf) == 0 THEN trapjmp[INTR] = 1; FI
134 	REP	IF trapnote&SIGSET THEN newline(); sigchk() FI
135 	PER (len=read(f->fdes,f->fbuf,f->fsiz))<0 ANDF trapnote DONE
136 	trapjmp[INTR] = 0;
137 	return(len);
138 }
139