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);
}