From 566d54fe549286895fdef8aa9f385686405dd290 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Wed, 13 Oct 2021 16:46:20 -0700 Subject: RM(rc): old code. too many assumptions baked in --- sys/cmd/rc/here.c | 153 ------------------------------------------------------ 1 file changed, 153 deletions(-) delete mode 100644 sys/cmd/rc/here.c (limited to 'sys/cmd/rc/here.c') diff --git a/sys/cmd/rc/here.c b/sys/cmd/rc/here.c deleted file mode 100644 index 8175b04..0000000 --- a/sys/cmd/rc/here.c +++ /dev/null @@ -1,153 +0,0 @@ -#include "rc.h" -#include "exec.h" -#include "io.h" -#include "fns.h" - -struct Here *here, **ehere; - -int ser = 0; -char tmp[]="/tmp/here0000.0000"; -char hex[]="0123456789abcdef"; -void psubst(Io*, char*); -void pstrs(Io*, Word*); - -void -hexnum(char *p, int n) -{ - *p++=hex[(n>>12)&0xF]; - *p++=hex[(n>>8)&0xF]; - *p++=hex[(n>>4)&0xF]; - *p = hex[n&0xF]; -} - -Tree* -heredoc(Tree *tag) -{ - struct Here *h = new(struct Here); - - if(tag->type!=WORD) - yyerror("Bad here tag"); - h->next = 0; - if(here) - *ehere = h; - else - here = h; - ehere=&h->next; - h->tag = tag; - hexnum(&tmp[9], getpid()); - hexnum(&tmp[14], ser++); - h->name = strdup(tmp); - return token(tmp, WORD); -} -/* - * bug: lines longer than NLINE get split -- this can cause spurious - * missubstitution, or a misrecognized EOF marker. - */ -#define NLINE 4096 - -void -readhere(void) -{ - struct Here *h, *nexth; - Io *f; - char *s, *tag; - int c, subst; - char line[NLINE+1]; - for(h = here;h;h = nexth){ - subst=!h->tag->quoted; - tag = h->tag->str; - c = Creat(h->name); - if(c<0) - yyerror("can't create here document"); - f = openfd(c); - s = line; - pprompt(); - while((c = rchr(runq->cmdfd))!=EOF){ - if(c=='\n' || s==&line[NLINE]){ - *s='\0'; - if(tag && strcmp(line, tag)==0) break; - if(subst) - psubst(f, line); - else pstr(f, line); - s = line; - if(c=='\n'){ - pprompt(); - pchr(f, c); - } - else *s++=c; - } - else *s++=c; - } - flush(f); - closeio(f); - cleanhere(h->name); - nexth = h->next; - efree((char *)h); - } - here = 0; - doprompt = 1; -} - -void -psubst(Io *f, char *s) -{ - char *t, *u; - int savec, n; - Word *star; - while(*s){ - if(*s!='$'){ - if(0xa0<=(*s&0xff) && (*s&0xff)<=0xf5){ - pchr(f, *s++); - if(*s=='\0') - break; - } - else if(0xf6<=(*s&0xff) && (*s&0xff)<=0xf7){ - pchr(f, *s++); - if(*s=='\0') - break; - pchr(f, *s++); - if(*s=='\0') - break; - } - pchr(f, *s++); - } - else{ - t=++s; - if(*t=='$') - pchr(f, *t++); - else{ - while(*t && idchr(*t)) t++; - savec=*t; - *t='\0'; - n = 0; - for(u = s;*u && '0'<=*u && *u<='9';u++) n = n*10+*u-'0'; - if(n && *u=='\0'){ - star = vlook("*")->val; - if(star && 1<=n && n<=count(star)){ - while(--n) star = star->next; - pstr(f, star->word); - } - } - else - pstrs(f, vlook(s)->val); - *t = savec; - if(savec=='^') - t++; - } - s = t; - } - } -} - -void -pstrs(Io *f, Word *a) -{ - if(a){ - while(a->next && a->next->word){ - pstr(f, a->word); - pchr(f, ' '); - a = a->next; - } - pstr(f, a->word); - } -} -- cgit v1.2.1