Annotation of lucent/sys/src/cmd/rc/here.c, revision 1.1

1.1     ! root        1: #include "rc.h"
        !             2: #include "exec.h"
        !             3: #include "io.h"
        !             4: #include "fns.h"
        !             5: struct here *here, **ehere;
        !             6: int ser=0;
        !             7: char tmp[]="/tmp/here0000.0000";
        !             8: char hex[]="0123456789abcdef";
        !             9: void psubst(io*, char*);
        !            10: void pstrs(io*, word*);
        !            11: void hexnum(char *p, int n)
        !            12: {
        !            13:        *p++=hex[(n>>12)&0xF];
        !            14:        *p++=hex[(n>>8)&0xF];
        !            15:        *p++=hex[(n>>4)&0xF];
        !            16:        *p=hex[n&0xF];
        !            17: }
        !            18: tree *heredoc(tree *tag)
        !            19: {
        !            20:        struct here *h=new(struct here);
        !            21:        if(tag->type!=WORD) yyerror("Bad here tag");
        !            22:        h->next=0;
        !            23:        if(here)
        !            24:                *ehere=h;
        !            25:        else
        !            26:                here=h;
        !            27:        ehere=&h->next;
        !            28:        h->tag=tag;
        !            29:        hexnum(&tmp[9], getpid());
        !            30:        hexnum(&tmp[14], ser++);
        !            31:        h->name=strdup(tmp);
        !            32:        return token(tmp, WORD);
        !            33: }
        !            34: /*
        !            35:  * bug: lines longer than NLINE get split -- this can cause spurious
        !            36:  * missubstitution, or a misrecognized EOF marker.
        !            37:  */
        !            38: #define        NLINE   4096
        !            39: void readhere(void){
        !            40:        struct here *h, *nexth;
        !            41:        io *f;
        !            42:        char *s, *tag;
        !            43:        int c, subst;
        !            44:        char line[NLINE+1];
        !            45:        for(h=here;h;h=nexth){
        !            46:                subst=!h->tag->quoted;
        !            47:                tag=h->tag->str;
        !            48:                c=Creat(h->name);
        !            49:                if(c<0) yyerror("can't create here document");
        !            50:                f=openfd(c);
        !            51:                s=line;
        !            52:                pprompt();
        !            53:                while((c=rchr(runq->cmdfd))!=EOF){
        !            54:                        if(c=='\n' || s==&line[NLINE]){
        !            55:                                *s='\0';
        !            56:                                if(strcmp(line, tag)==0) break;
        !            57:                                if(subst) psubst(f, line);
        !            58:                                else pstr(f, line);
        !            59:                                s=line;
        !            60:                                if(c=='\n'){
        !            61:                                        pprompt();
        !            62:                                        pchr(f, c);
        !            63:                                }
        !            64:                                else *s++=c;
        !            65:                        }
        !            66:                        else *s++=c;
        !            67:                }
        !            68:                flush(f);
        !            69:                closeio(f);
        !            70:                cleanhere(h->name);
        !            71:                nexth=h->next;
        !            72:                efree((char *)h);
        !            73:        }
        !            74:        here=0;
        !            75:        doprompt=1;
        !            76: }
        !            77: void psubst(io *f, char *s)
        !            78: {
        !            79:        char *t, *u;
        !            80:        int savec, n, c;
        !            81:        word *star;
        !            82:        while(*s){
        !            83:                if(*s!='$'){
        !            84:                        if(0xa0<=(*s&0xff) && (*s&0xff)<=0xf5){
        !            85:                                pchr(f, *s++);
        !            86:                                if(*s=='\0') break;
        !            87:                        }
        !            88:                        else if(0xf6<=(*s&0xff) && (*s&0xff)<=0xf7){
        !            89:                                pchr(f, *s++);
        !            90:                                if(*s=='\0') break;
        !            91:                                pchr(f, *s++);
        !            92:                                if(*s=='\0') break;
        !            93:                        }
        !            94:                        pchr(f, *s++);
        !            95:                }
        !            96:                else{
        !            97:                        t=++s;
        !            98:                        if(*t=='$') pchr(f, *t++);
        !            99:                        else{
        !           100:                                while(*t && idchr(*t)) t++;
        !           101:                                savec=*t;
        !           102:                                *t='\0';
        !           103:                                n=0;
        !           104:                                for(u=s;*u && '0'<=*u && *u<='9';u++) n=n*10+*u-'0';
        !           105:                                if(n && *u=='\0'){
        !           106:                                        star=vlook("*")->val;
        !           107:                                        if(star && 1<=n && n<=count(star)){
        !           108:                                                while(--n) star=star->next;
        !           109:                                                pstr(f, star->word);
        !           110:                                        }
        !           111:                                }
        !           112:                                else
        !           113:                                        pstrs(f, vlook(s)->val);
        !           114:                                *t=savec;
        !           115:                                if(savec=='^') t++;
        !           116:                        }
        !           117:                        s=t;
        !           118:                }
        !           119:        }
        !           120: }
        !           121: void pstrs(io *f, word *a)
        !           122: {
        !           123:        if(a){
        !           124:                while(a->next && a->next->word){
        !           125:                        pstr(f, a->word);
        !           126:                        pchr(f, ' ');
        !           127:                        a=a->next;
        !           128:                }
        !           129:                pstr(f, a->word);
        !           130:        }
        !           131: }

unix.superglobalmegacorp.com

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