📄 msh.c
字号:
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 + -