1 /* Part of CPP library. (Macro hash table support.)
2 * Copyright (C) 1986, 87, 89, 92, 93, 94, 1995 Free Software Foundation, Inc.
3 * Written by Per Bothner, 1994.
4 * Based on CCCP program by by Paul Rubin, June 1986
5 * Adapted to ANSI C, Richard Stallman, Jan 1987
6 * Copyright (C) 2003-2011 Kim Woelders
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2, or (at your option) any
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22 * In other words, you are welcome to use, share and improve this program.
23 * You are forbidden to forbid anyone else to use, share and improve
24 * what you give them. Help stamp out software-hoarding! */
36 static HASHNODE *hashtab[HASHSIZE];
38 #define IS_IDCHAR(ch) is_idchar[(unsigned char)(ch)]
41 * return hash function on name. must be compatible with the one
42 * computed a step at a time, elsewhere
45 hashf(const char *name, int len, int hashsize)
50 r = HASHSTEP(r, *name++);
52 return MAKE_POS(r) % hashsize;
56 * find the most recent hash node for name name (ending with first
57 * non-identifier char) installed by install
59 * If LEN is >= 0, it is the length of the name.
60 * Otherwise, compute the length by scanning the entire name.
62 * If HASH is >= 0, it is the precomputed hash code.
63 * Otherwise, compute the hash code.
66 cpp_lookup(const char *name, int len, int hash)
73 for (bp = name; IS_IDCHAR(*bp); bp++)
78 hash = hashf(name, len, HASHSIZE);
80 bucket = hashtab[hash];
83 if (bucket->length == len
84 && strncmp((const char *)bucket->name, name, len) == 0)
86 bucket = bucket->next;
88 return (HASHNODE *) 0;
92 * Delete a hash node. Some weirdness to free junk from macros.
93 * More such weirdness will have to be added if you define more hash
97 /* Note that the DEFINITION of a macro is removed from the hash table
98 * but its storage is not freed. This would be a storage leak
99 * except that it is not reasonable to keep undefining and redefining
100 * large numbers of macros many times.
101 * In any case, this is necessary, because a macro can be #undef'd
102 * in the middle of reading the arguments to a call to it.
103 * If #undef freed the DEFINITION, that would crash. */
106 delete_macro(HASHNODE * hp)
110 hp->prev->next = hp->next;
112 hp->next->prev = hp->prev;
114 /* make sure that the bucket chain header that
115 * the deleted guy was on points to the right thing afterwards. */
116 if (hp == *hp->bucket_hdr)
117 *hp->bucket_hdr = hp->next;
119 if (hp->type == T_MACRO)
121 DEFINITION *d = hp->value.defn;
122 struct reflist *ap, *nextap;
124 for (ap = d->pattern; ap; ap = nextap)
130 free(d->args.argnames);
136 * install a name in the main hash table, even if it is already there.
137 * name stops with first non alphanumeric, except leading '#'.
138 * caller must check against redefinition if that is desired.
139 * delete_macro () removes things installed by install () in fifo order.
140 * this is important because of the `defined' special symbol used
141 * in #if, and also if pushdef/popdef directives are ever implemented.
143 * If LEN is >= 0, it is the length of the name.
144 * Otherwise, compute the length by scanning the entire name.
146 * If HASH is >= 0, it is the precomputed hash code.
147 * Otherwise, compute the hash code.
150 install(const char *name, int len, enum node_type type, int ivalue, char *value,
160 while (IS_IDCHAR(*p))
165 hash = hashf(name, len, HASHSIZE);
167 i = sizeof(HASHNODE) + len + 1;
168 hp = (HASHNODE *) xmalloc(i);
170 hp->bucket_hdr = &hashtab[bucket];
171 hp->next = hashtab[bucket];
172 hashtab[bucket] = hp;
178 if (hp->type == T_CONST)
179 hp->value.ival = ivalue;
181 hp->value.cpval = value;
182 hp->name = ((char *)hp) + sizeof(HASHNODE);
183 memcpy(hp->name, name, len);
189 cpp_hash_cleanup(cpp_reader * pfile __UNUSED__)
193 for (i = HASHSIZE; --i >= 0;)
196 delete_macro(hashtab[i]);