Charles.Forsyth20060303644188019 years agoHistory
173 lines · 2.3 KB · C
RawDownload
#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;}