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 + -
显示快捷键?