]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/dictionary.h
Replace the MSYMBOL_*_NAME macros with member functions
[thirdparty/binutils-gdb.git] / gdb / dictionary.h
CommitLineData
de4f826b
DC
1/* Routines for name->symbol lookups in GDB.
2
42a4f53d 3 Copyright (C) 2003-2019 Free Software Foundation, Inc.
de4f826b
DC
4
5 Contributed by David Carlton <carlton@bactrian.org> and by Kealia,
6 Inc.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7
JB
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
de4f826b 14
a9762ec7
JB
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
de4f826b
DC
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
de4f826b
DC
22
23#ifndef DICTIONARY_H
24#define DICTIONARY_H
25
2edb89d3
JK
26#include "symfile.h"
27
b026f593
KS
28/* An opaque type for multi-language dictionaries; only dictionary.c should
29 know about its innards. */
de4f826b 30
b026f593 31struct multidictionary;
de4f826b
DC
32
33/* Other types needed for declarations. */
34
35struct symbol;
36struct obstack;
37struct pending;
5ffa0793 38struct language_defn;
de4f826b
DC
39
40/* The creation functions for various implementations of
b026f593 41 multi-language dictionaries. */
de4f826b 42
b026f593 43/* Create a multi-language dictionary of symbols implemented via
5ffa0793
PA
44 a fixed-size hashtable. All memory it uses is allocated on
45 OBSTACK; the environment is initialized from SYMBOL_LIST. */
de4f826b 46
b026f593
KS
47extern struct multidictionary *
48 mdict_create_hashed (struct obstack *obstack,
49 const struct pending *symbol_list);
de4f826b 50
b026f593
KS
51/* Create a multi-language dictionary of symbols, implemented
52 via a hashtable that grows as necessary. The initial dictionary of
53 LANGUAGE is empty; to add symbols to it, call mdict_add_symbol().
54 Call mdict_free() when you're done with it. */
de4f826b 55
b026f593
KS
56extern struct multidictionary *
57 mdict_create_hashed_expandable (enum language language);
de4f826b 58
b026f593 59/* Create a multi-language dictionary of symbols, implemented
5ffa0793
PA
60 via a fixed-size array. All memory it uses is allocated on
61 OBSTACK; the environment is initialized from the SYMBOL_LIST. The
62 symbols are ordered in the same order that they're found in
63 SYMBOL_LIST. */
de4f826b 64
b026f593
KS
65extern struct multidictionary *
66 mdict_create_linear (struct obstack *obstack,
67 const struct pending *symbol_list);
de4f826b 68
b026f593
KS
69/* Create a multi-language dictionary of symbols, implemented
70 via an array that grows as necessary. The multidictionary initially
71 contains a single empty dictionary of LANGUAGE; to add symbols to it,
72 call mdict_add_symbol(). Call mdict_free() when you're done with it. */
de4f826b 73
b026f593
KS
74extern struct multidictionary *
75 mdict_create_linear_expandable (enum language language);
de4f826b 76
b026f593
KS
77/* The functions providing the interface to multi-language dictionaries.
78 Note that the most common parts of the interface, namely symbol lookup,
79 are only provided via iterator functions. */
de4f826b 80
b026f593 81/* Free the memory used by a multidictionary that's not on an obstack. (If
de4f826b
DC
82 any.) */
83
b026f593 84extern void mdict_free (struct multidictionary *mdict);
de4f826b 85
b026f593 86/* Add a symbol to an expandable multidictionary. */
de4f826b 87
b026f593
KS
88extern void mdict_add_symbol (struct multidictionary *mdict,
89 struct symbol *sym);
de4f826b 90
b026f593 91/* Utility to add a list of symbols to a multidictionary. */
0bfa869d 92
b026f593
KS
93extern void mdict_add_pending (struct multidictionary *mdict,
94 const struct pending *symbol_list);
0bfa869d 95
b026f593 96/* Is the multidictionary empty? */
de4f826b 97
b026f593 98extern int mdict_empty (struct multidictionary *mdict);
de4f826b
DC
99
100/* A type containing data that is used when iterating over all symbols
101 in a dictionary. Don't ever look at its innards; this type would
102 be opaque if we didn't need to be able to allocate it on the
103 stack. */
104
105struct dict_iterator
106{
107 /* The dictionary that this iterator is associated to. */
108 const struct dictionary *dict;
109 /* The next two members are data that is used in a way that depends
110 on DICT's implementation type. */
111 int index;
112 struct symbol *current;
113};
114
c7748ee9
KS
115/* The multi-language dictionary iterator. Like dict_iterator above,
116 these contents should be considered private. */
117
118struct mdict_iterator
119{
120 /* The multidictionary with whcih this iterator is associated. */
121 const struct multidictionary *mdict;
122
123 /* The iterator used to iterate through individual dictionaries. */
124 struct dict_iterator iterator;
125
126 /* The current index of the dictionary being iterated over. */
127 unsigned short current_idx;
128};
129
b026f593
KS
130/* Initialize ITERATOR to point at the first symbol in MDICT, and
131 return that first symbol, or NULL if MDICT is empty. */
de4f826b 132
b026f593
KS
133extern struct symbol *
134 mdict_iterator_first (const struct multidictionary *mdict,
135 struct mdict_iterator *miterator);
de4f826b 136
b026f593 137/* Advance MITERATOR, and return the next symbol, or NULL if there are
de4f826b 138 no more symbols. Don't call this if you've previously received
b026f593 139 NULL from mdict_iterator_first or mdict_iterator_next on this
de4f826b
DC
140 iteration. */
141
b026f593 142extern struct symbol *mdict_iterator_next (struct mdict_iterator *miterator);
de4f826b 143
b026f593 144/* Initialize MITERATOR to point at the first symbol in MDICT whose
c4d840bd
PH
145 SYMBOL_SEARCH_NAME is NAME, as tested using COMPARE (which must use
146 the same conventions as strcmp_iw and be compatible with any
147 dictionary hashing function), and return that first symbol, or NULL
148 if there are no such symbols. */
149
b026f593
KS
150extern struct symbol *
151 mdict_iter_match_first (const struct multidictionary *mdict,
152 const lookup_name_info &name,
153 struct mdict_iterator *miterator);
c4d840bd 154
b026f593 155/* Advance MITERATOR to point at the next symbol in MDICT whose
c4d840bd
PH
156 SYMBOL_SEARCH_NAME is NAME, as tested using COMPARE (see
157 dict_iter_match_first), or NULL if there are no more such symbols.
158 Don't call this if you've previously received NULL from
b026f593
KS
159 mdict_iterator_match_first or mdict_iterator_match_next on this
160 iteration. And don't call it unless MITERATOR was created by a
161 previous call to mdict_iter_match_first with the same NAME and COMPARE. */
c4d840bd 162
b026f593
KS
163extern struct symbol *mdict_iter_match_next (const lookup_name_info &name,
164 struct mdict_iterator *miterator);
c4d840bd 165
b026f593 166/* Return some notion of the size of the multidictionary: the number of
de4f826b
DC
167 symbols if we have that, the number of hash buckets otherwise. */
168
b026f593 169extern int mdict_size (const struct multidictionary *mdict);
de4f826b
DC
170
171/* Macro to loop through all symbols in a dictionary DICT, in no
172 particular order. ITER is a struct dict_iterator (NOTE: __not__ a
173 struct dict_iterator *), and SYM points to the current symbol.
174
175 It's implemented as a single loop, so you can terminate the loop
176 early by a break if you desire. */
177
178#define ALL_DICT_SYMBOLS(dict, iter, sym) \
b026f593 179 for ((sym) = mdict_iterator_first ((dict), &(iter)); \
de4f826b 180 (sym); \
b026f593 181 (sym) = mdict_iterator_next (&(iter)))
de4f826b
DC
182
183#endif /* DICTIONARY_H */