Annotation of coherent/d/bin/cc/c/n2/cc2sym.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * C compiler.
        !             3:  * Final symbol table manager.
        !             4:  */
        !             5: #ifdef   vax
        !             6: #include "INC$LIB:cc2.h"
        !             7: #else
        !             8: #include "cc2.h"
        !             9: #endif
        !            10: 
        !            11: /*
        !            12:  * Lookup a global (or static external) identifier in the symbol table.
        !            13:  * Return a pointer to the symbol union.
        !            14:  * If not there and the 'flag' is true,
        !            15:  * define the symbol at the current location.
        !            16:  */
        !            17: SYM *
        !            18: glookup(id, def)
        !            19: char   *id;
        !            20: {
        !            21:        register SYM    *sp;
        !            22:        register int    h;
        !            23: 
        !            24:        sp = hash2[h = symbucket(id)];
        !            25:        while (sp != NULL) {
        !            26:                if ((sp->s_flag&S_LABNO)==0 && strcmp(id, sp->s_id)==0) {
        !            27:                        if (def != 0) {
        !            28:                                if ((sp->s_flag&S_DEF) != 0)
        !            29:                                        cbotch("global symbol \"%s\" redefined", sp->s_id);
        !            30:                                sp->s_flag |= S_DEF;
        !            31:                        }
        !            32:                        return (sp);
        !            33:                }
        !            34:                sp = sp->s_fp;
        !            35:        }
        !            36:        if ((sp = (SYM *)malloc(sizeof(SYM)+strlen(id)+1)) == NULL)
        !            37:                cnomem("glookup");
        !            38:        sp->s_fp = hash2[h];
        !            39:        hash2[h] = sp;
        !            40:        sp->s_flag = 0;
        !            41:        sp->s_seg = SANY;
        !            42:        sp->s_value = 0;
        !            43:        sp->s_data = 0;
        !            44:        sp->s_type = 0;
        !            45:        if (def != 0)
        !            46:                sp->s_flag = S_DEF;
        !            47:        strcpy(sp->s_id, id);
        !            48:        return (sp);
        !            49: }
        !            50: 
        !            51: /*
        !            52:  * Lookup a local symbol.
        !            53:  * If the symbol is not there and the 'flag' is true,
        !            54:  * then define the symbol at the current location.
        !            55:  * Return a pointer to the symbol union.
        !            56:  */
        !            57: SYM *
        !            58: llookup(labno, def)
        !            59: {
        !            60:        register SYM    *sp;
        !            61:        register int    h;
        !            62: 
        !            63:        sp = hash2[h = labno&SHMASK];
        !            64:        while (sp != NULL) {
        !            65:                if ((sp->s_flag&S_LABNO)!=0 && labno==sp->s_labno) {
        !            66:                        if (def != 0) {
        !            67:                                if ((sp->s_flag&S_DEF) != 0)
        !            68:                                        cbotch("local symbol \"L%d\" redefined", labno);
        !            69:                                sp->s_flag |= S_DEF;
        !            70:                        }
        !            71:                        return (sp);
        !            72:                }
        !            73:                sp = sp->s_fp;
        !            74:        }
        !            75:        if ((sp = (SYM *) malloc(sizeof(SYM))) == NULL)
        !            76:                cnomem("llookup");
        !            77:        sp->s_fp = hash2[h];
        !            78:        hash2[h] = sp;
        !            79:        sp->s_flag = S_LABNO;
        !            80:        sp->s_seg = SANY;
        !            81:        sp->s_value = 0;
        !            82:        if (def != 0)
        !            83:                sp->s_flag = S_LABNO|S_DEF;
        !            84:        sp->s_labno = labno;
        !            85:        return (sp);
        !            86: }
        !            87: 
        !            88: /*
        !            89:  * Given an ASCII global or static external symbol name,
        !            90:  * figure out what hash bucket it goes in.
        !            91:  */
        !            92: static
        !            93: symbucket(p)
        !            94: register char  *p;
        !            95: {
        !            96:        register int    c, h;
        !            97: 
        !            98:        h = 0;
        !            99:        while ((c = *p++) != 0)
        !           100:                h += c;
        !           101:        return (h&SHMASK);
        !           102: }
        !           103: 
        !           104: #if OVERLAID
        !           105: /*
        !           106:  * Run through the hash table,
        !           107:  * releasing all of the symbol table nodes and
        !           108:  * setting all of the hash table bases to NULL pointers.
        !           109:  * This frees up the space used by the
        !           110:  * optimizer phase if overlaid, and all makes sure
        !           111:  * that the hash table is clear if this is the
        !           112:  * second file in a monolithic compilation.
        !           113:  */
        !           114: freesym2()
        !           115: {
        !           116:        register SYM    *sp1;
        !           117:        register SYM    *sp2;
        !           118:        register int    i;
        !           119: 
        !           120:        for (i=0; i<NSHASH; ++i) {
        !           121:                sp1 = hash2[i];
        !           122:                while (sp1 != NULL) {
        !           123:                        sp2 = sp1->s_fp;
        !           124:                        free((char *) sp1);
        !           125:                        sp1 = sp2;
        !           126:                }
        !           127:                hash2[i] = NULL;
        !           128:        }
        !           129: }
        !           130: #endif

unix.superglobalmegacorp.com

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