xref: /csrg-svn/old/sh/word.c (revision 34082)
114480Ssam #ifndef lint
2*34082Sbostic static char sccsid[] = "@(#)word.c	4.7 04/24/88";
314480Ssam #endif
46709Smckusick 
56709Smckusick #
66709Smckusick /*
76709Smckusick  * UNIX shell
86709Smckusick  *
96709Smckusick  * S. R. Bourne
106709Smckusick  * Bell Telephone Laboratories
116709Smckusick  *
126709Smckusick  */
136709Smckusick 
146709Smckusick #include	"defs.h"
156709Smckusick #include	"sym.h"
166709Smckusick 
176709Smckusick 
186709Smckusick /* ========	character handling for command lines	========*/
196709Smckusick 
206709Smckusick 
word()216709Smckusick word()
226709Smckusick {
236709Smckusick 	REG CHAR	c, d;
246709Smckusick 	REG CHAR	*argp=locstak()+BYTESPERWORD;
25*34082Sbostic 	REG ARGPTR	ap;
266709Smckusick 	INT		alpha=1;
276709Smckusick 
286709Smckusick 	wdnum=0; wdset=0;
296709Smckusick 
306709Smckusick 	WHILE (c=nextc(0), space(c)) DONE
316709Smckusick 
3225356Sbloom 	IF c=='#' ANDF ((flags&prompt)==0 ORF ((flags&ttyflg) ANDF
3325356Sbloom 	    standin->fstak!=0))
346709Smckusick 	THEN	WHILE (c=readc()) ANDF c!=NL DONE
356709Smckusick 	FI
366709Smckusick 
376709Smckusick 	IF !eofmeta(c)
386709Smckusick 	THEN	REP	IF c==LITERAL
396709Smckusick 			THEN	*argp++=(DQUOTE);
406709Smckusick 				WHILE (c=readc()) ANDF c!=LITERAL
416709Smckusick 				DO *argp++=(c|QUOTE); chkpr(c) OD
426709Smckusick 				*argp++=(DQUOTE);
436709Smckusick 
446709Smckusick 			ELSE	*argp++=(c);
456709Smckusick 				IF c=='=' THEN wdset |= alpha FI
466709Smckusick 				IF !alphanum(c) THEN alpha=0 FI
476709Smckusick 				IF qotchar(c)
486709Smckusick 				THEN	d=c;
496709Smckusick 					WHILE (*argp++=(c=nextc(d))) ANDF c!=d
506709Smckusick 					DO chkpr(c) OD
516709Smckusick 				FI
526709Smckusick 			FI
536709Smckusick 		PER (c=nextc(0), !eofmeta(c)) DONE
54*34082Sbostic 		ap=(ARGPTR)endstak(argp);
55*34082Sbostic 		IF !letter(ap->argval[0]) THEN wdset=0 FI
566709Smckusick 
576709Smckusick 		peekc=c|MARK;
58*34082Sbostic 		IF ap->argval[1]==0 ANDF (d=ap->argval[0], digit(d)) ANDF (c=='>' ORF c=='<')
596709Smckusick 		THEN	word(); wdnum=d-'0';
606709Smckusick 		ELSE	/*check for reserved words*/
61*34082Sbostic 			IF reserv==FALSE ORF (wdval=syslook(ap->argval,reserved))==0
62*34082Sbostic 			THEN	wdarg=ap; wdval=0;
636709Smckusick 			FI
646709Smckusick 		FI
656709Smckusick 
666709Smckusick 	ELIF dipchar(c)
676709Smckusick 	THEN	IF (d=nextc(0))==c
686709Smckusick 		THEN	wdval = c|SYMREP;
696709Smckusick 		ELSE	peekc = d|MARK; wdval = c;
706709Smckusick 		FI
716709Smckusick 	ELSE	IF (wdval=c)==EOF
726709Smckusick 		THEN	wdval=EOFSYM;
736709Smckusick 		FI
746709Smckusick 		IF iopend ANDF eolchar(c)
756709Smckusick 		THEN	copy(iopend); iopend=0;
766709Smckusick 		FI
776709Smckusick 	FI
786709Smckusick 	reserv=FALSE;
796709Smckusick 	return(wdval);
806709Smckusick }
816709Smckusick 
nextc(quote)826709Smckusick nextc(quote)
836709Smckusick 	CHAR		quote;
846709Smckusick {
856709Smckusick 	REG CHAR	c, d;
866709Smckusick 	IF (d=readc())==ESCAPE
876709Smckusick 	THEN	IF (c=readc())==NL
886709Smckusick 		THEN	chkpr(NL); d=nextc(quote);
896709Smckusick 		ELIF quote ANDF c!=quote ANDF !escchar(c)
906709Smckusick 		THEN	peekc=c|MARK;
916709Smckusick 		ELSE	d = c|QUOTE;
926709Smckusick 		FI
936709Smckusick 	FI
946709Smckusick 	return(d);
956709Smckusick }
966709Smckusick 
readc()976709Smckusick readc()
986709Smckusick {
996709Smckusick 	REG CHAR	c;
1006709Smckusick 	REG INT		len;
1016709Smckusick 	REG FILE	f;
1026709Smckusick 
1036709Smckusick retry:
1046709Smckusick 	IF peekc
1056709Smckusick 	THEN	c=peekc; peekc=0;
1066709Smckusick 	ELIF (f=standin, f->fnxt!=f->fend)
1076709Smckusick 	THEN	IF (c = *f->fnxt++)==0
1086709Smckusick 		THEN	IF f->feval
1096709Smckusick 			THEN	IF estabf(*f->feval++)
1106709Smckusick 				THEN	c=EOF;
1116709Smckusick 				ELSE	c=SP;
1126709Smckusick 				FI
1136709Smckusick 			ELSE	goto retry; /* = c=readc(); */
1146709Smckusick 			FI
1156709Smckusick 		FI
1166709Smckusick 		IF flags&readpr ANDF standin->fstak==0 THEN prc(c) FI
1176709Smckusick 		IF c==NL THEN f->flin++ FI
1186709Smckusick 	ELIF f->feof ORF f->fdes<0
1196709Smckusick 	THEN	c=EOF; f->feof++;
1206709Smckusick 	ELIF (len=readb())<=0
1216709Smckusick 	THEN	close(f->fdes); f->fdes = -1; c=EOF; f->feof++;
1226709Smckusick 	ELSE	f->fend = (f->fnxt = f->fbuf)+len;
1236709Smckusick 		goto retry;
1246709Smckusick 	FI
1256709Smckusick 	return(c);
1266709Smckusick }
1276709Smckusick 
readb()1286709Smckusick LOCAL	readb()
1296709Smckusick {
1306709Smckusick 	REG FILE	f=standin;
1316709Smckusick 	REG INT		len;
1326709Smckusick 
13312992Ssam 	IF setjmp(INTbuf) == 0 THEN trapjmp[INTR] = 1; FI
1346709Smckusick 	REP	IF trapnote&SIGSET THEN newline(); sigchk() FI
1356709Smckusick 	PER (len=read(f->fdes,f->fbuf,f->fsiz))<0 ANDF trapnote DONE
13612992Ssam 	trapjmp[INTR] = 0;
1376709Smckusick 	return(len);
1386709Smckusick }
139