   
/********************************************************/
/*							*/
/*	expression handler 				*/
/*							*/
/*	table below show precedence of operator		*/
/*							*/
/********************************************************/
/*	operator	* routine	* associativity	*/
/********************************************************/
/*	| ++ -- - * &	* heir10	* left to right	*/
/********************************************************/
/*	* / %		* heir9		* rigth to left	*/
/********************************************************/
/*	+ -		* heir8		* left to right	*/
/********************************************************/
/*	<< >>		* heir7		* left to right	*/
/********************************************************/
/*	< <= > >=	* heir6		* left to right	*/
/********************************************************/
/*	== !=		* heir5		* left to rigth */
/********************************************************/
/*	&		* heir4		* left to rigth */
/********************************************************/
/*	^		* heir3		* left to right */
/********************************************************/
/*	|		* heir2		* left to right */
/********************************************************/
/*	&&		* heir1e	* left to right */
/********************************************************/
/*	||		* heir1d	* left to right */
/********************************************************/
/*	=  -= += *= %=  * heir1 	* left to right */
/*	/= &= ^= |=	*		*		*/
/********************************************************/
#ifndef TRUE	/* check to see if need include file */
#include <C.DEF>
#endif
expression()
{
        int lval[lvalsize],status;
	status=FALSE;
	rvalue(lval,heir1(lval,&status));
	return status;
	}
heir1(lval,status)
int lval[];
int *status;
{
        int k;
	char *ptr;
        k=heir1d(lval,status);
        if (ch() !=  '=' && nch() != '=') return k;
	*status=FALSE;
	switch(ch()) {

		/* just an equal */
		case '=' :
			gch();
			equal(lval,k);
			break;

		/* add value then store */
		case '+' :
		case '-' :
			gch();gch();
			equal_exp(lval,k);
			size_adjust(lval);
			if (ch() == '-') sub(); else add();
			k=1;
			break;

		case '*' :
			gch();gch();
			equal_exp(lval,k);
			mult();
			k=1;
			break;

		case '/' :
			gch();gch();
			equal_exp(lval,k);
			div();
			k=1;
			break;


		case '%' :
			gch();gch();
			equal_exp(lval,k);
			mod();
			k=1;
			break;


		case '&' :
			gch();gch();
			equal_exp(lval,k);
			and();
			k=1;
			break;

	
		case '^' :
			gch();gch();	
			equal_exp(lval,k);
			xor();
			k=1;
			break;
		
		case '|' :
			gch();gch();
			equal_exp(lval,k);
			or();
			k=1;
			break;

		default:
			return k;
		}
	store(lval,k);
	return 0;
	}
/*							*/
/*	written by Mike Bernson 1/81			*/
/*							*/
heir1d(lval,status)
int lval[];
int *status;
{
	int k,lval2[lvalsize];
	int label;
	k=heir1e(lval,status);
	blanks();
	if (ch() != '|' || nch() != '|') return k;
	rvalue(lval,k);
	label=getlabel();
	while(1) {
		if (match("||")) {
			truejump(label,*status);
			*status=TRUE;
			rvalue(lval2,heir1e(lval2,status));
			}
		else {
			sprintlabel(label);
			return 0;
			}
		}
	}
/*					*/
/*	written by Mike Bernson 1/81	*/
/*					*/
heir1e(lval,status)
int lval[];
int *status;
{
	int label;
	int k,lval2[lvalsize];
	k=heir2(lval,status);
	blanks();
	if (ch() != '&' || nch() != '&') return k;
	rvalue(lval,k);
	label=getlabel();
	while(1) {
		if (match("&&")) {
			testjump(label,*status);
			*status=TRUE;
			rvalue(lval2,heir2(lval2,status));
			}
		else {
			sprintlabel(label);
			return 0;
			}
		}
	}
heir2(lval,status)
int lval[];
int *status;
{
	int k,lval2[lvalsize];
	k=heir3(lval,status);
	blanks();
	if (ch() != '|' || nch() =='|' || nch()== '=') return k;
	rvalue(lval,k);
	while(1) {
		if (match("|")) {
			push();
			rvalue(lval2,heir3(lval2,status));
			or();
			*status=TRUE;
			}
		else return 0;
		}
	}
heir3(lval,status)
int lval[];
int *status;
{
	int k,lval2[lvalsize];
 	k=heir4(lval,status);
	blanks();
	if (ch() != '^' || nch() == '=') return k;
	rvalue(lval,k);
	while(1) {
		if (match("^")) {
			push();
			rvalue(lval2,heir4(lval2,status));
			xor();
			*status=TRUE;
			}
		else return 0;
		}
	}
heir4(lval,status)
int lval[];
int *status;
{
	int k,lval2[lvalsize];
	k=heir5(lval,status);
	blanks();
	if (ch() != '&' || nch()=='&' || nch() == '=') return k;
	rvalue(lval,k);
	while(1) {
		if (match("&")) {
			push();
			rvalue(lval2,heir5(lval2,status));
			and();
			*status=TRUE;
			}
		else return 0;
		}
	}
heir5(lval,status)
int lval[];
int *status;
{
	int k,lval2[lvalsize];
	k=heir6(lval,status);
	blanks();
	if ((streq(line+lptr,"==") ==0) &&
                (streq(line+lptr,"!=") == 0)) return k;
        rvalue(lval,k);
        while(1) {
		if (match("==")) {
			push();
			rvalue(lval2,heir6(lval2,status));
			eq();
			*status=TRUE;
			}
		else if (match("!=")) {
			push();
			rvalue(lval2,heir6(lval2,status));
			ne();
			*status=TRUE;
			}
		else return 0;
		}
	}
heir6(lval,status)
int lval[];
int *status;
{
	int k,lval2[lvalsize];
	k=heir7(lval,status);
	blanks();
	if ((streq(line+lptr,"<") == 0) &&
		(streq(line+lptr,">") == 0) &&
		(streq(line+lptr,"<=") == 0) &&
		(streq(line+lptr,">=") == 0)) return k;
	if (streq(line+lptr,">>")) return k;
	if (streq(line+lptr,"<<")) return k;
	rvalue(lval,k);
	while(1) {
		if (match("<=")) {
			push();
			rvalue(lval2,heir7(lval2,status));
			*status=TRUE;
			if (cptr=lval[0])
				if(cptr[ident]==pointer) {
					ule();
					continue;
					}
			if (cptr=lval2[0])
				if(cptr[ident]==pointer) {
					le();
					continue;
					}
			le();
			}
		else if (match(">=")) {
			push();
			rvalue(lval2,heir7(lval2,status));
			*status=TRUE;
			if (cptr=lval[0])
				if (cptr[ident]==pointer) {
					uge();
					continue;
					}
			if (cptr=lval2[0])
				if (cptr[ident]==pointer) {
					uge();
					continue;
					}
			ge();
			}
		else if ((streq(line+lptr,"<")) &&
			(streq(line+lptr,"<<")==0)) {
				inbyte();
				push();
				rvalue(lval2,heir7(lval2,status));
				*status=TRUE;
				if (cptr=lval[0])
					if (cptr[ident]==pointer) {
					ult();
					continue;
					}
				if(cptr=lval2[0])
					if (cptr[ident]==pointer) {
						ult();
						continue;
						}
			lt();
			}
		else if ((streq(line+lptr,">")) &&
			(streq(line+lptr,">>") == 0)) {
				inbyte();
				push();
				rvalue(lval2,heir7(lval2,status));
				*status=TRUE;
			if (cptr=lval[0])
				if (cptr[ident]==pointer) {
					ugt();
					continue;
					}
			if (cptr=lval2[0])
				if (cptr[ident]==pointer) {
					ugt();
					continue;
					}
			gt();
			}
		else return 0;
		}
	}

	if (isbyte(k)) call("@stacks"); else call("@stackl");
	defvalue(k);
	return newsp;
	}
/*	Do