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()216709Smckusickword() 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)826709Smckusicknextc(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()976709Smckusickreadc() 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()1286709SmckusickLOCAL 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