Annotation of 43BSDReno/bin/sh/word.c, revision 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.