#include "rc.h" Word *newword(char *wd, Word *next){ Word *p=new(Word); p->word=strdup(wd); p->next=next; return p;} voidpushword(char *wd){ if(runq->argv==0) panic("pushword but no argv!", 0); runq->argv->words=newword(wd, runq->argv->words);} voidpopword(void){ Word *p; if(runq->argv==0) panic("popword but no argv!", 0); p=runq->argv->words; if(p==0) panic("popword but no word!", 0); runq->argv->words=p->next; free(p->word); free(p);} voidfreewords(Word *w){ Word *nw; while(w){ free(w->word); nw=w->next; free(w); w=nw; }} voidfreelist(Word *w){ Word *nw; while(w){ nw=w->next; free(w->word); free(w); w=nw; }} voidpushlist(void){ List *p=new(List); p->next=runq->argv; p->words=0; runq->argv=p;} voidpoplist(void){ List *p=runq->argv; if(p==0) panic("poplist but no argv", 0); freelist(p->words); runq->argv=p->next; free(p);} intcount(Word *w){ int n; for(n=0;w;n++) w=w->next; return n;} /* * copy arglist a, adding the copy to the front of tail */Word *copywords(Word *a, Word *tail){ Word *v=0, **end; for(end=&v;a;a=a->next,end=&(*end)->next) *end=newword(a->word, 0); *end=tail; return v;} char *list2str(Word *words){ char *value, *s, *t; int len=0; Word *ap; for(ap=words;ap;ap=ap->next) len+=1+strlen(ap->word); value=malloc(len+1); s=value; for(ap=words;ap;ap=ap->next){ for(t=ap->word;*t;) *s++=*t++; *s++=' '; } if(s==value) *s='\0'; else s[-1]='\0'; return value;} Word *subwords(Word *val, int len, Word *sub, Word *a){ int n; char *s; if(!sub) return a; a=subwords(val, len, sub->next, a); s=sub->word; deglob(s); n=0; while('0'<=*s && *s<='9') n=n*10+ *s++ -'0'; if(n<1 || len<n) return a; for(;n!=1;--n) val=val->next; return newword(val->word, a);} voidpushredir(int type, int from, int to){ Redir *rp=new(Redir); rp->type=type; rp->from=from; rp->to=to; rp->next=runq->redir; runq->redir=rp;} voidturfredir(void){ while(runq->redir!=runq->startredir) Xpopredir();} Word*conclist(Word *lp, Word *rp, Word *tail){ char *buf; Word *v; if(lp->next || rp->next) tail=conclist(lp->next==0?lp:lp->next, rp->next==0?rp:rp->next, tail); buf=malloc(strlen(lp->word)+strlen(rp->word)+1); strcpy(buf, lp->word); strcat(buf, rp->word); v=newword(buf, tail); free(buf); return v;}
#include "rc.h"
Word *
newword(char *wd, Word *next)
{
Word *p=new(Word);
p->word=strdup(wd);
p->next=next;
return p;
}
void
pushword(char *wd)
{
if(runq->argv==0)
panic("pushword but no argv!", 0);
runq->argv->words=newword(wd, runq->argv->words);
}
void
popword(void)
{
Word *p;
if(runq->argv==0)
panic("popword but no argv!", 0);
p=runq->argv->words;
if(p==0)
panic("popword but no word!", 0);
runq->argv->words=p->next;
free(p->word);
free(p);
}
void
freewords(Word *w)
{
Word *nw;
while(w){
free(w->word);
nw=w->next;
free(w);
w=nw;
}
}
void
freelist(Word *w)
{
Word *nw;
while(w){
nw=w->next;
free(w->word);
free(w);
w=nw;
}
}
void
pushlist(void)
{
List *p=new(List);
p->next=runq->argv;
p->words=0;
runq->argv=p;
}
void
poplist(void)
{
List *p=runq->argv;
if(p==0)
panic("poplist but no argv", 0);
freelist(p->words);
runq->argv=p->next;
free(p);
}
int
count(Word *w)
{
int n;
for(n=0;w;n++)
w=w->next;
return n;
}
/*
* copy arglist a, adding the copy to the front of tail
*/
Word *
copywords(Word *a, Word *tail)
{
Word *v=0, **end;
for(end=&v;a;a=a->next,end=&(*end)->next)
*end=newword(a->word, 0);
*end=tail;
return v;
}
char *
list2str(Word *words)
{
char *value, *s, *t;
int len=0;
Word *ap;
for(ap=words;ap;ap=ap->next)
len+=1+strlen(ap->word);
value=malloc(len+1);
s=value;
for(ap=words;ap;ap=ap->next){
for(t=ap->word;*t;) *s++=*t++;
*s++=' ';
}
if(s==value)
*s='\0';
else
s[-1]='\0';
return value;
}
Word *
subwords(Word *val, int len, Word *sub, Word *a)
{
int n;
char *s;
if(!sub) return a;
a=subwords(val, len, sub->next, a);
s=sub->word;
deglob(s);
n=0;
while('0'<=*s && *s<='9') n=n*10+ *s++ -'0';
if(n<1 || len<n) return a;
for(;n!=1;--n) val=val->next;
return newword(val->word, a);
}
void
pushredir(int type, int from, int to)
{
Redir *rp=new(Redir);
rp->type=type;
rp->from=from;
rp->to=to;
rp->next=runq->redir;
runq->redir=rp;
}
void
turfredir(void)
{
while(runq->redir!=runq->startredir)
Xpopredir();
}
Word*
conclist(Word *lp, Word *rp, Word *tail)
{
char *buf;
Word *v;
if(lp->next || rp->next)
tail=conclist(lp->next==0?lp:lp->next, rp->next==0?rp:rp->next,
tail);
buf=malloc(strlen(lp->word)+strlen(rp->word)+1);
strcpy(buf, lp->word);
strcat(buf, rp->word);
v=newword(buf, tail);
free(buf);
return v;
}