|
|
researchv10 Norman
/* a5 -- pdp-11 assembler pass 1 */
#include "as1.h"
OP savop;
OP lastop;
int noputw;
OP
readop()
{
if (savop.xp) {lastop=savop; savop.xp=0; return(lastop);}
noputw=0;
lastop=_readop(rch());
if (noputw==0) putw(lastop.v);
return(lastop);
}
extern int fbflag;
int rschflg;
OP
_readop(t)
register int t;
{
OP s;
for (;;) {
switch (chartab[t]) {
case C_IOR:
s.v=037; return(s);
case C_ESC:
switch (t=rch()) {
case '/': s.v='/'; return(s);
case '<': s.v=035; return(s);
case '>': s.v=036; return(s);
case '%': s.v=037; return(s);
}
s.v=t; return(s);
case C_WHITE:
break;
case C_TERM:
s.v=t; return(s);
case C_SQUO:
t=rsch(); goto ccon;
case C_DQUO:
t=rsch(); t |= rsch()<<8;
ccon:
numval=t; putw(T_ABS); putw(numval); s.v=T_ABS; noputw=1; return(s);
case C_GARB:
error('g'); break;
case C_SKIP:
for (;;) {
t=rch();
if (t=='\004' || t=='\n') {s.v=t; return(s);}
}
case C_EOL:
s.v=t; return(s);
case C_STR:
putw('<'); numval=0;
for (;;) {
t=rsch();
if (rschflg) break;
putw(t|0400);
numval++;
}
putw(-1);
s.v='<'; noputw=1; return(s);
default:
ch=t;
if ('0'<=t && t<='9') {
t=number();
if (fbflag==0) goto ccon;
s.v=t; return(s);
}
s.xp=rname(t); return(s);
}
t=rch();
}
}
rsch()
{
register int t=rch();
if (t=='\004' || t=='\n') {error('<'); aexit();}
rschflg=0;
if (t=='\\') {
switch (t=rch()) {
case 'n': return(012);
case 's': return(040);
case 't': return(011);
case 'e': return(004);
case '0': return(000);
case 'r': return(015);
case 'a': return(006);
case 'p': return(033);
}
return(t);
}
if (t=='>') rschflg=1;
return(t);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.