|
|
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.