|
|
1.1 root 1: /* a4 -- pdp-11 assembler pass1 */
2: #include "as1.h"
3: extern char end[];
4: char *brkend = end;
5: extern struct symtab *hshtab[HSHSIZ];
6: extern struct symtab symtab[];
7: extern int noputw;
8:
9: struct expr *
10: rname(t)
11: {
12: char *sbrk();
13: register int i;
14: register char *cp1,*cp2;
15: struct symtab *sp,**hp;
16: int around;
17: int h=0,flags=0;
18:
19: for (cp1=symbol+NCPS,i=NCPS; --i>=0; ) *--cp1=0;
20: i=NCPS;
21: if (t=='~') {ch=0; flags=1;} /* symbol not for hash table */
22: for (;;) {
23: if (chartab[t=rch()]<=0) break;
24: h+=t; h=((h&0377)<<8)|((h>>8)&0377);
25: if (--i>=0) *cp1++=t;
26: }
27: ch=t;
28: if (flags) {sp=symend++; goto f4;}
29: hp=hshtab+((long)(unsigned short)h)%HSHSIZ;
30: h=((long)(unsigned short)h)/HSHSIZ;
31: around=0;
32: for (;;) {
33: if ((hp-=h)<=hshtab) {
34: hp+=HSHSIZ;
35: if (around) {fprintf(stderr,"as: symbol table overflow\n"); aexit();}
36: around++;
37: }
38: cp1=symbol;
39: if ((sp= *--hp)!=0) {
40: cp2=sp->name;
41: if (*cp1++!=*cp2++ || *cp1++!=*cp2++ || *cp1++!=*cp2++ || *cp1++!=*cp2++ ||
42: *cp1++!=*cp2++ || *cp1++!=*cp2++ || *cp1++!=*cp2++ || *cp1++!=*cp2++)
43: continue;
44: break;
45: }
46: *hp=sp=symend++;
47: f4:
48: cp2=sp->name; cp1=symbol;
49: if (cp2>=brkend) {
50: register char *s;
51: if (-1==(int)(s=sbrk(512))) {error('M'); aexit();}
52: brkend=s+512-sizeof(*sp);
53: }
54: for (i=NCPS; --i>=0; ) *cp2++= *cp1++;
55: sp->sval.typ=0; sp->sval.val=0;
56: break;
57: }
58: if (sp>=usymtab)
59: putw(USYM+(sp-usymtab));
60: else
61: putw(BSYM+(sp-symtab));
62: noputw=1;
63: return(&sp->sval);
64: }
65:
66: int fbflag;
67:
68: number()
69: {
70: register int t;
71: register short dec=0,oct=0;
72:
73: fbflag=0;
74: for (;;) {
75: t=rch();
76: if (t<'0' || t>'9') break;
77: dec=(dec*10)+t-'0'; oct=(oct<<3)+t-'0';
78: }
79: if (t=='b' || t=='f') {
80: register int i;
81: fbflag=1;
82: i=fbcheck(dec)+'a';
83: if (t=='f') i+=10;
84: return(i);
85: }
86: if (t=='.')
87: {ch=0; return(dec);}
88: else
89: {ch=t; return(oct);}
90: }
91:
92: rch()
93: {
94: register int t;
95: register char *cp;
96:
97: for (;;) {
98: if (t=ch) {ch=0; return(t);}
99: if ((t=getchar())!=EOF) return(t);
100: fclose(stdin);
101: if (--nargs<=0) return('\004');
102: if (ifflg) {error('i'); aexit();}
103: if (NULL==freopen(*++curarg,"r",stdin)) {filerr(*curarg,"?\n"); aexit();}
104: line=1;
105: putw(5); cp= *curarg; while (t= *cp++) putw(t); putw(-1);
106: }
107: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.