|
|
1.1 ! root 1: # ! 2: /* ! 3: * UNIX shell ! 4: * ! 5: * S. R. Bourne ! 6: * Bell Telephone Laboratories ! 7: * ! 8: */ ! 9: ! 10: #include "defs.h" ! 11: #include "sym.h" ! 12: ! 13: ! 14: /* ======== character handling for command lines ========*/ ! 15: ! 16: ! 17: word() ! 18: { ! 19: REG CHAR c, d; ! 20: REG CHAR *argp=locstak()+BYTESPERWORD; ! 21: INT alpha=1; ! 22: ! 23: wdnum=0; wdset=0; ! 24: ! 25: WHILE (c=nextc(0), space(c)) DONE ! 26: IF !eofmeta(c) ! 27: THEN REP IF c==LITERAL ! 28: THEN *argp++=(DQUOTE); ! 29: WHILE (c=readc()) ANDF c!=LITERAL ! 30: DO *argp++=(c|QUOTE); chkpr(c) OD ! 31: *argp++=(DQUOTE); ! 32: ELSE *argp++=(c); ! 33: IF c=='=' THEN wdset |= alpha FI ! 34: IF !alphanum(c) THEN alpha=0 FI ! 35: IF qotchar(c) ! 36: THEN d=c; ! 37: WHILE (*argp++=(c=nextc(d))) ANDF c!=d ! 38: DO chkpr(c) OD ! 39: FI ! 40: FI ! 41: PER (c=nextc(0), !eofmeta(c)) DONE ! 42: argp=endstak(argp); ! 43: IF !letter(argp->argval[0]) THEN wdset=0 FI ! 44: ! 45: peekc=c|MARK; ! 46: IF argp->argval[1]==0 ANDF (d=argp->argval[0], digit(d)) ANDF (c=='>' ORF c=='<') ! 47: THEN word(); wdnum=d-'0'; ! 48: ELSE /*check for reserved words*/ ! 49: IF reserv==FALSE ORF (wdval=syslook(argp->argval,reserved))==0 ! 50: THEN wdarg=argp; wdval=0; ! 51: FI ! 52: FI ! 53: ! 54: ELIF dipchar(c) ! 55: THEN IF (d=nextc(0))==c ! 56: THEN wdval = c|SYMREP; ! 57: ELSE peekc = d|MARK; wdval = c; ! 58: FI ! 59: ELSE IF (wdval=c)==EOF ! 60: THEN wdval=EOFSYM; ! 61: FI ! 62: IF iopend ANDF eolchar(c) ! 63: THEN copy(iopend); iopend=0; ! 64: FI ! 65: FI ! 66: reserv=FALSE; ! 67: return(wdval); ! 68: } ! 69: ! 70: nextc(quote) ! 71: CHAR quote; ! 72: { ! 73: REG CHAR c, d; ! 74: IF (d=readc())==ESCAPE ! 75: THEN IF (c=readc())==NL ! 76: THEN chkpr(NL); d=nextc(quote); ! 77: ELIF quote ANDF c!=quote ANDF !escchar(c) ! 78: THEN peekc=c|MARK; ! 79: ELSE d = c|QUOTE; ! 80: FI ! 81: FI ! 82: return(d); ! 83: } ! 84: ! 85: readc() ! 86: { ! 87: REG CHAR c; ! 88: REG INT len; ! 89: REG FILE f; ! 90: ! 91: retry: ! 92: IF peekc ! 93: THEN c=peekc; peekc=0; ! 94: ELIF (f=standin, f->fnxt!=f->fend) ! 95: THEN IF (c = *f->fnxt++)==0 ! 96: THEN IF f->feval ! 97: THEN IF estabf(*f->feval++) ! 98: THEN c=EOF; ! 99: ELSE c=SP; ! 100: FI ! 101: ELSE goto retry; /* = c=readc(); */ ! 102: FI ! 103: FI ! 104: IF flags&readpr ANDF standin->fstak==0 THEN prc(c) FI ! 105: IF c==NL THEN f->flin++ FI ! 106: ELIF f->feof ORF f->fdes<0 ! 107: THEN c=EOF; f->feof++; ! 108: ELIF (len=readb())<=0 ! 109: THEN close(f->fdes); f->fdes = -1; c=EOF; f->feof++; ! 110: ELSE f->fend = (f->fnxt = f->fbuf)+len; ! 111: goto retry; ! 112: FI ! 113: return(c); ! 114: } ! 115: ! 116: LOCAL readb() ! 117: { ! 118: REG FILE f=standin; ! 119: REG INT len; ! 120: ! 121: REP IF trapnote&SIGSET THEN newline(); sigchk() FI ! 122: PER (len=read(f->fdes,f->fbuf,f->fsiz))<0 ANDF trapnote DONE ! 123: return(len); ! 124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.