|
|
researchv10 Norman
/* a4 -- pdp-11 assembler pass1 */
#include "as1.h"
extern char end[];
char *brkend = end;
extern struct symtab *hshtab[HSHSIZ];
extern struct symtab symtab[];
extern int noputw;
struct expr *
rname(t)
{
char *sbrk();
register int i;
register char *cp1,*cp2;
struct symtab *sp,**hp;
int around;
int h=0,flags=0;
for (cp1=symbol+NCPS,i=NCPS; --i>=0; ) *--cp1=0;
i=NCPS;
if (t=='~') {ch=0; flags=1;} /* symbol not for hash table */
for (;;) {
if (chartab[t=rch()]<=0) break;
h+=t; h=((h&0377)<<8)|((h>>8)&0377);
if (--i>=0) *cp1++=t;
}
ch=t;
if (flags) {sp=symend++; goto f4;}
hp=hshtab+((long)(unsigned short)h)%HSHSIZ;
h=((long)(unsigned short)h)/HSHSIZ;
around=0;
for (;;) {
if ((hp-=h)<=hshtab) {
hp+=HSHSIZ;
if (around) {fprintf(stderr,"as: symbol table overflow\n"); aexit();}
around++;
}
cp1=symbol;
if ((sp= *--hp)!=0) {
cp2=sp->name;
if (*cp1++!=*cp2++ || *cp1++!=*cp2++ || *cp1++!=*cp2++ || *cp1++!=*cp2++ ||
*cp1++!=*cp2++ || *cp1++!=*cp2++ || *cp1++!=*cp2++ || *cp1++!=*cp2++)
continue;
break;
}
*hp=sp=symend++;
f4:
cp2=sp->name; cp1=symbol;
if (cp2>=brkend) {
register char *s;
if (-1==(int)(s=sbrk(512))) {error('M'); aexit();}
brkend=s+512-sizeof(*sp);
}
for (i=NCPS; --i>=0; ) *cp2++= *cp1++;
sp->sval.typ=0; sp->sval.val=0;
break;
}
if (sp>=usymtab)
putw(USYM+(sp-usymtab));
else
putw(BSYM+(sp-symtab));
noputw=1;
return(&sp->sval);
}
int fbflag;
number()
{
register int t;
register short dec=0,oct=0;
fbflag=0;
for (;;) {
t=rch();
if (t<'0' || t>'9') break;
dec=(dec*10)+t-'0'; oct=(oct<<3)+t-'0';
}
if (t=='b' || t=='f') {
register int i;
fbflag=1;
i=fbcheck(dec)+'a';
if (t=='f') i+=10;
return(i);
}
if (t=='.')
{ch=0; return(dec);}
else
{ch=t; return(oct);}
}
rch()
{
register int t;
register char *cp;
for (;;) {
if (t=ch) {ch=0; return(t);}
if ((t=getchar())!=EOF) return(t);
fclose(stdin);
if (--nargs<=0) return('\004');
if (ifflg) {error('i'); aexit();}
if (NULL==freopen(*++curarg,"r",stdin)) {filerr(*curarg,"?\n"); aexit();}
line=1;
putw(5); cp= *curarg; while (t= *cp++) putw(t); putw(-1);
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.