]> git.ipfire.org Git - thirdparty/gcc.git/blame - libcpp/identifiers.c
- remove empty picoship directories.
[thirdparty/gcc.git] / libcpp / identifiers.c
CommitLineData
0d086e18 1/* Hash tables for the CPP library.
806a3d45 2 Copyright (C) 1986-2014 Free Software Foundation, Inc.
1d6fa33f 3 Written by Per Bothner, 1994.
3398e91d 4 Based on CCCP program by Paul Rubin, June 1986
1d6fa33f 5 Adapted to ANSI C, Richard Stallman, Jan 1987
6
7This program is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by the
6bc9506f 9Free Software Foundation; either version 3, or (at your option) any
1d6fa33f 10later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
6bc9506f 18along with this program; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>.
1d6fa33f 20
21 In other words, you are welcome to use, share and improve this program.
22 You are forbidden to forbid anyone else to use, share and improve
23 what you give them. Help stamp out software-hoarding! */
24
1486870d 25#include "config.h"
26#include "system.h"
1d6fa33f 27#include "cpplib.h"
d856c8a6 28#include "internal.h"
2b3dbc20 29
2b15d2ba 30static hashnode alloc_node (cpp_hash_table *);
1d6fa33f 31
0d086e18 32/* Return an identifier node for hashtable.c. Used by cpplib except
33 when integrated with the C front ends. */
e297899b 34static hashnode
2b15d2ba 35alloc_node (cpp_hash_table *table)
b0a314a7 36{
0d086e18 37 cpp_hashnode *node;
b1a9ff83 38
720aca92 39 node = XOBNEW (&table->pfile->hash_ob, cpp_hashnode);
b9a7cc69 40 memset (node, 0, sizeof (cpp_hashnode));
e297899b 41 return HT_NODE (node);
da2bd80d 42}
43
0d086e18 44/* Set up the identifier hash table. Use TABLE if non-null, otherwise
45 create our own. */
69461e0d 46void
2b15d2ba 47_cpp_init_hashtable (cpp_reader *pfile, cpp_hash_table *table)
6d71dc85 48{
9ceb1c29 49 struct spec_nodes *s;
50
0d086e18 51 if (table == NULL)
6d71dc85 52 {
0d086e18 53 pfile->our_hashtable = 1;
54 table = ht_create (13); /* 8K (=2^13) entries. */
e297899b 55 table->alloc_node = alloc_node;
69edc0b3 56
57 _obstack_begin (&pfile->hash_ob, 0, 0,
58 (void *(*) (long)) xmalloc,
59 (void (*) (void *)) free);
be164b73 60 }
69461e0d 61
0d086e18 62 table->pfile = pfile;
63 pfile->hash_table = table;
9ceb1c29 64
65 /* Now we can initialize things that use the hash table. */
66 _cpp_init_directives (pfile);
67 _cpp_init_internal_pragmas (pfile);
68
69 s = &pfile->spec_nodes;
9ceb1c29 70 s->n_defined = cpp_lookup (pfile, DSC("defined"));
71 s->n_true = cpp_lookup (pfile, DSC("true"));
72 s->n_false = cpp_lookup (pfile, DSC("false"));
9ceb1c29 73 s->n__VA_ARGS__ = cpp_lookup (pfile, DSC("__VA_ARGS__"));
74 s->n__VA_ARGS__->flags |= NODE_DIAGNOSTIC;
05dba164 75}
76
0d086e18 77/* Tear down the identifier hash table. */
0d086e18 78void
f7fdd7a1 79_cpp_destroy_hashtable (cpp_reader *pfile)
05dba164 80{
0d086e18 81 if (pfile->our_hashtable)
be164b73 82 {
162cee98 83 ht_destroy (pfile->hash_table);
0d086e18 84 obstack_free (&pfile->hash_ob, 0);
be164b73 85 }
0578f103 86}
87
0d086e18 88/* Returns the hash entry for the STR of length LEN, creating one
89 if necessary. */
69461e0d 90cpp_hashnode *
f7fdd7a1 91cpp_lookup (cpp_reader *pfile, const unsigned char *str, unsigned int len)
6d71dc85 92{
0d086e18 93 /* ht_lookup cannot return NULL. */
94 return CPP_HASHNODE (ht_lookup (pfile->hash_table, str, len, HT_ALLOC));
da2bd80d 95}
d453a374 96
0d086e18 97/* Determine whether the str STR, of length LEN, is a defined macro. */
0d086e18 98int
f7fdd7a1 99cpp_defined (cpp_reader *pfile, const unsigned char *str, int len)
da2bd80d 100{
0d086e18 101 cpp_hashnode *node;
d453a374 102
0d086e18 103 node = CPP_HASHNODE (ht_lookup (pfile->hash_table, str, len, HT_NO_INSERT));
5ecec5da 104
0d086e18 105 /* If it's of type NT_MACRO, it cannot be poisoned. */
106 return node && node->type == NT_MACRO;
5ecec5da 107}
108
e297899b 109/* We don't need a proxy since the hash table's identifier comes first
110 in cpp_hashnode. However, in case this is ever changed, we have a
111 static assertion for it. */
112extern char proxy_assertion_broken[offsetof (struct cpp_hashnode, ident) == 0 ? 1 : -1];
113
0d086e18 114/* For all nodes in the hashtable, callback CB with parameters PFILE,
115 the node, and V. */
5ecec5da 116void
f7fdd7a1 117cpp_forall_identifiers (cpp_reader *pfile, cpp_cb cb, void *v)
5ecec5da 118{
0d086e18 119 ht_forall (pfile->hash_table, (ht_cb) cb, v);
e14c5993 120}