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