2 * Licensed under a two-clause BSD-style license.
3 * See LICENSE for details.
6 #include "git-compat-util.h"
9 #include "string_pool.h"
11 static struct trp_root tree
= { ~0 };
15 struct trp_node children
;
18 /* Two memory pools: one for struct node, and another for strings */
19 obj_pool_gen(node
, struct node
, 4096)
20 obj_pool_gen(string
, char, 4096)
22 static char *node_value(struct node
*node
)
24 return node
? string_pointer(node
->offset
) : NULL
;
27 static int node_cmp(struct node
*a
, struct node
*b
)
29 return strcmp(node_value(a
), node_value(b
));
32 /* Build a Treap from the node structure (a trp_node w/ offset) */
33 trp_gen(static, tree_
, struct node
, children
, node
, node_cmp
)
35 const char *pool_fetch(uint32_t entry
)
37 return node_value(node_pointer(entry
));
40 uint32_t pool_intern(const char *key
)
42 /* Canonicalize key */
43 struct node
*match
= NULL
, *node
;
47 key_len
= strlen(key
) + 1;
48 node
= node_pointer(node_alloc(1));
49 node
->offset
= string_alloc(key_len
);
50 strcpy(node_value(node
), key
);
51 match
= tree_search(&tree
, node
);
53 tree_insert(&tree
, node
);
59 return node_offset(node
);
62 uint32_t pool_tok_r(char *str
, const char *delim
, char **saveptr
)
64 char *token
= strtok_r(str
, delim
, saveptr
);
65 return token
? pool_intern(token
) : ~0;
68 void pool_print_seq(uint32_t len
, uint32_t *seq
, char delim
, FILE *stream
)
71 for (i
= 0; i
< len
&& ~seq
[i
]; i
++) {
72 fputs(pool_fetch(seq
[i
]), stream
);
73 if (i
< len
- 1 && ~seq
[i
+ 1])
78 uint32_t pool_tok_seq(uint32_t sz
, uint32_t *seq
, const char *delim
, char *str
)
87 token
= pool_tok_r(str
, delim
, &context
);
88 for (length
= 0; length
< sz
; length
++) {
92 token
= pool_tok_r(NULL
, delim
, &context
);