2 * Licensed under a two-clause BSD-style license.
3 * See LICENSE for details.
6 #include "git-compat-util.h"
10 #include "string_pool.h"
12 static struct trp_root tree
= { ~0 };
16 struct trp_node children
;
19 /* Two memory pools: one for struct node, and another for strings */
20 obj_pool_gen(node
, struct node
, 4096)
21 obj_pool_gen(string
, char, 4096)
23 static char *node_value(struct node
*node
)
25 return node
? string_pointer(node
->offset
) : NULL
;
28 static int node_cmp(struct node
*a
, struct node
*b
)
30 return strcmp(node_value(a
), node_value(b
));
33 /* Build a Treap from the node structure (a trp_node w/ offset) */
34 trp_gen(static, tree_
, struct node
, children
, node
, node_cmp
);
36 const char *pool_fetch(uint32_t entry
)
38 return node_value(node_pointer(entry
));
41 uint32_t pool_intern(const char *key
)
43 /* Canonicalize key */
44 struct node
*match
= NULL
, *node
;
48 key_len
= strlen(key
) + 1;
49 node
= node_pointer(node_alloc(1));
50 node
->offset
= string_alloc(key_len
);
51 strcpy(node_value(node
), key
);
52 match
= tree_search(&tree
, node
);
54 tree_insert(&tree
, node
);
60 return node_offset(node
);
63 uint32_t pool_tok_r(char *str
, const char *delim
, char **saveptr
)
65 char *token
= strtok_r(str
, delim
, saveptr
);
66 return token
? pool_intern(token
) : ~0;
69 void pool_print_seq(uint32_t len
, const uint32_t *seq
, char delim
, FILE *stream
)
72 for (i
= 0; i
< len
&& ~seq
[i
]; i
++) {
73 fputs(pool_fetch(seq
[i
]), stream
);
74 if (i
< len
- 1 && ~seq
[i
+ 1])
79 void pool_print_seq_q(uint32_t len
, const uint32_t *seq
, char delim
, FILE *stream
)
82 for (i
= 0; i
< len
&& ~seq
[i
]; i
++) {
83 quote_c_style(pool_fetch(seq
[i
]), NULL
, stream
, 1);
84 if (i
< len
- 1 && ~seq
[i
+ 1])
89 uint32_t pool_tok_seq(uint32_t sz
, uint32_t *seq
, const char *delim
, char *str
)
98 token
= pool_tok_r(str
, delim
, &context
);
99 for (length
= 0; length
< sz
; length
++) {
103 token
= pool_tok_r(NULL
, delim
, &context
);
109 void pool_reset(void)