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

📄 expr.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#ifndef lintstatic	char	*sccsid = "@(#)expr.c	4.1	ULTRIX	7/2/90";#endif lint/************************************************************************ *									* *			Copyright (c) 1984 by				* *		Digital Equipment Corporation, Maynard, MA		* *			All rights reserved.				* *									* *   This software is furnished under a license and may be used and	* *   copied  only  in accordance with the terms of such license and	* *   with the  inclusion  of  the  above  copyright  notice.   This	* *   software  or  any  other copies thereof may not be provided or	* *   otherwise made available to any other person.  No title to and	* *   ownership of the software is hereby transferred.			* *									* *   This software is  derived  from  software  received  from  the	* *   University    of   California,   Berkeley,   and   from   Bell	* *   Laboratories.  Use, duplication, or disclosure is  subject  to	* *   restrictions  under  license  agreements  with  University  of	* *   California and with AT&T.						* *									* *   The information in this software is subject to change  without	* *   notice  and should not be construed as a commitment by Digital	* *   Equipment Corporation.						* *									* *   Digital assumes no responsibility for the use  or  reliability	* *   of its software on equipment which is not supplied by Digital.	* *									* ************************************************************************//* * *	UNIX debugger * */#include "defs.h"MSG		BADSYM;MSG		BADVAR;MSG		BADKET;MSG		BADSYN;MSG		NOCFN;MSG		NOADR;MSG		BADLOC;ADDR		kdb_lastframe;ADDR		kdb_callpc;CHAR		*kdb_lp;extern		radix;STRING		kdb_errflg;L_INT		kdb_localval;static CHAR	isymbol[1024];CHAR		kdb_lastc,kdb_peekc;L_INT		kdb_dot;L_INT		kdb_ditto;INT		kdb_dotinc;L_INT		kdb_var[];L_INT		kdb_expv;expr(a){	/* term | term dyadic expr |  */	INT		rc;	L_INT		lhs;	rdc(); 	kdb_lp--; 	rc=term(a);	while( rc ){		lhs = kdb_expv;		switch ((int)readchar()) {		case '+':			term(a|1); 			kdb_expv += lhs; 			break;		case '-':			term(a|1); 			kdb_expv = lhs - kdb_expv; 			break;		case '#':			term(a|1); 			kdb_expv = round(lhs,kdb_expv); 			break;		case '*':			term(a|1); 			kdb_expv *= lhs; 			break;		case '%':			term(a|1); 			kdb_expv = lhs/kdb_expv; 			break;		case '&':			term(a|1); 			kdb_expv &= lhs; 			break;		case '|':			term(a|1); 			kdb_expv |= lhs; 			break;		case ')':			if( (a&2)==0 ){ 				error(BADKET); 				return (0);			}		default:			kdb_lp--;			return(rc);		}	}	return(rc);}term(a){	/* item | monadic item | (expr) | */	switch ((int)readchar()) {	case '*':		term(a|1); 		kdb_expv=chkget(kdb_expv,DSP); 		return(1);	case '@':		term(a|1); 		kdb_expv=chkget(kdb_expv,ISP); 		return(1);	case '-':		term(a|1); 		kdb_expv = -kdb_expv; 		return(1);	case '~':		term(a|1); 		kdb_expv = ~kdb_expv; 		return(1);	case '#':		term(a|1); 		kdb_expv = !kdb_expv; 		return(1);	case '(':		if( expr(2) ){			if( *kdb_lp!=')' ){				error(BADSYN);			} 			else {					kdb_lp++; 				return(1);			}		}	default:		kdb_lp--;		return(item(a));	}}item(a){	/* name [ . local ] | number | . | ^ | <kdb_var | <register | 'x | | */	INT		base, d;	CHAR		savc;	BOOL		hex;	L_INT		frame;	ADDR		savlastf;	ADDR		savframe;	ADDR		savpc;	register struct nlist *symp;	int regptr;	hex=FALSE;	readchar();	if( symchar(0) ){		readsym();		if( kdb_lastc=='.' ){			frame= uptr->u_pcb.pcb_fp; 			kdb_lastframe=0;			kdb_callpc= uptr->u_pcb.pcb_pc;			while( kdb_errflg==0 ){				savpc=kdb_callpc;				findsym(kdb_callpc,ISYM);				if(  eqsym(kdb_cursym->n_un.n_name,isymbol,'~') ){					break;				}				kdb_callpc=get(frame+16, DSP);				kdb_lastframe=frame;				frame=get(frame+12,DSP)&EVEN;				if( frame==0 ){					error(NOCFN);				}			}			savlastf=kdb_lastframe; 			savframe=frame;			readchar();			if( symchar(0) ){				chkloc(kdb_expv=frame);			}		} 		else if ( (symp=lookup(isymbol))==0 ){ 			error(BADSYM);		} 		else { 			kdb_expv = symp->n_value;		}		kdb_lp--;	} 	else if ( getnum(readchar) ){		;	} 	else if ( kdb_lastc=='.' ){		readchar();		if( symchar(0) ){			kdb_lastframe=savlastf; 			kdb_callpc=savpc;			chkloc(savframe);		} 		else {				kdb_expv=kdb_dot;		}		kdb_lp--;	} 	else if ( kdb_lastc=='"' ){		kdb_expv=kdb_ditto;	} 	else if ( kdb_lastc=='+' ){		kdb_expv=inkdot(kdb_dotinc);	} 	else if ( kdb_lastc=='^' ){		kdb_expv=inkdot(-kdb_dotinc);	} 	else if ( kdb_lastc=='<' ){		savc=rdc();		if( regptr=getreg(savc) ){			kdb_expv = *(int *)regptr;		} 		else if ( (base=varchk(savc)) != -1 ){			kdb_expv=kdb_var[base];		} 		else {				error(BADVAR);		}	} 	else if ( kdb_lastc=='\'' ){		d=4; 		kdb_expv=0;		while( quotchar() ){			if( d-- ){				kdb_expv = (kdb_expv << 8) | kdb_lastc;			} 			else { 				error(BADSYN);			}		}	} 	else if ( a ){		error(NOADR);	} 	else {			kdb_lp--; 		return(0);	}	return(1);}/* service routines for expression reading */getnum(rdf) int (*rdf)();{	INT base,d,frpt;	BOOL hex;	union{		REAL r; 		L_INT i;	} 	real;	if( isdigit(kdb_lastc) || (hex=TRUE, kdb_lastc=='#' && isxdigit((*rdf)())) ){		kdb_expv = 0;		base = (hex ? 16 : radix);		while( (base>10 ? isxdigit(kdb_lastc) : isdigit(kdb_lastc)) ){			kdb_expv = (base==16 ? kdb_expv<<4 : kdb_expv*base);			if( (d=convdig(kdb_lastc))>=base ){ 				error(BADSYN); 			}			kdb_expv += d; 			(*rdf)();			if( kdb_expv==0 ){				if( (kdb_lastc=='x' || kdb_lastc=='X') ){					hex=TRUE; 					base=16; 					(*rdf)();				} 				else if ( (kdb_lastc=='t' || kdb_lastc=='T') ){					hex=FALSE; 					base=10; 					(*rdf)();				} 				else if ( (kdb_lastc=='o' || kdb_lastc=='O') ){					hex=FALSE; 					base=8; 					(*rdf)();				}			}		}		if( kdb_lastc=='.' && (base==10 || kdb_expv==0) && !hex ){			real.r=kdb_expv; 			frpt=0; 			base=10;			while( isdigit((*rdf)()) ){				real.r *= base; 				frpt++;				real.r += kdb_lastc-'0';			}			while( frpt-- ){				real.r /= base; 			}			kdb_expv = real.i;		}		kdb_peekc=kdb_lastc;		/*		kdb_lp--; */		return(1);	} 	else { 		return(0);	}}readsym(){	register char	*p;	p = isymbol;	do{ 		if( p < &isymbol[sizeof(isymbol)-1] ){			*p++ = kdb_lastc;		}		readchar();	}	while( symchar(1) );	*p++ = 0;}convdig(c)CHAR c;{	if( isdigit(c) ){		return(c-'0');	} 	else if ( isxdigit(c) ){		return(c - (isupper(c) ? 'A' : 'a') + 10);	} 	else {			return(17);	}}symchar(dig){	if( kdb_lastc=='\\' ){ 		readchar(); 		return(TRUE); 	}	return( isalpha(kdb_lastc) || kdb_lastc=='_' || dig && isdigit(kdb_lastc) );}varchk(name){	if( isdigit(name) ){ 		return(name-'0'); 	}	if( isalpha(name) ){ 		return((name&037)-1+10); 	}	return(-1);}chkloc(frame)L_INT		frame;{	readsym();	do{ 		if( localsym(frame)==0 ){ 			error(BADLOC); 		}		kdb_expv=kdb_localval;	}	while( !eqsym(kdb_cursym->n_un.n_name,isymbol,'~') );}eqsym(s1, s2, c)register char *s1, *s2;{	if (!strcmp(s1,s2))		return (1);	if (*s1 == c && !strcmp(s1+1, s2))		return (1);	return (0);}

⌨️ 快捷键说明

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