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 notmuch@notmuchmail.org https://notmuchmail.org/mailman/listinfo/notmuch