Annotation of researchv10no/cmd/PDP11/11as/as14.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.