|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)word.c 4.3 8/11/83"; ! 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: INT alpha=1; ! 26: ! 27: wdnum=0; wdset=0; ! 28: ! 29: WHILE (c=nextc(0), space(c)) DONE ! 30: ! 31: IF c=='#' ! 32: THEN WHILE (c=readc()) ANDF c!=NL DONE ! 33: FI ! 34: ! 35: IF !eofmeta(c) ! 36: THEN REP IF c==LITERAL ! 37: THEN *argp++=(DQUOTE); ! 38: WHILE (c=readc()) ANDF c!=LITERAL ! 39: DO *argp++=(c|QUOTE); chkpr(c) OD ! 40: *argp++=(DQUOTE); ! 41: ! 42: ELSE *argp++=(c); ! 43: IF c=='=' THEN wdset |= alpha FI ! 44: IF !alphanum(c) THEN alpha=0 FI ! 45: IF qotchar(c) ! 46: THEN d=c; ! 47: WHILE (*argp++=(c=nextc(d))) ANDF c!=d ! 48: DO chkpr(c) OD ! 49: FI ! 50: FI ! 51: PER (c=nextc(0), !eofmeta(c)) DONE ! 52: argp=endstak(argp); ! 53: IF !letter(argp->argval[0]) THEN wdset=0 FI ! 54: ! 55: peekc=c|MARK; ! 56: IF argp->argval[1]==0 ANDF (d=argp->argval[0], digit(d)) ANDF (c=='>' ORF c=='<') ! 57: THEN word(); wdnum=d-'0'; ! 58: ELSE /*check for reserved words*/ ! 59: IF reserv==FALSE ORF (wdval=syslook(argp->argval,reserved))==0 ! 60: THEN wdarg=argp; wdval=0; ! 61: FI ! 62: FI ! 63: ! 64: ELIF dipchar(c) ! 65: THEN IF (d=nextc(0))==c ! 66: THEN wdval = c|SYMREP; ! 67: ELSE peekc = d|MARK; wdval = c; ! 68: FI ! 69: ELSE IF (wdval=c)==EOF ! 70: THEN wdval=EOFSYM; ! 71: FI ! 72: IF iopend ANDF eolchar(c) ! 73: THEN copy(iopend); iopend=0; ! 74: FI ! 75: FI ! 76: reserv=FALSE; ! 77: return(wdval); ! 78: } ! 79: ! 80: nextc(quote) ! 81: CHAR quote; ! 82: { ! 83: REG CHAR c, d; ! 84: IF (d=readc())==ESCAPE ! 85: THEN IF (c=readc())==NL ! 86: THEN chkpr(NL); d=nextc(quote); ! 87: ELIF quote ANDF c!=quote ANDF !escchar(c) ! 88: THEN peekc=c|MARK; ! 89: ELSE d = c|QUOTE; ! 90: FI ! 91: FI ! 92: return(d); ! 93: } ! 94: ! 95: readc() ! 96: { ! 97: REG CHAR c; ! 98: REG INT len; ! 99: REG FILE f; ! 100: ! 101: retry: ! 102: IF peekc ! 103: THEN c=peekc; peekc=0; ! 104: ELIF (f=standin, f->fnxt!=f->fend) ! 105: THEN IF (c = *f->fnxt++)==0 ! 106: THEN IF f->feval ! 107: THEN IF estabf(*f->feval++) ! 108: THEN c=EOF; ! 109: ELSE c=SP; ! 110: FI ! 111: ELSE goto retry; /* = c=readc(); */ ! 112: FI ! 113: FI ! 114: IF flags&readpr ANDF standin->fstak==0 THEN prc(c) FI ! 115: IF c==NL THEN f->flin++ FI ! 116: ELIF f->feof ORF f->fdes<0 ! 117: THEN c=EOF; f->feof++; ! 118: ELIF (len=readb())<=0 ! 119: THEN close(f->fdes); f->fdes = -1; c=EOF; f->feof++; ! 120: ELSE f->fend = (f->fnxt = f->fbuf)+len; ! 121: goto retry; ! 122: FI ! 123: return(c); ! 124: } ! 125: ! 126: LOCAL readb() ! 127: { ! 128: REG FILE f=standin; ! 129: REG INT len; ! 130: ! 131: IF setjmp(INTbuf) == 0 THEN trapjmp[INTR] = 1; FI ! 132: REP IF trapnote&SIGSET THEN newline(); sigchk() FI ! 133: PER (len=read(f->fdes,f->fbuf,f->fsiz))<0 ANDF trapnote DONE ! 134: trapjmp[INTR] = 0; ! 135: return(len); ! 136: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.