Charles.Forsyth20060303644188019 years agoHistory
228 lines · 3.6 KB · C
RawDownload
#include "rc.h" int	flag[256];Io	*err;char	*argv0; Thread	*runq;int	ndot;  voidmain(int argc, char *argv[]){	int i;	Code bootstrap[17];	char *cflag, *cp;	char rcmain[200];	Var *infroot;	char **p; 	cflag = 0; 	/* default to interactive mode */	flag['i']++; 	/* hack for DOS-style options, when rcsh started from MS-land */	for (p = argv+1; *p && **p == '/'; p++)		**p = '-'; 	argv0 = *argv;	ARGBEGIN{	default:		fprint(2, "usage: %s: [-seiIlvxr] [-c string] [file [args]]\n", argv0);		exits("usage");	case 'e': flag['e']++; break;	case 'c': cflag = ARGF(); break;	case 'i': flag['i']++; break;	case 'I': flag['i'] = 0; break;	case 'l': flag['l']++; break;	case 'r': flag['r']++; break;	case 's': flag['s']++; break;	case 'S': flag['S']++; break;		/* sub shell */	case 'v': flag['v']++; break;	case 'V': flag['V']++; break;	case 'x': flag['x']++; break;	}ARGEND 	err = openfd(2); 	kinit();	vinit(); 	cp = ROOT;	if(0 && strlen(argv0))		sprint(rcmain, "%s/../lib/rcmain", argv0);	else{		infroot = vlook("ROOT");		if(infroot->val)			cp = infroot->val->word;	}	sprint(rcmain, "%s/utils/lib/rcmain", cp); 	setvar("rcname", newword(argv0, 0));	if(cflag)		setvar("cflag", newword(cflag, 0));	else		setvar("cflag", 0); 	/* bootstrap == . rcmain $* */	i=0;	bootstrap[i++].i=1;	bootstrap[i++].f=Xmark;	bootstrap[i++].f=Xword;	bootstrap[i++].s="*";	bootstrap[i++].f=Xassign;	bootstrap[i++].f=Xmark;	bootstrap[i++].f=Xmark;	bootstrap[i++].f=Xword;	bootstrap[i++].s="*";	bootstrap[i++].f=Xdol;	bootstrap[i++].f=Xword;	bootstrap[i++].s=rcmain;	bootstrap[i++].f=Xword;	bootstrap[i++].s=".";	bootstrap[i++].f=Xsimple;	bootstrap[i++].f=Xexit;	bootstrap[i].i=0;	start(bootstrap, 1, 0);	pushlist();	for(i=argc-1;i>=0;i--)		pushword(argv[i]); 	for(;;){		if(flag['r']) pfnc(err, runq);		runq->pc++;		(*runq->code[runq->pc-1].f)();		if(ntrap.ref)			dotrap();	}} voidpanic(char *s, int n){	pfmt(err, "rc: ");	pfmt(err, s, n);	pchr(err, '\n');	flush(err);	pfmt(err, "aborting\n");	flush(err);	exits("aborting");} voidsetstatus(char *s){	setvar("status", newword(s, 0));} char *getstatus(void){	Var *status=vlook("status"); 	return status->val?status->val->word:"";} inttruestatus(void){	char *s;	for(s=getstatus();*s;s++)		if(*s!='|' && *s!='0') return 0;	return 1;} char *concstatus(char *s, char *t){	static char v[NSTATUS+1];	int n=strlen(s);	strncpy(v, s, NSTATUS);	if(n<NSTATUS){		v[n]='|';		strncpy(v+n+1, t, NSTATUS-n-1);	}	v[NSTATUS]='\0';	return v;} /* * Start executing the given code at the given pc with the given redirection */voidstart(Code *c, int pc, Var *local){	Thread *p = new(Thread); 	memset(p, 0, sizeof(Thread));	p->code = codecopy(c);	p->pc = pc;	if(runq) {		p->redir = runq->redir;		p->startredir = runq->redir;	}	p->local = local;	p->lineno = 1;	p->ret = runq;	runq=p;} voidexeccmds(Io *f){	static Code rdcmds[4];	static int first=1; 	if(first){		rdcmds[0].i=1;		rdcmds[1].f=Xrdcmds;		rdcmds[2].f=Xreturn;		first=0;	}	start(rdcmds, 1, runq->local);	runq->cmdfd=f;	runq->iflast=0;} voidwaitfor(uint pid){	int e;	char estr[64]; 	e = procwait(pid);	if(e != 0) {		sprint(estr, "error code %d", e);		setstatus(estr);	} else		setstatus("");} char **procargv(char *s0, char *s1, char *s2, char *s3, Word *w){	int n, i;	Word *p;	char **argv; 	for(p=w,n=5; p; p=p->next,n++);		;		argv = malloc(n*sizeof(char*));	i = 0;	if(s0)		argv[i++] = s0;	if(s1)		argv[i++] = s1;	if(s2)		argv[i++] = s2;	if(s3)		argv[i++] = s3;	for(p=w; p; p=p->next)		argv[i++] = p->word;	argv[i] = 0;	return argv;}