|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.