Annotation of 3BSD/cmd/sh/word.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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