|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)word.c 4.7 4/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.