Annotation of 43BSDReno/pgrm/dbx/names.c, revision 1.1

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

unix.superglobalmegacorp.com

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