struct _notmuch_config_values {
const char *iterator;
size_t tok_len;
+ const char *string;
+ void *children; /* talloc_context */
};
static const char * _notmuch_config_key_to_string (notmuch_config_key_t key);
notmuch_config_values_t *
notmuch_config_get_values (notmuch_database_t *notmuch, notmuch_config_key_t key)
{
- notmuch_config_values_t *values;
+ notmuch_config_values_t *values = NULL;
+ bool ok = false;
- const char *str;
const char *key_str = _notmuch_config_key_to_string (key);
if (! key_str)
- return NULL;
-
- str = _notmuch_string_map_get (notmuch->config, key_str);
- if (! str)
- return NULL;
+ goto DONE;
values = talloc (notmuch, notmuch_config_values_t);
if (unlikely(! values))
- return NULL;
+ goto DONE;
+
+ values->children = talloc_new (values);
+
+ values->string = _notmuch_string_map_get (notmuch->config, key_str);
+ if (! values->string)
+ goto DONE;
+
+ values->iterator = strsplit_len (values->string, ';', &(values->tok_len));
+ ok = true;
- values->iterator = strsplit_len (str, ';', &(values->tok_len));
+ DONE:
+ if (!ok) {
+ if (values)
+ talloc_free(values);
+ return NULL;
+ }
return values;
}
return talloc_strndup (values, values->iterator, values->tok_len);
}
+void
+notmuch_config_values_start (notmuch_config_values_t *values) {
+ if (values == NULL)
+ return;
+ if (values->children) {
+ talloc_free (values->children);
+ }
+
+ values->children = talloc_new (values);
+
+ values->iterator = strsplit_len (values->string, ';', &(values->tok_len));
+}
+
void
notmuch_config_values_move_to_next (notmuch_config_values_t *values) {
values->iterator += values->tok_len;
void
notmuch_config_values_move_to_next (notmuch_config_values_t *values);
+
+/**
+ * reset the 'values' iterator to the first element
+ *
+ * @param[in,out] values iterator. A NULL value is ignored.
+ *
+ * @since libnotmuch 5.4 (notmuch 0.32)
+ *
+ */
+void
+notmuch_config_values_start (notmuch_config_values_t *values);
+
/**
* Destroy a config values iterator, along with any associated
* resources.
test_expect_equal_file EXPECTED OUTPUT
restore_database
+test_begin_subtest "notmuch_config_get_values (restart)"
+cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
+{
+ notmuch_config_values_t *values;
+ EXPECT0(notmuch_config_set (db, NOTMUCH_CONFIG_NEW_TAGS, "a;b;c"));
+ for (values = notmuch_config_get_values (db, NOTMUCH_CONFIG_NEW_TAGS);
+ notmuch_config_values_valid (values);
+ notmuch_config_values_move_to_next (values))
+ {
+ puts (notmuch_config_values_get (values));
+ }
+ for (notmuch_config_values_start (values);
+ notmuch_config_values_valid (values);
+ notmuch_config_values_move_to_next (values))
+ {
+ puts (notmuch_config_values_get (values));
+ }
+}
+EOF
+cat <<'EOF' >EXPECTED
+== stdout ==
+a
+b
+c
+a
+b
+c
+== stderr ==
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+restore_database
+
backup_database
test_begin_subtest "notmuch_config_get_values, trailing ;"
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%