Annotation of 43BSDReno/bin/sh/word.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.