Annotation of 43BSDTahoe/lib/old_compiler/dbx/names.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1983 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #ifndef lint
        !             8: static char sccsid[] = "@(#)names.c    5.2 (Berkeley) 1/12/88";
        !             9: #endif not lint
        !            10: 
        !            11: static char rcsid[] = "$Header: names.c,v 1.2 87/03/26 20:16:59 donn Exp $";
        !            12: 
        !            13: /*
        !            14:  * Name are the internal representation for identifiers.
        !            15:  *
        !            16:  * A hash table is used to map identifiers to names.
        !            17:  */
        !            18: 
        !            19: #include "defs.h"
        !            20: #include "names.h"
        !            21: 
        !            22: #ifndef public
        !            23: typedef struct Name *Name;
        !            24: 
        !            25: /*
        !            26:  * Inline (for speed) function to return the identifier (string)
        !            27:  * associated with a name.  Because C cannot support both inlines
        !            28:  * and data hiding at the same time, the Name structure must be
        !            29:  * publicly visible.  It is not used explicitly, however, outside of this file.
        !            30:  */
        !            31: 
        !            32: struct Name {
        !            33:     char *identifier;
        !            34:     Name chain;
        !            35: };
        !            36: 
        !            37: #define ident(n) ((n == nil) ? "(noname)" : n->identifier)
        !            38: #endif
        !            39: 
        !            40: /*
        !            41:  * The hash table is a power of two, in order to make hashing faster.
        !            42:  * Using a non-prime is ok since we use chaining instead of re-hashing.
        !            43:  */
        !            44: 
        !            45: #define HASHTABLESIZE 8192
        !            46: 
        !            47: private Name nametable[HASHTABLESIZE];
        !            48: 
        !            49: /*
        !            50:  * Names are allocated in large chunks to avoid calls to malloc
        !            51:  * and to cluster names in memory so that tracing hash chains
        !            52:  * doesn't cause many a page fault.
        !            53:  */
        !            54: 
        !            55: #define CHUNKSIZE 1000
        !            56: 
        !            57: typedef struct Namepool {
        !            58:     struct Name name[CHUNKSIZE];
        !            59:     struct Namepool *prevpool;
        !            60: } *Namepool;
        !            61: 
        !            62: private Namepool namepool = nil;
        !            63: private Integer nleft = 0;
        !            64: 
        !            65: /*
        !            66:  * Given an identifier, convert it to a name.
        !            67:  * If it's not in the hash table, then put it there.
        !            68:  *
        !            69:  * The second argument specifies whether the string should be copied
        !            70:  * into newly allocated space if not found.
        !            71:  *
        !            72:  * This routine is time critical when starting up the debugger
        !            73:  * on large programs.
        !            74:  */
        !            75: 
        !            76: public Name identname(s, isallocated)
        !            77: String s;
        !            78: Boolean isallocated;
        !            79: {
        !            80:     register unsigned h;
        !            81:     register char *p, *q;
        !            82:     register Name n, *np;
        !            83:     Namepool newpool;
        !            84: 
        !            85:     h = 0;
        !            86:     for (p = s; *p != '\0'; p++) {
        !            87:        h = (h << 1) ^ (*p);
        !            88:     }
        !            89:     h &= (HASHTABLESIZE-1);
        !            90:     np = &nametable[h];
        !            91:     n = *np;
        !            92:     while (n != nil) {
        !            93:        p = s;
        !            94:        q = n->identifier;
        !            95:        while (*p == *q) {
        !            96:            if (*p == '\0') {
        !            97:                return n;
        !            98:            }
        !            99:            ++p;
        !           100:            ++q;
        !           101:        }
        !           102:        n = n->chain;
        !           103:     }
        !           104: 
        !           105:     /*
        !           106:      * Now we know that name hasn't been found,
        !           107:      * so we allocate a name, store the identifier, and
        !           108:      * enter it in the hash table.
        !           109:      */
        !           110:     if (nleft <= 0) {
        !           111:        newpool = new(Namepool);
        !           112:        newpool->prevpool = namepool;
        !           113:        namepool = newpool;
        !           114:        nleft = CHUNKSIZE;
        !           115:     }
        !           116:     --nleft;
        !           117:     n = &(namepool->name[nleft]);
        !           118:     if (isallocated) {
        !           119:        n->identifier = s;
        !           120:     } else {
        !           121:        /* this case doesn't happen very often */
        !           122:        n->identifier = newarr(char, strlen(s) + 1);
        !           123:        p = s;
        !           124:        q = n->identifier;
        !           125:        while (*p != '\0') {
        !           126:            *q++ = *p++;
        !           127:        }
        !           128:        *q = '\0';
        !           129:     }
        !           130:     n->chain = *np;
        !           131:     *np = n;
        !           132:     return n;
        !           133: }
        !           134: 
        !           135: /*
        !           136:  * Deallocate the name table.
        !           137:  */
        !           138: 
        !           139: public names_free()
        !           140: {
        !           141:     Namepool n, m;
        !           142:     register integer i;
        !           143: 
        !           144:     n = namepool;
        !           145:     while (n != nil) {
        !           146:        m = n->prevpool;
        !           147:        dispose(n);
        !           148:        n = m;
        !           149:     }
        !           150:     for (i = 0; i < HASHTABLESIZE; i++) {
        !           151:        nametable[i] = nil;
        !           152:     }
        !           153:     namepool = nil;
        !           154:     nleft = 0;
        !           155: }

unix.superglobalmegacorp.com

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