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