Annotation of researchv9/cmd/sun/c2/sym.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)sym.c 1.1 86/02/03 Copyr 1983 Sun Micro";
        !             3: #endif
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 1983 by Sun Microsystems, Inc.
        !             7:  */
        !             8: 
        !             9: 
        !            10: #include "as.h"
        !            11: 
        !            12: /* Allocation increments for symbol buckets and character blocks */
        !            13: #define        SYM_INCR        50
        !            14: #define CBLOCK_INCR    512
        !            15: 
        !            16: extern struct stab_sym_bkt *stabkt_head;
        !            17: 
        !            18: struct sym_bkt *last_symbol;                   /* last symbol defined */
        !            19: struct sym_bkt *sym_hash_tab[HASH_MAX];                /* Symbol hash table */
        !            20: struct sym_bkt *sym_free = NULL;               /* head of free list */
        !            21: char *cblock = NULL;                           /* storage for symbol names */
        !            22: int ccnt = 0;                                  /* number of chars left in c block */
        !            23: 
        !            24: /* grab a new symbol bucket off of the free list; allocate space
        !            25:  * for a new free list if necessary
        !            26:  */
        !            27: struct sym_bkt *
        !            28: gsbkt()
        !            29:   {    register struct sym_bkt *sbp;
        !            30:        register int i;
        !            31: 
        !            32:        if ((sbp = sym_free) != NULL) sym_free = sbp->next_s;
        !            33:        else {
        !            34:          sbp = (struct sym_bkt *)calloc(SYM_INCR,sizeof(struct sym_bkt));
        !            35:          if (sbp == NULL) sys_error("Symbol storage exceeded\n",0);
        !            36:          for (i = SYM_INCR-1; i--;) {
        !            37:            sbp->next_s = sym_free;
        !            38:            sym_free = sbp++;
        !            39:          }
        !            40:        }
        !            41: 
        !            42:        return(sbp);
        !            43: }
        !            44: 
        !            45: /* initialize hash table */
        !            46: sym_init()
        !            47: {
        !            48:        register int i;
        !            49:        for (i=0; i<HASH_MAX; i++) sym_hash_tab[i] = NULL;
        !            50: } /* end Sym_Init */
        !            51: 
        !            52: char *
        !            53: sstring(string)
        !            54:        register char *string;
        !            55: {      
        !            56:        register char *p,*q;    /* working char string */
        !            57:        register int i;
        !            58: 
        !            59:        i = strlen(string);     /* get length of string */
        !            60: 
        !            61:        if (++i > ccnt) {       /* if not enough room get more */
        !            62:          if ((cblock = (char *)calloc(CBLOCK_INCR,1)) == NULL)
        !            63:            sys_error("Symbol storage exceeded\n",0);
        !            64:          ccnt = CBLOCK_INCR;
        !            65:        }
        !            66: 
        !            67:        p = q = cblock;         /* copy string into permanent storage */
        !            68:        while (*p++ = *string++);
        !            69:        cblock = p;
        !            70:        ccnt -= i;
        !            71:        return(q);
        !            72: } /* end sstring */
        !            73: 
        !            74: /* lookup symbol in symbol table */
        !            75: struct sym_bkt *
        !            76: lookup(s)
        !            77:        register char *s;
        !            78: {
        !            79:        register struct sym_bkt *sbp;   /* general purpose ptr */
        !            80:        register int Save;              /* save subscript in sym_hash_tab */
        !            81:        register char *p;
        !            82:        static char local[250];         /* used for constructing local sym */
        !            83:        extern char *ll_format;
        !            84: 
        !            85:        if (*s>='0' && *s<='9') {       /* local symbol hackery */
        !            86:          /* we hope no-one uses really long local symbols */
        !            87:          p = local;
        !            88:          while ((*p++ = *s++) && (p < &local[sizeof local-1]));/* copy local symbol */
        !            89:          p--;
        !            90:          s = last_symbol->name_s;      /* add last symbol defined as suffix */
        !            91:          while ((*p++ = *s++) && (p < &local[sizeof local-1]));
        !            92:          s = local;                    /* this becomes name to deal with */
        !            93:        }
        !            94: 
        !            95:        /* if the symbol is already in here, return a ptr to it */
        !            96:        for (sbp = sym_hash_tab[Save=hash(s)]; sbp != NULL ; sbp = sbp->next_s)
        !            97:          if (strcmp(sbp->name_s,s) == 0) return(sbp);
        !            98: 
        !            99:        /* Since it's not, make a bucket for it, and put the bucket in the symbol table */
        !           100:        sbp = gsbkt();                          /* get the bucket */
        !           101:        sbp->name_s = sstring(s);               /* Store it's name */
        !           102:        sbp->value_s =  sbp->attr_s = 0;
        !           103: #if AS
        !           104:        sbp->id_s = 0;
        !           105: #endif
        !           106:        sbp->csect_s = C_UNDEF;
        !           107:        sbp->next_s = sym_hash_tab[Save];       /* and insert on top of list */
        !           108:        if (s == local || *s == *ll_format) sbp->attr_s |= S_LOCAL;
        !           109:        return(sym_hash_tab[Save] = sbp);
        !           110: }
        !           111: 
        !           112: 
        !           113: /*
        !           114:  * Perm        Flags all currently defined symbols as permanent (and therefore
        !           115:  *     ineligible for redefinition.  Also prevents them from being output
        !           116:  *     in the object file).
        !           117:  */
        !           118: perm()
        !           119:   {    register struct sym_bkt **sbp1, *sbp2;
        !           120: 
        !           121:        for (sbp1 = sym_hash_tab; sbp1 < &sym_hash_tab[HASH_MAX]; sbp1++)
        !           122:                for (sbp2 = *sbp1; sbp2; sbp2 = sbp2->next_s)
        !           123:                        sbp2->attr_s |= S_PERM;
        !           124: }

unix.superglobalmegacorp.com

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