xref: /freebsd/contrib/expat/lib/hash_table.h (revision c7b67985633c408cae69703ca443cbfd84d326a8)
1*c7b67985SPhilip Paeps /* Hash table related internal API
2*c7b67985SPhilip Paeps                             __  __            _
3*c7b67985SPhilip Paeps                          ___\ \/ /_ __   __ _| |_
4*c7b67985SPhilip Paeps                         / _ \\  /| '_ \ / _` | __|
5*c7b67985SPhilip Paeps                        |  __//  \| |_) | (_| | |_
6*c7b67985SPhilip Paeps                         \___/_/\_\ .__/ \__,_|\__|
7*c7b67985SPhilip Paeps                                  |_| XML parser
8*c7b67985SPhilip Paeps 
9*c7b67985SPhilip Paeps    Copyright (c) 2026 Sebastian Pipping <sebastian@pipping.org>
10*c7b67985SPhilip Paeps    Licensed under the MIT license:
11*c7b67985SPhilip Paeps 
12*c7b67985SPhilip Paeps    Permission is  hereby granted,  free of charge,  to any  person obtaining
13*c7b67985SPhilip Paeps    a  copy  of  this  software   and  associated  documentation  files  (the
14*c7b67985SPhilip Paeps    "Software"),  to  deal in  the  Software  without restriction,  including
15*c7b67985SPhilip Paeps    without  limitation the  rights  to use,  copy,  modify, merge,  publish,
16*c7b67985SPhilip Paeps    distribute, sublicense, and/or sell copies of the Software, and to permit
17*c7b67985SPhilip Paeps    persons  to whom  the Software  is  furnished to  do so,  subject to  the
18*c7b67985SPhilip Paeps    following conditions:
19*c7b67985SPhilip Paeps 
20*c7b67985SPhilip Paeps    The above copyright  notice and this permission notice  shall be included
21*c7b67985SPhilip Paeps    in all copies or substantial portions of the Software.
22*c7b67985SPhilip Paeps 
23*c7b67985SPhilip Paeps    THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
24*c7b67985SPhilip Paeps    EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
25*c7b67985SPhilip Paeps    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
26*c7b67985SPhilip Paeps    NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
27*c7b67985SPhilip Paeps    DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
28*c7b67985SPhilip Paeps    OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
29*c7b67985SPhilip Paeps    USE OR OTHER DEALINGS IN THE SOFTWARE.
30*c7b67985SPhilip Paeps 
31*c7b67985SPhilip Paeps    SPDX-License-Identifier: MIT
32*c7b67985SPhilip Paeps */
33*c7b67985SPhilip Paeps 
34*c7b67985SPhilip Paeps #if ! defined(HASH_TABLE_H)
35*c7b67985SPhilip Paeps #  define HASH_TABLE_H 1
36*c7b67985SPhilip Paeps 
37*c7b67985SPhilip Paeps #  include "expat.h"    // for XML_Bool, XML_Parser
38*c7b67985SPhilip Paeps #  include "internal.h" // for XML_NONTESTING_STATIC
39*c7b67985SPhilip Paeps 
40*c7b67985SPhilip Paeps #  include <stddef.h> // for size_t
41*c7b67985SPhilip Paeps 
42*c7b67985SPhilip Paeps typedef const XML_Char *KEY;
43*c7b67985SPhilip Paeps 
44*c7b67985SPhilip Paeps typedef struct {
45*c7b67985SPhilip Paeps   KEY name;
46*c7b67985SPhilip Paeps } NAMED;
47*c7b67985SPhilip Paeps 
48*c7b67985SPhilip Paeps typedef struct {
49*c7b67985SPhilip Paeps   NAMED **v;
50*c7b67985SPhilip Paeps   unsigned char power;
51*c7b67985SPhilip Paeps   size_t size;
52*c7b67985SPhilip Paeps   size_t used;
53*c7b67985SPhilip Paeps   XML_Parser parser;
54*c7b67985SPhilip Paeps } HASH_TABLE;
55*c7b67985SPhilip Paeps 
56*c7b67985SPhilip Paeps typedef struct {
57*c7b67985SPhilip Paeps   NAMED **p;
58*c7b67985SPhilip Paeps   NAMED **end;
59*c7b67985SPhilip Paeps } HASH_TABLE_ITER;
60*c7b67985SPhilip Paeps 
61*c7b67985SPhilip Paeps XML_NONTESTING_STATIC NAMED *lookupWithLength(XML_Parser parser,
62*c7b67985SPhilip Paeps                                               HASH_TABLE *table, KEY name,
63*c7b67985SPhilip Paeps                                               size_t nameLen,
64*c7b67985SPhilip Paeps                                               size_t createSize);
65*c7b67985SPhilip Paeps XML_NONTESTING_STATIC NAMED *lookup(XML_Parser parser, HASH_TABLE *table,
66*c7b67985SPhilip Paeps                                     KEY name, size_t createSize);
67*c7b67985SPhilip Paeps 
68*c7b67985SPhilip Paeps XML_NONTESTING_STATIC void hashTableInit(HASH_TABLE *table, XML_Parser parser);
69*c7b67985SPhilip Paeps XML_NONTESTING_STATIC void hashTableClear(HASH_TABLE *table);
70*c7b67985SPhilip Paeps XML_NONTESTING_STATIC void hashTableDestroy(HASH_TABLE *table);
71*c7b67985SPhilip Paeps XML_NONTESTING_STATIC void hashTableIterInit(HASH_TABLE_ITER *iter,
72*c7b67985SPhilip Paeps                                              const HASH_TABLE *table);
73*c7b67985SPhilip Paeps XML_NONTESTING_STATIC NAMED *hashTableIterNext(HASH_TABLE_ITER *iter);
74*c7b67985SPhilip Paeps 
75*c7b67985SPhilip Paeps XML_NONTESTING_STATIC XML_Bool keyeq(KEY s1, size_t s1len, KEY s2);
76*c7b67985SPhilip Paeps XML_NONTESTING_STATIC size_t keylen(KEY s);
77*c7b67985SPhilip Paeps 
78*c7b67985SPhilip Paeps #endif // ! defined(HASH_TABLE_H)
79