[BACK]Return to sym.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / lex

Annotation of src/usr.bin/lex/sym.c, Revision 1.1.1.1

1.1       deraadt     1: /* sym - symbol table routines */
                      2:
                      3: /*-
                      4:  * Copyright (c) 1990 The Regents of the University of California.
                      5:  * All rights reserved.
                      6:  *
                      7:  * This code is derived from software contributed to Berkeley by
                      8:  * Vern Paxson.
                      9:  *
                     10:  * The United States Government has rights in this work pursuant
                     11:  * to contract no. DE-AC03-76SF00098 between the United States
                     12:  * Department of Energy and the University of California.
                     13:  *
                     14:  * Redistribution and use in source and binary forms are permitted provided
                     15:  * that: (1) source distributions retain this entire copyright notice and
                     16:  * comment, and (2) distributions including binaries display the following
                     17:  * acknowledgement:  ``This product includes software developed by the
                     18:  * University of California, Berkeley and its contributors'' in the
                     19:  * documentation or other materials provided with the distribution and in
                     20:  * all advertising materials mentioning features or use of this software.
                     21:  * Neither the name of the University nor the names of its contributors may
                     22:  * be used to endorse or promote products derived from this software without
                     23:  * specific prior written permission.
                     24:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
                     25:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
                     26:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     27:  */
                     28:
                     29: /* $Header: /a/cvsroot/src/usr.bin/lex/sym.c,v 1.7 1995/05/05 05:35:42 jtc Exp $ */
                     30:
                     31: #include "flexdef.h"
                     32:
                     33:
                     34: /* declare functions that have forward references */
                     35:
                     36: int hashfunct PROTO((register char[], int));
                     37:
                     38:
                     39: struct hash_entry *ndtbl[NAME_TABLE_HASH_SIZE];
                     40: struct hash_entry *sctbl[START_COND_HASH_SIZE];
                     41: struct hash_entry *ccltab[CCL_HASH_SIZE];
                     42:
                     43: struct hash_entry *findsym();
                     44:
                     45:
                     46: /* addsym - add symbol and definitions to symbol table
                     47:  *
                     48:  * -1 is returned if the symbol already exists, and the change not made.
                     49:  */
                     50:
                     51: int addsym( sym, str_def, int_def, table, table_size )
                     52: register char sym[];
                     53: char *str_def;
                     54: int int_def;
                     55: hash_table table;
                     56: int table_size;
                     57:        {
                     58:        int hash_val = hashfunct( sym, table_size );
                     59:        register struct hash_entry *sym_entry = table[hash_val];
                     60:        register struct hash_entry *new_entry;
                     61:        register struct hash_entry *successor;
                     62:
                     63:        while ( sym_entry )
                     64:                {
                     65:                if ( ! strcmp( sym, sym_entry->name ) )
                     66:                        { /* entry already exists */
                     67:                        return -1;
                     68:                        }
                     69:
                     70:                sym_entry = sym_entry->next;
                     71:                }
                     72:
                     73:        /* create new entry */
                     74:        new_entry = (struct hash_entry *)
                     75:                flex_alloc( sizeof( struct hash_entry ) );
                     76:
                     77:        if ( new_entry == NULL )
                     78:                flexfatal( _( "symbol table memory allocation failed" ) );
                     79:
                     80:        if ( (successor = table[hash_val]) != 0 )
                     81:                {
                     82:                new_entry->next = successor;
                     83:                successor->prev = new_entry;
                     84:                }
                     85:        else
                     86:                new_entry->next = NULL;
                     87:
                     88:        new_entry->prev = NULL;
                     89:        new_entry->name = sym;
                     90:        new_entry->str_val = str_def;
                     91:        new_entry->int_val = int_def;
                     92:
                     93:        table[hash_val] = new_entry;
                     94:
                     95:        return 0;
                     96:        }
                     97:
                     98:
                     99: /* cclinstal - save the text of a character class */
                    100:
                    101: void cclinstal( ccltxt, cclnum )
                    102: Char ccltxt[];
                    103: int cclnum;
                    104:        {
                    105:        /* We don't bother checking the return status because we are not
                    106:         * called unless the symbol is new.
                    107:         */
                    108:        Char *copy_unsigned_string();
                    109:
                    110:        (void) addsym( (char *) copy_unsigned_string( ccltxt ),
                    111:                        (char *) 0, cclnum,
                    112:                        ccltab, CCL_HASH_SIZE );
                    113:        }
                    114:
                    115:
                    116: /* ccllookup - lookup the number associated with character class text
                    117:  *
                    118:  * Returns 0 if there's no CCL associated with the text.
                    119:  */
                    120:
                    121: int ccllookup( ccltxt )
                    122: Char ccltxt[];
                    123:        {
                    124:        return findsym( (char *) ccltxt, ccltab, CCL_HASH_SIZE )->int_val;
                    125:        }
                    126:
                    127:
                    128: /* findsym - find symbol in symbol table */
                    129:
                    130: struct hash_entry *findsym( sym, table, table_size )
                    131: register char sym[];
                    132: hash_table table;
                    133: int table_size;
                    134:        {
                    135:        static struct hash_entry empty_entry =
                    136:                {
                    137:                (struct hash_entry *) 0, (struct hash_entry *) 0,
                    138:                (char *) 0, (char *) 0, 0,
                    139:                } ;
                    140:        register struct hash_entry *sym_entry =
                    141:                table[hashfunct( sym, table_size )];
                    142:
                    143:        while ( sym_entry )
                    144:                {
                    145:                if ( ! strcmp( sym, sym_entry->name ) )
                    146:                        return sym_entry;
                    147:                sym_entry = sym_entry->next;
                    148:                }
                    149:
                    150:        return &empty_entry;
                    151:        }
                    152:
                    153:
                    154: /* hashfunct - compute the hash value for "str" and hash size "hash_size" */
                    155:
                    156: int hashfunct( str, hash_size )
                    157: register char str[];
                    158: int hash_size;
                    159:        {
                    160:        register int hashval;
                    161:        register int locstr;
                    162:
                    163:        hashval = 0;
                    164:        locstr = 0;
                    165:
                    166:        while ( str[locstr] )
                    167:                {
                    168:                hashval = (hashval << 1) + (unsigned char) str[locstr++];
                    169:                hashval %= hash_size;
                    170:                }
                    171:
                    172:        return hashval;
                    173:        }
                    174:
                    175:
                    176: /* ndinstal - install a name definition */
                    177:
                    178: void ndinstal( name, definition )
                    179: char name[];
                    180: Char definition[];
                    181:        {
                    182:        char *copy_string();
                    183:        Char *copy_unsigned_string();
                    184:
                    185:        if ( addsym( copy_string( name ),
                    186:                        (char *) copy_unsigned_string( definition ), 0,
                    187:                        ndtbl, NAME_TABLE_HASH_SIZE ) )
                    188:                synerr( _( "name defined twice" ) );
                    189:        }
                    190:
                    191:
                    192: /* ndlookup - lookup a name definition
                    193:  *
                    194:  * Returns a nil pointer if the name definition does not exist.
                    195:  */
                    196:
                    197: Char *ndlookup( nd )
                    198: char nd[];
                    199:        {
                    200:        return (Char *) findsym( nd, ndtbl, NAME_TABLE_HASH_SIZE )->str_val;
                    201:        }
                    202:
                    203:
                    204: /* scextend - increase the maximum number of start conditions */
                    205:
                    206: void scextend()
                    207:        {
                    208:        current_max_scs += MAX_SCS_INCREMENT;
                    209:
                    210:        ++num_reallocs;
                    211:
                    212:        scset = reallocate_integer_array( scset, current_max_scs );
                    213:        scbol = reallocate_integer_array( scbol, current_max_scs );
                    214:        scxclu = reallocate_integer_array( scxclu, current_max_scs );
                    215:        sceof = reallocate_integer_array( sceof, current_max_scs );
                    216:        scname = reallocate_char_ptr_array( scname, current_max_scs );
                    217:        }
                    218:
                    219:
                    220: /* scinstal - make a start condition
                    221:  *
                    222:  * NOTE
                    223:  *    The start condition is "exclusive" if xcluflg is true.
                    224:  */
                    225:
                    226: void scinstal( str, xcluflg )
                    227: char str[];
                    228: int xcluflg;
                    229:        {
                    230:        char *copy_string();
                    231:
                    232:        /* Generate start condition definition, for use in BEGIN et al. */
                    233:        action_define( str, lastsc );
                    234:
                    235:        if ( ++lastsc >= current_max_scs )
                    236:                scextend();
                    237:
                    238:        scname[lastsc] = copy_string( str );
                    239:
                    240:        if ( addsym( scname[lastsc], (char *) 0, lastsc,
                    241:                        sctbl, START_COND_HASH_SIZE ) )
                    242:                format_pinpoint_message(
                    243:                                _( "start condition %s declared twice" ),
                    244:                                        str );
                    245:
                    246:        scset[lastsc] = mkstate( SYM_EPSILON );
                    247:        scbol[lastsc] = mkstate( SYM_EPSILON );
                    248:        scxclu[lastsc] = xcluflg;
                    249:        sceof[lastsc] = false;
                    250:        }
                    251:
                    252:
                    253: /* sclookup - lookup the number associated with a start condition
                    254:  *
                    255:  * Returns 0 if no such start condition.
                    256:  */
                    257:
                    258: int sclookup( str )
                    259: char str[];
                    260:        {
                    261:        return findsym( str, sctbl, START_COND_HASH_SIZE )->int_val;
                    262:        }