1 /* sym - symbol table routines */
4 * Copyright (c) 1990 The Regents of the University of California.
7 * This code is derived from software contributed to Berkeley by
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.
14 * Redistribution and use in source and binary forms with or without
15 * modification are permitted provided that: (1) source distributions retain
16 * this entire copyright notice and comment, and (2) distributions including
17 * binaries display the following acknowledgement: ``This product includes
18 * software developed by the University of California, Berkeley and its
19 * contributors'' in the documentation or other materials provided with the
20 * distribution and in all advertising materials mentioning features or use
21 * of this software. Neither the name of the University nor the names of
22 * its contributors may be used to endorse or promote products derived from
23 * this software without 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.
34 /* declare functions that have forward references */
36 int hashfunct
PROTO((register char[], int));
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
];
43 struct hash_entry
*findsym();
46 /* addsym - add symbol and definitions to symbol table
48 * -1 is returned if the symbol already exists, and the change not made.
51 int addsym( sym
, str_def
, int_def
, table
, table_size
)
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
;
65 if ( ! strcmp( sym
, sym_entry
->name
) )
66 { /* entry already exists */
70 sym_entry
= sym_entry
->next
;
73 /* create new entry */
74 new_entry
= (struct hash_entry
*)
75 flex_alloc( sizeof( struct hash_entry
) );
77 if ( new_entry
== NULL
)
78 flexfatal( _( "symbol table memory allocation failed" ) );
80 if ( (successor
= table
[hash_val
]) != 0 )
82 new_entry
->next
= successor
;
83 successor
->prev
= new_entry
;
86 new_entry
->next
= NULL
;
88 new_entry
->prev
= NULL
;
89 new_entry
->name
= sym
;
90 new_entry
->str_val
= str_def
;
91 new_entry
->int_val
= int_def
;
93 table
[hash_val
] = new_entry
;
99 /* cclinstal - save the text of a character class */
101 void cclinstal( ccltxt
, cclnum
)
105 /* We don't bother checking the return status because we are not
106 * called unless the symbol is new.
108 Char
*copy_unsigned_string();
110 (void) addsym( (char *) copy_unsigned_string( ccltxt
),
112 ccltab
, CCL_HASH_SIZE
);
116 /* ccllookup - lookup the number associated with character class text
118 * Returns 0 if there's no CCL associated with the text.
121 int ccllookup( ccltxt
)
124 return findsym( (char *) ccltxt
, ccltab
, CCL_HASH_SIZE
)->int_val
;
128 /* findsym - find symbol in symbol table */
130 struct hash_entry
*findsym( sym
, table
, table_size
)
135 static struct hash_entry empty_entry
=
137 (struct hash_entry
*) 0, (struct hash_entry
*) 0,
138 (char *) 0, (char *) 0, 0,
140 register struct hash_entry
*sym_entry
=
141 table
[hashfunct( sym
, table_size
)];
145 if ( ! strcmp( sym
, sym_entry
->name
) )
147 sym_entry
= sym_entry
->next
;
154 /* hashfunct - compute the hash value for "str" and hash size "hash_size" */
156 int hashfunct( str
, hash_size
)
160 register int hashval
;
166 while ( str
[locstr
] )
168 hashval
= (hashval
<< 1) + (unsigned char) str
[locstr
++];
169 hashval
%= hash_size
;
176 /* ndinstal - install a name definition */
178 void ndinstal( name
, definition
)
183 Char
*copy_unsigned_string();
185 if ( addsym( copy_string( name
),
186 (char *) copy_unsigned_string( definition
), 0,
187 ndtbl
, NAME_TABLE_HASH_SIZE
) )
188 synerr( _( "name defined twice" ) );
192 /* ndlookup - lookup a name definition
194 * Returns a nil pointer if the name definition does not exist.
200 return (Char
*) findsym( nd
, ndtbl
, NAME_TABLE_HASH_SIZE
)->str_val
;
204 /* scextend - increase the maximum number of start conditions */
208 current_max_scs
+= MAX_SCS_INCREMENT
;
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
);
220 /* scinstal - make a start condition
223 * The start condition is "exclusive" if xcluflg is true.
226 void scinstal( str
, xcluflg
)
232 /* Generate start condition definition, for use in BEGIN et al. */
233 action_define( str
, lastsc
);
235 if ( ++lastsc
>= current_max_scs
)
238 scname
[lastsc
] = copy_string( str
);
240 if ( addsym( scname
[lastsc
], (char *) 0, lastsc
,
241 sctbl
, START_COND_HASH_SIZE
) )
242 format_pinpoint_message(
243 _( "start condition %s declared twice" ),
246 scset
[lastsc
] = mkstate( SYM_EPSILON
);
247 scbol
[lastsc
] = mkstate( SYM_EPSILON
);
248 scxclu
[lastsc
] = xcluflg
;
249 sceof
[lastsc
] = false;
253 /* sclookup - lookup the number associated with a start condition
255 * Returns 0 if no such start condition.
261 return findsym( str
, sctbl
, START_COND_HASH_SIZE
)->int_val
;