run.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 1,035 行 · 第 1/2 页
C
1,035 行
*t = '\0'; if (flag == 0) sprintf(p,"%s",fmt); else{ if (a == NULL) error(FATAL,"Not enough arguments in printf(%s)",os); x = execute(a); a = a->nnext; if (flag != 4) xf = getfval(x.optr); } if (flag==1) Xsprintf(p, fmt, xf) else if (flag==2) Xsprintf(p, fmt, (long)xf) else if (flag==3) Xsprintf(p, fmt, (int)xf) else if (flag==4) Xsprintf(p, fmt, getsval(x.optr)) /* 002 - DNM */ /* else if (flag==4) Xsprintf(p, fmt, x.optr->sval==NULL ? "" : getsval(x.optr)) */ tempfree(x); p += strlen(p); } *p = '\0'; return(buf);}obj asprintf(a,n) node **a;{ obj x; node *y; char *s; y = a[0]->nnext; x = execute(a[0]); s = format(getsval(x.optr), y); tempfree(x); x = gettemp(); x.optr->sval = s; x.optr->tval = STR; return(x);}obj arith(a,n) node **a;{ awkfloat i,j; obj x,y,z; x = execute(a[0]); i = getfval(x.optr); tempfree(x); if (n != UMINUS) { y = execute(a[1]); j = getfval(y.optr); tempfree(y); } z = gettemp(); switch (n) { default: error(FATAL, "illegal arithmetic operator %d", n); case ADD: i += j; break; case MINUS: i -= j; break; case MULT: i *= j; break; case DIVIDE: if (j == 0) error(FATAL, "division by zero"); i /= j; break; case MOD: if (j == 0) error(FATAL, "division by zero"); i = i - j*(long)(i/j); break; case UMINUS: i = -i; break; } setfval(z.optr, i); return(z);}obj incrdecr(a, n) node **a;{ obj x, z; int k; awkfloat xf; x = execute(a[0]); xf = getfval(x.optr); k = (n == PREINCR || n == POSTINCR) ? 1 : -1; if (n == PREINCR || n == PREDECR) { setfval(x.optr, xf + k); return(x); } z = gettemp(); setfval(z.optr, xf); setfval(x.optr, xf + k); tempfree(x); return(z);}obj assign(a,n) node **a;{ obj x, y; awkfloat xf, yf; x = execute(a[0]); y = execute(a[1]); if (n == ASSIGN) { /* ordinary assignment */ if ((y.optr->tval & (STR|NUM)) == (STR|NUM)) { setsval(x.optr, y.optr->sval); x.optr->fval = y.optr->fval; x.optr->tval |= NUM; } else if (y.optr->tval & STR) setsval(x.optr, y.optr->sval); else if (y.optr->tval & NUM) setfval(x.optr, y.optr->fval); tempfree(y); return(x); } xf = getfval(x.optr); yf = getfval(y.optr); switch (n) { case ADDEQ: xf += yf; break; case SUBEQ: xf -= yf; break; case MULTEQ: xf *= yf; break; case DIVEQ: if (yf == 0) error(FATAL, "division by zero"); xf /= yf; break; case MODEQ: if (yf == 0) error(FATAL, "division by zero"); xf = xf - yf*(long)(xf/yf); break; default: error(FATAL, "illegal assignment operator %d", n); break; } tempfree(y); setfval(x.optr, xf); return(x);}obj cat(a,q) node **a;{ obj x,y,z; int n1, n2; char *s; x = execute(a[0]); y = execute(a[1]); getsval(x.optr); getsval(y.optr); n1 = strlen(x.optr->sval); n2 = strlen(y.optr->sval); s = (char *) malloc(n1 + n2 + 1); strcpy(s, x.optr->sval); strcpy(s+n1, y.optr->sval); tempfree(y); z = gettemp(); z.optr->sval = s; z.optr->tval = STR; tempfree(x); return(z);}obj pastat(a,n) node **a;{ obj x; if (a[0]==nullstat) x = true; else x = execute(a[0]); if (istrue(x)) { tempfree(x); x = execute(a[1]); } return(x);}obj dopa2(a,n) node **a;{ obj x; if (pairstack[n]==0) { x = execute(a[0]); if (istrue(x)) pairstack[n] = 1; tempfree(x); } if (pairstack[n] == 1) { x = execute(a[1]); if (istrue(x)) pairstack[n] = 0; tempfree(x); x = execute(a[2]); return(x); } return(false);}obj aprintf(a,n) node **a;{ obj x; x = asprintf(a,n); if (a[1]==NULL) { printf("%s", x.optr->sval); tempfree(x); return(true); } redirprint(x.optr->sval, (int)a[1], a[2]); return(x);}obj split(a,nnn) node **a;{ obj x; cell *ap; register char *s, *p; char *t, temp, num[5]; register int sep; int n, flag; x = execute(a[0]); s = getsval(x.optr); tempfree(x); if (a[2] == nullstat) sep = **FS; else { x = execute(a[2]); sep = getsval(x.optr)[0]; tempfree(x); } ap = (cell *) a[1]; freesymtab(ap); dprintf("split: s=|%s|, a=%s, sep=|%c|\n", s, ap->nval, sep); ap->tval &= ~STR; ap->tval |= ARR; ap->sval = (char *) makesymtab(); n = 0; if (sep == ' ') for (n = 0; ; ) { while (*s == ' ' || *s == '\t' || *s == '\n') s++; if (*s == 0) break; n++; t = s; do s++; while (*s!=' ' && *s!='\t' && *s!='\n' && *s!='\0'); temp = *s; *s = '\0'; (void)sprintf(num, "%d", n); if (isnumber(t)) setsymtab(num, tostring(t), atof(t), STR|NUM, ap->sval); else setsymtab(num, tostring(t), 0.0, STR, ap->sval); *s = temp; if (*s != 0) s++; } else if (*s != 0) for (;;) { n++; t = s; while (*s != sep && *s != '\n' && *s != '\0') s++; temp = *s; *s = '\0'; (void)sprintf(num, "%d", n); if (isnumber(t)) setsymtab(num, tostring(t), atof(t), STR|NUM, ap->sval); else setsymtab(num, tostring(t), 0.0, STR, ap->sval); *s = temp; if (*s++ == 0) break; } x = gettemp(); x.optr->tval = NUM; x.optr->fval = n; return(x);}obj ifstat(a,n) node **a;{ obj x; x = execute(a[0]); if (istrue(x)) { tempfree(x); x = execute(a[1]); } else if (a[2] != nullstat) { tempfree(x); x = execute(a[2]); } return(x);}obj whilestat(a,n) node **a;{ obj x; for (;;) { x = execute(a[0]); if (!istrue(x)) return(x); tempfree(x); x = execute(a[1]); if (isbreak(x)) { x = true; return(x); } if (isnext(x) || isexit(x)) return(x); tempfree(x); }}obj forstat(a,n) node **a;{ obj x; tempfree(execute(a[0])); for (;;) { if (a[1]!=nullstat) { x = execute(a[1]); if (!istrue(x)) return(x); else tempfree(x); } x = execute(a[3]); if (isbreak(x)) { /* turn off break */ x = true; return(x); } if (isnext(x) || isexit(x)) return(x); tempfree(x); tempfree(execute(a[2])); }}obj instat(a, n) node **a;{ cell *vp, *arrayp, *cp, **tp; obj x; int i; vp = (cell *) a[0]; arrayp = (cell *) a[1]; if (!(arrayp->tval & ARR)) error(FATAL, "%s is not an array", arrayp->nval); tp = (cell **) arrayp->sval; for (i = 0; i < MAXSYM; i++) { /* this routine knows too much */ for (cp = tp[i]; cp != NULL; cp = cp->nextval) { setsval(vp, cp->nval); x = execute(a[2]); if (isbreak(x)) { x = true; return(x); } if (isnext(x) || isexit(x)) return(x); tempfree(x); } } return (true);}obj jump(a,n) node **a;{ obj x, y; x.otype = OJUMP; switch (n) { default: error(FATAL, "illegal jump type %d", n); break; case EXIT: if (a[0] != 0) { y = execute(a[0]); errorflag = getfval(y.optr); } x.osub = JEXIT; break; case NEXT: x.osub = JNEXT; break; case BREAK: x.osub = JBREAK; break; case CONTINUE: x.osub = JCONT; break; } return(x);}obj fncn(a,n) node **a;{ obj x; awkfloat u; int t; t = (int) a[0]; x = execute(a[1]); if (t == FLENGTH) u = (awkfloat) strlen(getsval(x.optr)); else if (t == FLOG) u = log(getfval(x.optr)); else if (t == FINT) u = (awkfloat) (long) getfval(x.optr); else if (t == FEXP) u = exp(getfval(x.optr)); else if (t == FSQRT) u = sqrt(getfval(x.optr)); else error(FATAL, "illegal function type %d", t); tempfree(x); x = gettemp(); setfval(x.optr, u); return(x);}obj print(a,n) node **a;{ register node *x; obj y; char s[RECSIZE]; s[0] = '\0'; for (x=a[0]; x!=NULL; x=x->nnext) { y = execute(x); strcat(s, getsval(y.optr)); tempfree(y); if (x->nnext==NULL) strcat(s, *ORS); else strcat(s, *OFS); } if (strlen(s) >= RECSIZE) error(FATAL, "string %.20s ... too long to print", s); if (a[1]==nullstat) { printf("%s", s); return(true); } redirprint(s, (int)a[1], a[2]); return(false);}obj nullproc() {}obj nodetoobj(a) node *a;{ obj x; x.optr = (cell *) a->nobj; x.otype = OCELL; x.osub = a->subtype; if (isfld(x)) fldbld(); return(x);}redirprint(s, a, b) char *s; node *b;{ register int i; obj x; x = execute(b); getsval(x.optr); for (i=0; i<FILENUM; i++) if (files[i].fp && strcmp(x.optr->sval, files[i].fname) == 0) goto doit; for (i=0; i<FILENUM; i++) if (files[i].fp == 0) break; if (i >= FILENUM) error(FATAL, "too many output files %d", i); if (a == '|') /* a pipe! */ files[i].fp = popen(x.optr->sval, "w"); else if (a == APPEND) files[i].fp = fopen(x.optr->sval, "a"); else files[i].fp = fopen(x.optr->sval, "w"); if (files[i].fp == NULL) error(FATAL, "can't open file %s", x.optr->sval); if (fcntl(fileno(files[i].fp), F_SETFD, 1) < 0) error(FATAL, "close on exec failure"); files[i].fname = tostring(x.optr->sval); files[i].type = a;doit: fprintf(files[i].fp, "%s", s);#ifndef gcos fflush(files[i].fp); /* in case someone is waiting for the output */#endif tempfree(x);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?