⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msh.c

📁 shell-HHARM9200.rar 华恒 AT91rm9200 中Busybox shell的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	while ((int)sbrk(0) & ALIGN)		sbrk(1);	areabot = (struct region *)sbrk(REGSIZE);	areabot->next = areabot;	areabot->area = BUSY;	areatop = areabot;	areanxt = areabot;}char *getcell(nbytes)unsigned nbytes;{	register int nregio;	register struct region *p, *q;	register int i;	if (nbytes == 0) {		puts("getcell(0)");		abort();	}	/* silly and defeats the algorithm */	/*	 * round upwards and add administration area	 */	nregio = (nbytes+(REGSIZE-1))/REGSIZE + 1;	for (p = areanxt;;) {		if (p->area > areanum) {			/*			 * merge free cells			 */			while ((q = p->next)->area > areanum && q != areanxt)				p->next = q->next;			/*			 * exit loop if cell big enough			 */			if (q >= p + nregio)				goto found;		}		p = p->next;		if (p == areanxt)			break;	}	i = nregio >= GROWBY ? nregio : GROWBY;	p = (struct region *)sbrk(i * REGSIZE);	if (p == (struct region *)-1)		return((char *)NULL);	p--;	if (p != areatop) {		puts("not contig");		abort();	/* allocated areas are contiguous */	}	q = p + i;	p->next = q;	p->area = FREE;	q->next = areabot;	q->area = BUSY;	areatop = q;found:	/*	 * we found a FREE area big enough, pointed to by 'p', and up to 'q'	 */	areanxt = p + nregio;	if (areanxt < q) {		/*		 * split into requested area and rest		 */		if (areanxt+1 > q) {			puts("OOM");			abort();	/* insufficient space left for admin */		}		areanxt->next = q;		areanxt->area = FREE;		p->next = areanxt;	}	p->area = areanum;	return((char *)(p+1));}static voidfreecell(cp)char *cp;{	register struct region *p;	if ((p = (struct region *)cp) != NULL) {		p--;		if (p < areanxt)			areanxt = p;		p->area = FREE;	}}static voidfreearea(a)register int a;{	register struct region *p, *top;	top = areatop;	for (p = areabot; p != top; p = p->next)		if (p->area >= a)			p->area = FREE;}static voidsetarea(cp,a)char *cp;int a;{	register struct region *p;	if ((p = (struct region *)cp) != NULL)		(p-1)->area = a;}intgetarea(cp)char *cp;{	return ((struct region*)cp-1)->area;}static voidgarbage(){	register struct region *p, *q, *top;	top = areatop;	for (p = areabot; p != top; p = p->next) {		if (p->area > areanum) {			while ((q = p->next)->area > areanum)				p->next = q->next;			areanxt = p;		}	}#ifdef SHRINKBY	if (areatop >= q + SHRINKBY && q->area > areanum) {		brk((char *)(q+1));		q->next = areabot;		q->area = BUSY;		areatop = q;	}#endif}/* -------- csyn.c -------- *//* * shell: syntax (C version) */intyyparse(){	startl  = 1;	peeksym = 0;	yynerrs = 0;	outtree = c_list();	musthave('\n', 0);	return(yynerrs!=0);}static struct op *pipeline(cf)int cf;{	register struct op *t, *p;	register int c;	t = command(cf);	if (t != NULL) {		while ((c = yylex(0)) == '|') {			if ((p = command(CONTIN)) == NULL)				SYNTAXERR;			if (t->type != TPAREN && t->type != TCOM) {				/* shell statement */				t = block(TPAREN, t, NOBLOCK, NOWORDS);			}			t = block(TPIPE, t, p, NOWORDS);		}		peeksym = c;	}	return(t);}static struct op *andor(){	register struct op *t, *p;	register int c;	t = pipeline(0);	if (t != NULL) {		while ((c = yylex(0)) == LOGAND || c == LOGOR) {			if ((p = pipeline(CONTIN)) == NULL)				SYNTAXERR;			t = block(c == LOGAND? TAND: TOR, t, p, NOWORDS);		}		peeksym = c;	}	return(t);}static struct op *c_list(){	register struct op *t, *p;	register int c;	t = andor();	if (t != NULL) {		if((peeksym = yylex(0)) == '&')			t = block(TASYNC, t, NOBLOCK, NOWORDS);		while ((c = yylex(0)) == ';' || c == '&' || (multiline && c == '\n')) {			if ((p = andor()) == NULL)				return(t);			if((peeksym = yylex(0)) == '&')				p = block(TASYNC, p, NOBLOCK, NOWORDS);			t = list(t, p);		}		peeksym = c;	}	return(t);}static intsynio(cf)int cf;{	register struct ioword *iop;	register int i;	register int c;	if ((c = yylex(cf)) != '<' && c != '>') {		peeksym = c;		return(0);	}	i = yylval.i;	musthave(WORD, 0);	iop = io(iounit, i, yylval.cp);	iounit = IODEFAULT;	if (i & IOHERE)		markhere(yylval.cp, iop);	return(1);}static voidmusthave(c, cf)int c, cf;{	if ((peeksym = yylex(cf)) != c)		SYNTAXERR;	peeksym = 0;}static struct op *simple(){	register struct op *t;	t = NULL;	for (;;) {		switch (peeksym = yylex(0)) {		case '<':		case '>':			(void) synio(0);			break;		case WORD:			if (t == NULL) {				t = newtp();				t->type = TCOM;			}			peeksym = 0;			word(yylval.cp);			break;		default:			return(t);		}	}}static struct op *nested(type, mark)int type, mark;{	register struct op *t;	multiline++;	t = c_list();	musthave(mark, 0);	multiline--;	return(block(type, t, NOBLOCK, NOWORDS));}static struct op *command(cf)int cf;{	register struct op *t;	struct wdblock *iosave;	register int c;	iosave = iolist;	iolist = NULL;	if (multiline)		cf |= CONTIN;	while (synio(cf))		cf = 0;	switch (c = yylex(cf)) {	default:		peeksym = c;		if ((t = simple()) == NULL) {			if (iolist == NULL)				return((struct op *)NULL);			t = newtp();			t->type = TCOM;		}		break;	case '(':		t = nested(TPAREN, ')');		break;	case '{':		t = nested(TBRACE, '}');		break;	case FOR:		t = newtp();		t->type = TFOR;		musthave(WORD, 0);		startl = 1;		t->str = yylval.cp;		multiline++;		t->words = wordlist();		if ((c = yylex(0)) != '\n' && c != ';')			peeksym = c;		t->left = dogroup(0);		multiline--;		break;	case WHILE:	case UNTIL:		multiline++;		t = newtp();		t->type = c == WHILE? TWHILE: TUNTIL;		t->left = c_list();		t->right = dogroup(1);		t->words = NULL;		multiline--;		break;	case CASE:		t = newtp();		t->type = TCASE;		musthave(WORD, 0);		t->str = yylval.cp;		startl++;		multiline++;		musthave(IN, CONTIN);		startl++;		t->left = caselist();		musthave(ESAC, 0);		multiline--;		break;	case IF:		multiline++;		t = newtp();		t->type = TIF;		t->left = c_list();		t->right = thenpart();		musthave(FI, 0);		multiline--;		break;	}	while (synio(0))		;	t = namelist(t);	iolist = iosave;	return(t);}static struct op *dogroup(onlydone)int onlydone;{	register int c;	register struct op *mylist;	c = yylex(CONTIN);	if (c == DONE && onlydone)		return((struct op *)NULL);	if (c != DO)		SYNTAXERR;	mylist = c_list();	musthave(DONE, 0);	return(mylist);}static struct op *thenpart(){	register int c;	register struct op *t;	if ((c = yylex(0)) != THEN) {		peeksym = c;		return((struct op *)NULL);	}	t = newtp();	t->type = 0;	t->left = c_list();	if (t->left == NULL)		SYNTAXERR;	t->right = elsepart();	return(t);}static struct op *elsepart(){	register int c;	register struct op *t;	switch (c = yylex(0)) {	case ELSE:		if ((t = c_list()) == NULL)			SYNTAXERR;		return(t);	case ELIF:		t = newtp();		t->type = TELIF;		t->left = c_list();		t->right = thenpart();		return(t);	default:		peeksym = c;		return((struct op *)NULL);	}}static struct op *caselist(){	register struct op *t;	t = NULL;	while ((peeksym = yylex(CONTIN)) != ESAC)		t = list(t, casepart());	return(t);}static struct op *casepart(){	register struct op *t;	t = newtp();	t->type = TPAT;	t->words = pattern();	musthave(')', 0);	t->left = c_list();	if ((peeksym = yylex(CONTIN)) != ESAC)		musthave(BREAK, CONTIN);	return(t);}static char **pattern(){	register int c, cf;	cf = CONTIN;	do {		musthave(WORD, cf);		word(yylval.cp);		cf = 0;	} while ((c = yylex(0)) == '|');	peeksym = c;	word(NOWORD);	return(copyw());}static char **wordlist(){	register int c;	if ((c = yylex(0)) != IN) {		peeksym = c;		return((char **)NULL);	}	startl = 0;	while ((c = yylex(0)) == WORD)		word(yylval.cp);	word(NOWORD);	peeksym = c;	return(copyw());}/* * supporting functions */static struct op *list(t1, t2)register struct op *t1, *t2;{	if (t1 == NULL)		return(t2);	if (t2 == NULL)		return(t1);	return(block(TLIST, t1, t2, NOWORDS));}static struct op *block(type, t1, t2, wp)int type;struct op *t1, *t2;char **wp;{	register struct op *t;	t = newtp();	t->type = type;	t->left = t1;	t->right = t2;	t->words = wp;	return(t);}static intrlookup(n)register char *n;{	register struct res *rp;	for (rp = restab; rp->r_name; rp++)		if (strcmp(rp->r_name, n) == 0)			return(rp->r_val);	return(0);}static struct op *newtp(){	register struct op *t;	t = (struct op *)tree(sizeof(*t));	t->type = 0;	t->words = NULL;	t->ioact = NULL;	t->left = NULL;	t->right = NULL;	t->str = NULL;	return(t);}static struct op *namelist(t)register struct op *t;{	if (iolist) {		iolist = addword((char *)NULL, iolist);		t->ioact = copyio();	} else		t->ioact = NULL;	if (t->type != TCOM) {		if (t->type != TPAREN && t->ioact != NULL) {			t = block(TPAREN, t, NOBLOCK, NOWORDS);			t->ioact = t->left->ioact;			t->left->ioact = NULL;		}		return(t);	}	word(NOWORD);	t->words = copyw();	return(t);}static char **copyw(){	register char **wd;	wd = getwords(wdlist);	wdlist = 0;	return(wd);}static voidword(cp)char *cp;{	wdlist = addword(cp, wdlist);}static struct ioword **copyio(){	register struct ioword **iop;	iop = (struct ioword **) getwords(iolist);	iolist = 0;	return(iop);}static struct ioword *io(u, f, cp)int u;int f;char *cp;{	register struct ioword *iop;	iop = (struct ioword *) tree(sizeof(*iop));	iop->io_unit = u;	iop->io_flag = f;	iop->io_name = cp;	iolist = addword((char *)iop, iolist);	return(iop);}static voidzzerr(){	yyerror("syntax error");}static voidyyerror(s)char *s;{	yynerrs++;	if (interactive && e.iop <= iostack) {		multiline = 0;		while (eofc() == 0 && yylex(0) != '\n')			;	}	err(s);	fail();}static intyylex(cf)int cf;{	register int c, c1;	int atstart;	if ((c = peeksym) > 0) {		peeksym = 0;		if (c == '\n')			startl = 1;		return(c);	}	nlseen = 0;	e.linep = line;	atstart = startl;	startl = 0;	yylval.i = 0;loop:	while ((c = my_getc(0)) == ' ' || c == '\t')		;	switch (c) {	default:		if (any(c, "0123456789")) {			unget(c1 = my_getc(0));			if (c1 == '<' || c1 == '>') {				iounit = c - '0';				goto loop;			}			*e.linep++ = c;			c = c1;		}		break;	case '#':		while ((c = my_getc(0)) != 0 && c != '\n')			;		unget(c);		goto loop;	case 0:		return(c);	case '$':		*e.linep++ = c;		if ((c = my_getc(0)) == '{') {			if ((c = collect(c, '}')) != '\0')				return(c);			goto pack;		}		break;	case '`':	case '\'':	case '"':		if ((c = collect(c, c)) != '\0')			return(c);		goto pack;	case '|':	case '&':	case ';':		if ((c1 = dual(c)) != '\0') {			startl = 1;			return(c1);		}		startl = 1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -