V10/cmd/PDP11/11as/as14.c

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

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