1 /******************************************************************************
3 * Copyright (C) 2010 David Barr <david.barr@cordelta.com>.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice(s), this list of conditions and the following disclaimer
11 * unmodified other than the allowable addition of one or more
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice(s), this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 ******************************************************************************/
42 #include "string_pool.h"
44 typedef struct node_s node_t
;
48 trp_node(node_t
) children
;
51 typedef trp(node_t
) tree_t
;
53 static tree_t tree
= { NULL
};
55 obj_pool_gen(node
, node_t
, 32768);
56 obj_pool_gen(string
, char, 4096);
58 static char *node_value(node_t
* node
)
60 return node
? string_pointer(node
->offset
) : NULL
;
63 static int node_value_cmp(node_t
* a
, node_t
* b
)
65 return strcmp(node_value(a
), node_value(b
));
68 static int node_indentity_cmp(node_t
* a
, node_t
* b
)
70 int r
= node_value_cmp(a
, b
);
71 return r
? r
: (((uintptr_t) a
) > ((uintptr_t) b
))
72 - (((uintptr_t) a
) < ((uintptr_t) b
));
75 trp_gen(static, tree_
, tree_t
, node_t
, children
, node_pool
.base
,
78 char *pool_fetch(uint32_t entry
)
80 return node_value(node_pointer(entry
- 1));
83 uint32_t pool_intern(char *key
)
86 uint32_t key_len
= strlen(key
) + 1;
87 node_t
*node
= node_pointer(node_alloc(1));
88 node
->offset
= string_alloc(key_len
);
89 strcpy(node_value(node
), key
);
90 match
= tree_psearch(&tree
, node
);
91 if (!match
|| node_value_cmp(node
, match
)) {
92 tree_insert(&tree
, node
);
98 return node_offset(match
) + 1;
101 uint32_t pool_tok_r(char *str
, const char *delim
, char **saveptr
)
103 char *token
= strtok_r(str
, delim
, saveptr
);
104 return token
? pool_intern(token
) : 0;