Xinu7/src/cmd/as11/as15.c

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

#include "vars1.h"

char chartab[128] = {
	CTRL, CTRL, CTRL, CTRL, TERM, CTRL, CTRL, CTRL,
	CTRL, BLNK, TERM, CTRL, CTRL, BLNK, CTRL, CTRL,
	CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
	CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,
	BLNK, OPER, QUOT, CTRL, OPER, OPER, OPER, SQOT,
	OPER, OPER, OPER, OPER, OPER, OPER, IDEN, COMM,
	IDEN, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN,
	IDEN, IDEN, OPER, TERM, STRN, OPER, CTRL, CTRL,
	CTRL, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN,
	IDEN, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN,
	IDEN, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN,
	IDEN, IDEN, IDEN, OPER, ESCP, OPER, OPER, IDEN,
	CTRL, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN,
	IDEN, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN,
	IDEN, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN, IDEN,
	IDEN, IDEN, IDEN, CTRL, ORSY, CTRL, IDEN, CTRL,
	};

static char strterm;
int saveop;

readop() {
	int val;

	if(val = saveop) {
		saveop = 0;
		return(val);
	}
   again:
	val = rch();
	switch(chartab[val]) {
	    case CTRL:
		error('g');

	    case BLNK:
		goto again;

	    case COMM:
		while((val = rch()) != ASEOF && val != '\n') ;

	    case TERM:
	    case OPER:
		break;

	    case QUOT:
		val = rsch();
		return(snumval(val | (rsch() << 8)));

	    case SQOT:
		return(snumval(rsch()));

	    case IDEN:
		ch = val;
		if(ch >= '0' && ch <= '9') {
			val = number();
			if(numsymbol) break;
			return(snumval(val));
		}
		return(rname());

	    case STRN:
		putshort('<');
		numval = 0;
		for(;;) {
			val = rsch();
			if(strterm) {
				putshort(-1);
				return('<');
			}
			putshort(0400 | val);
			numval++;
		}

	    case ESCP:
		val = escp();
		break;

	    case ORSY:
		val = 037;
		break;
	}
	putshort(val);
	return(val);
}

snumval(word) {
	numval = word;
	putshort(1);
	putshort(numval);
	return(1);
}

char schar[] = {
	'n', 012,
	's', 040,
	't', 011,
	'e', 004,
	'0', 000,
	'r', 015,
	'a', 006,
	'p', 033,
	0 };

rsch() {
	int chr;
	char *cptr;

	strterm = 0;
	chr = rch();
	if(chr == ASEOF || chr == '\n') {
		error('<');
		aexit();
	}
	if(chr != '\\') { 
		if(chr == '>') strterm++;
		return(chr);
	}
	chr = rch();
	for(cptr = schar; *cptr != '\0'; cptr++)
		if(*cptr++ == chr) return(*cptr);
	return(chr);
}

char esctab[] = {
	'/', '/',
	'<', 035,
	'>', 036,
	'%', 037,
	0 };

escp() {
	int chr;
	char *cptr;

	chr = rch();
	for(cptr = esctab; *cptr != '\0'; cptr++)
		if(*cptr++ == chr) return(*cptr);
	return(chr);
}