The anticipated use case is loading the document data area from a
message Xapian document into a usable data structure.
---
 util/string-map.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++
 util/string-map.h |  8 ++++++++
 2 files changed, 57 insertions(+)

diff --git a/util/string-map.c b/util/string-map.c
index ab0c42ab..b29a9ba0 100644
--- a/util/string-map.c
+++ b/util/string-map.c
@@ -268,3 +268,52 @@ _notmuch_string_map_serialize (void* ctx, 
notmuch_string_map_t *map)
 
     return ret;
 }
+
+static char *
+unescape_newlines (void *ctx, const char *in, size_t len) {
+    size_t i,j;
+    /* removing escapes only makes things shorter */
+    char *out = talloc_zero_size (ctx, len+1);
+    for (i=0, j=0; i<len; i++) {
+       if (in[i] == '\\' && i < len - 1) {
+           switch (in[i+1]) {
+           case '\\':
+               i++;
+               out[j++] = '\\';
+               break;
+           case 'n':
+               i++;
+               out[j++] = '\n';
+               break;
+           default:
+               out[j++] = '\\';
+           }
+       } else {
+           out[j++] = in[i];
+       }
+    }
+    out[j]='\0';
+    return out;
+}
+
+notmuch_string_map_t *
+_notmuch_string_map_deserialize (void *ctx, const char *str)
+{
+    const char *tok = str;
+    const char *delim = "\n";
+    size_t tok_len = 0;
+    const char *pair [2];
+    size_t step = 0;
+
+    notmuch_string_map_t *map = _notmuch_string_map_create (ctx);
+
+    while ((tok = strtok_len_c (tok + tok_len, delim, &tok_len)) != NULL) {
+       pair[step] = unescape_newlines (ctx, tok, tok_len);
+       step++;
+       if (step == 2) {
+           step = 0;
+           _notmuch_string_map_append (map, pair[0], pair[1]);
+       }
+    }
+    return map;
+}
diff --git a/util/string-map.h b/util/string-map.h
index 9baf3530..22aa487c 100644
--- a/util/string-map.h
+++ b/util/string-map.h
@@ -40,4 +40,12 @@ _notmuch_string_map_iterator_destroy 
(notmuch_string_map_iterator_t *iterator);
  */
 const char *
 _notmuch_string_map_serialize (void *ctx, notmuch_string_map_t *map);
+
+/*
+ * decode newline delimited string "key1\nval1\key2\nval2\n..." into a 
string_map.
+ *
+ * \n decodes to newline and \\ decodes to \
+ */
+notmuch_string_map_t *
+_notmuch_string_map_deserialize (void *ctx, const char *str);
 #endif
-- 
2.17.1

_______________________________________________
notmuch mailing list
[email protected]
https://notmuchmail.org/mailman/listinfo/notmuch

Reply via email to