Xinu7/src/cmd/as11/as17.c

Compare this file to the similar file:
Show the results in this format:

#
/* PDP-11 Assembler for the VAX Pass 0 */

#include "vars1.h"

int eval;
char etype;

expres(nextop) {
	int op = 0;
	int opfound = 0;
	short leftval = 0, rightval;
	char lefttype = 1, righttype;

	for(;;) {
		if(op == 0) op = '+';
		else nextop = readop();
		if(nextop < 0 || nextop >= 0200) {
			righttype = ((struct sinfo *)nextop)->s_type;
			rightval = ((struct sinfo *)nextop)->s_value;
		} else if(nextop >= 0141) {
			if(nextop < 0141+10.) {
				nextop -= 0141;
				righttype = curfbr[nextop];
				if((rightval = curfb[nextop]) == -1)
					error('f');
			} else {
				lefttype = 0;
				leftval = 0;
			}
		} else switch(nextop) {
		    	case '+': case '-': case '*': case '/':
		    	case '&': case 037: case 035: case 036:
		    	case '%': case '^': case '!':
				if(op != '+') error('e');
				op = nextop;
				continue;

		    	case 1:
				rightval = numval;
				righttype = 1;
				break;

		    	case '[':
				if( (nextop = expres(readop())) != ']') error(']');
				rightval = eval;
				righttype = etype;
				break;

		    	default:
				if(!opfound) error('e');
				eval = leftval;
				etype = lefttype;
				return(nextop);
			}

		opfound++;
		switch(op) {

		    case '^':
			lefttype = righttype;
			break;

		    case 036:
			rightval = -rightval;
		    case 035:
			lefttype = combin(lefttype, righttype, 0);
			leftval = (unsigned)leftval << rightval;
			break;

		    case '%':
			lefttype = combin(lefttype, righttype, 0);
			leftval = (unsigned)leftval % rightval;
			break;

		    case '+':
			lefttype = combin(lefttype, righttype, 0);
			leftval += rightval;
			break;

		    case '-':
			lefttype = combin(lefttype, righttype, 1);
			leftval -= rightval;
			break;

		    case '&':
			lefttype = combin(lefttype, righttype, 0);
			leftval &= rightval;
			break;

		    case 037:
			lefttype = combin(lefttype, righttype, 0);
			leftval ^= rightval;
			break;

		    case '*':
			lefttype = combin(lefttype, righttype, 0);
			leftval *= rightval;
			break;

		    case '/':
			lefttype = combin(lefttype, righttype, 0);
			leftval = (unsigned)leftval / rightval;
			break;

		    case '!':
			lefttype = combin(lefttype, righttype, 0);
			leftval = ~leftval;
			break;
		}
	op = '+';
	}
}

combin(lefttype, righttype, flag) {
	int outtype, temp;

	outtype = (lefttype | righttype) & 040;
	lefttype &= 037;
	righttype &= 037;
	if(righttype > lefttype) {
		temp = righttype;
		righttype = lefttype;
		lefttype = temp;
	}
	if(righttype != 0) {
		if(flag && righttype == lefttype) lefttype = 1;
		return(lefttype | outtype);
	} else return(outtype);
}