[PATCH 5/7] Add API for string-specific memory pool

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



string_pool uses the macros in the memory pool library to create a
memory pool for strings and expose an API for handling the
strings. Taken directly from David Michael Barr's svn-dump-fast-export
repository.

Signed-off-by: Ramkumar Ramachandra <artagnon@xxxxxxxxx>
---
 vcs-svn/string_pool.c |   84 +++++++++++++++++++++++++++++++++++++++++++++++++
 vcs-svn/string_pool.h |   11 ++++++
 2 files changed, 95 insertions(+), 0 deletions(-)
 create mode 100644 vcs-svn/string_pool.c
 create mode 100644 vcs-svn/string_pool.h

diff --git a/vcs-svn/string_pool.c b/vcs-svn/string_pool.c
new file mode 100644
index 0000000..4624134
--- /dev/null
+++ b/vcs-svn/string_pool.c
@@ -0,0 +1,84 @@
+#include <string.h>
+
+#include "trp.h"
+#include "obj_pool.h"
+#include "string_pool.h"
+
+typedef struct node_s node_t;
+typedef trp(node_t) tree_t;
+static tree_t tree = { ~0 };
+
+struct node_s {
+    uint32_t offset;
+    trp_node(node_t) children;
+};
+
+/* Create two memory pools: one for node_t, and another for strings */
+obj_pool_gen(node, node_t, 4096);
+obj_pool_gen(string, char, 4096);
+
+static char *node_value(node_t *node)
+{
+    return node ? string_pointer(node->offset) : NULL;
+}
+
+static int node_value_cmp(node_t *a, node_t *b)
+{
+    return strcmp(node_value(a), node_value(b));
+}
+
+static int node_indentity_cmp(node_t *a, node_t *b)
+{
+    int r = node_value_cmp(a, b);
+    return r ? r : (((uintptr_t) a) > ((uintptr_t) b))
+        - (((uintptr_t) a) < ((uintptr_t) b));
+}
+
+/* Build a Treap from the node_s structure (a trp_node w/ offset) */
+trp_gen(static, tree_, tree_t, node_t, children, node,
+        node_indentity_cmp);
+
+static char *pool_fetch(uint32_t entry)
+{
+    return node_value(node_pointer(entry));
+}
+
+uint32_t pool_intern(char *key)
+{
+    node_t *match = NULL;
+    uint32_t key_len = strlen(key) + 1;
+    node_t *node = node_pointer(node_alloc(1));
+    node->offset = string_alloc(key_len);
+    strcpy(node_value(node), key);
+    match = tree_psearch(&tree, node);
+    if (!match || node_value_cmp(node, match)) {
+        tree_insert(&tree, node);
+    } else {
+        node_free(1);
+        string_free(key_len);
+        node = match;
+    }
+    return node_offset(node);
+}
+
+uint32_t pool_tok_r(char *str, const char *delim, char **saveptr)
+{
+    char *token = strtok_r(str, delim, saveptr);
+    return token ? pool_intern(token) : ~0;
+}
+
+void pool_print_seq(uint32_t len, uint32_t *seq, char delim, FILE *stream)
+{
+    uint32_t i;
+    for (i = 0; i < len; i++) {
+        fputs(pool_fetch(seq[i]), stream);
+        if (i < len - 1)
+            fputc(delim, stream);
+    }
+}
+
+void pool_reset(void)
+{
+    node_reset();
+    string_reset();
+}
diff --git a/vcs-svn/string_pool.h b/vcs-svn/string_pool.h
new file mode 100644
index 0000000..fb9e6b8
--- /dev/null
+++ b/vcs-svn/string_pool.h
@@ -0,0 +1,11 @@
+#ifndef STRING_POOL_H_
+#define	STRING_POOL_H_
+
+#include <stdint.h>
+#include <stdio.h>
+
+uint32_t pool_tok_r(char *str, const char *delim, char **saveptr);
+void pool_print_seq(uint32_t len, uint32_t *seq, char delim, FILE *stream);
+void pool_reset(void);
+
+#endif
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]