Annotation of researchv8dc/cmd/cyntax/cem/symbol.c, revision 1.1

1.1     ! root        1: #include       "cem.h"
        !             2: #include       "symbol.h"
        !             3: 
        !             4: /*
        !             5:  *     stab is a hash table of pointers to binary trees.
        !             6:  */
        !             7: static symbol  *stab[STABZ];
        !             8: 
        !             9: /*
        !            10:  *     Map the string 's' to its string table entry, creating a new one
        !            11:  *     if required.
        !            12:  */
        !            13: symbol *
        !            14: find_symbol(s)
        !            15: register char  *s;
        !            16: {
        !            17:        register int    i;
        !            18:        register symbol **n;
        !            19:        register char   *p;
        !            20:        register int    length;
        !            21:        extern char     *str_alloc();
        !            22: 
        !            23:        for (i = 0, length = 1, p = s; *p != '\0'; i += i ^ *p++)
        !            24:                length++;
        !            25: 
        !            26:        if (i < 0)
        !            27:                i = -i;
        !            28: 
        !            29:        n = &stab[i % STABZ];
        !            30: 
        !            31:        while (*n != NULL)
        !            32:        {
        !            33:                register char   *q;
        !            34: 
        !            35:                p = s;
        !            36:                q = (*n)->sy_name;
        !            37: 
        !            38:                while ((i = *p ^ *q) == 0 && *p++ != '\0' && *q++ != '\0')
        !            39:                        ;
        !            40: 
        !            41:                if (i == 0)
        !            42:                        return *n;
        !            43: 
        !            44:                n = i & 1 ? &((*n)->sy_left) : &((*n)->sy_right);
        !            45:        }
        !            46: 
        !            47:        *n = talloc(symbol);
        !            48:        (*n)->sy_name = str_alloc(s, length, &((*n)->sy_index));
        !            49:        (*n)->sy_left = NULL;
        !            50:        (*n)->sy_right = NULL;
        !            51:        (*n)->sy_inst = NULL;
        !            52: 
        !            53:        return *n;
        !            54: }

unix.superglobalmegacorp.com

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