Does not support duplicates anymore.
Signed-off-by: Florent Bruneau <florent.bruneau@polytechnique.org>
#define p_dupstr(p, len) xmemdupstr((p), (len))
#define p_realloc(pp, count) xrealloc((void*)(pp), sizeof(**(pp)) * (count))
+# define p_shrink(pp, goalnb, allocnb) \
+ do { \
+ if (*(allocnb) > goalnb) { \
+ p_realloc(pp, goalnb); \
+ *(allocnb) = goalnb; \
+ } \
+ } while(0)
+
# define p_alloc_nr(x) (((x) + 16) * 3 / 2)
# define p_allocgrow(pp, goalnb, allocnb) \
do { \
* Copyright © 2008 Florent Bruneau
*/
+#include <sys/mman.h>
+
#include "str.h"
#include "trie.h"
return p_new(trie_t, 1);
}
+static inline void trie_cleanup_build_data(trie_t *trie)
+{
+ for (int i = 0 ; i < trie->keys_len ; ++i) {
+ p_delete(&trie->keys[i]);
+ }
+ p_delete(&trie->keys);
+ trie->keys_len = trie->keys_size = 0;
+}
+
void trie_delete(trie_t **trie)
{
if (*trie) {
+ trie_cleanup_build_data(*trie);
p_delete(&(*trie)->entries);
p_delete(&(*trie)->c);
p_delete(trie);
}
}
-static inline void trie_cleanup_build_data(trie_t *trie)
-{
- for (int i = 0 ; i < trie->keys_len ; ++i) {
- p_delete(&trie->keys[i]);
- }
- p_delete(&trie->keys);
-}
static inline void trie_shrink(trie_t *trie)
{
+ p_shrink(&trie->entries, trie->entries_len, &trie->entries_size);
+ p_shrink(&trie->c, trie->c_len, &trie->c_size);
}
static inline void trie_lock(trie_t *trie)
{
+ if (mlock(trie->entries, sizeof(trie_entry_t) * trie->entries_len) != 0) {
+ UNIXERR("mlock");
+ return;
+ }
+ if (mlock(trie->c, trie->c_len) != 0) {
+ UNIXERR("mlock");
+ munlock(trie->entries, sizeof(trie_entry_t) * trie->entries_len);
+ return;
+ }
+ trie->locked = true;
}
typedef char *str_t;
fputs("(nil)", stdout);
} else {
const char *c = trie->c + entry->c_offset;
+ printf("(%d) ", entry->c_len);
for (int i = 0 ; i < entry->c_len ; ++i) {
if (c[i]) {
printf("%c ", c[i]);
trie_t *trie = trie_new();
trie_insert(trie, "abcde123456789");
trie_insert(trie, "abcde123654789");
- trie_insert(trie, "abcde123654789");
trie_insert(trie, "abcdefghi");
trie_insert(trie, "coucou");
trie_insert(trie, "coucou chez vous");
ASSERT_FALSE("coucou ");
ASSERT_FALSE("abcde123");
ASSERT_FALSE("abcde");
+ ASSERT_FALSE("coucou chez vous tous");
+ ASSERT_TRUE("abcde123456789");
+ ASSERT_TRUE("abcde123654789");
ASSERT_TRUE("abcdefghi");
ASSERT_TRUE("coucou");
- ASSERT_FALSE("coucou chez vous tous");
+ ASSERT_TRUE("coucou chez vous");
+ ASSERT_TRUE("debout !");
+
trie_delete(&trie);
/* Perf test
*/
if (argc > 1) {
trie = create_trie_from_file(argv[1]);
- trie_inspect(trie);
+// trie_inspect(trie);
trie_delete(&trie);
}
return 0;