Fix off-by-one.
[apps/pfixtools.git] / common / trie.c
index 9ffa9b5..2569dff 100644 (file)
@@ -33,8 +33,6 @@
  * Copyright © 2008 Florent Bruneau
  */
 
-#include <sys/mman.h>
-
 #include "array.h"
 #include "str.h"
 #include "trie.h"
@@ -52,10 +50,10 @@ struct trie_entry_t {
 ARRAY(trie_entry_t)
 
 struct trie_t {
-    trie_entry_t_array_t entries;
-    char_array_t         c;
-    char_array_t         keys;
-    int_array_t          keys_offset;
+    A(trie_entry_t) entries;
+    A(char)         c;
+    A(char)         keys;
+    A(int)          keys_offset;
 
     bool locked;
 };
@@ -152,7 +150,7 @@ static inline int trie_entry_new(trie_t *trie)
 {
     const trie_entry_t e = TRIE_ENTRY_INIT;
     array_add(trie->entries, e);
-    return trie->entries.len;
+    return trie->entries.len - 1;
 }
 
 static inline int trie_add_leaf(trie_t *trie, const char *key)
@@ -304,13 +302,13 @@ void trie_lock(trie_t *trie)
     if (trie->locked) {
         return;
     }
-    if (mlock(trie->entries.data, sizeof(trie_entry_t) * trie->entries.len) != 0) {
+    if (!array_lock(trie->entries)) {
         UNIXERR("mlock");
         return;
     }
-    if (mlock(trie->c.data, trie->c.len) != 0) {
+    if (!array_lock(trie->c)) {
         UNIXERR("mlock");
-        munlock(trie->entries.data, sizeof(trie_entry_t) * trie->entries.len);
+        array_unlock(trie->entries);
         return;
     }
     trie->locked = true;
@@ -321,8 +319,8 @@ void trie_unlock(trie_t *trie)
     if (!trie->locked) {
         return;
     }
-    munlock(trie->entries.data, sizeof(trie_entry_t) * trie->entries.len);
-    munlock(trie->c.data, trie->c.len);
+    array_unlock(trie->entries);
+    array_unlock(trie->entries);
     trie->locked = false;
 }