]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: var-expand - Add table size and merge utility functions
authorAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 5 Dec 2017 21:49:27 +0000 (23:49 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 7 Dec 2017 16:41:05 +0000 (18:41 +0200)
src/lib/test-var-expand.c
src/lib/var-expand.c
src/lib/var-expand.h

index 32ab2ad83953d6eff49fee02431b722f20d47675..9c45af23fe6f6bc5b00e3f2bf48d0ca85ee309f4 100644 (file)
@@ -421,6 +421,42 @@ static void test_var_expand_if(void)
        test_end();
 }
 
+static void test_var_expand_merge_tables(void)
+{
+       const struct var_expand_table one[] = {
+               { 'a', "1", "alpha" },
+               { '\0', "2", "beta" },
+               { '\0', NULL, NULL }
+       },
+       two[] = {
+               { 't', "3", "theta" },
+               { '\0', "4", "phi" },
+               { '\0', NULL, NULL }
+       },
+       *merged = NULL;
+
+
+       test_begin("var_expand_merge_tables");
+
+       merged = t_var_expand_merge_tables(one, two);
+
+       test_assert(var_expand_table_size(merged) == 4);
+       for(unsigned int i = 0; i < var_expand_table_size(merged); i++) {
+               if (i < 2) {
+                       test_assert_idx(merged[i].key == one[i].key, i);
+                       test_assert_idx(merged[i].value == one[i].value || strcmp(merged[i].value, one[i].value) == 0, i);
+                       test_assert_idx(merged[i].long_key == one[i].long_key || strcmp(merged[i].long_key, one[i].long_key) == 0, i);
+               } else if (i < 4) {
+                       test_assert_idx(merged[i].key == two[i-2].key, i);
+                       test_assert_idx(merged[i].value == two[i-2].value || strcmp(merged[i].value, two[i-2].value) == 0, i);
+                       test_assert_idx(merged[i].long_key == two[i-2].long_key || strcmp(merged[i].long_key, two[i-2].long_key) == 0, i);
+               } else {
+                       break;
+               }
+       }
+       test_end();
+}
+
 void test_var_expand(void)
 {
        test_var_expand_ranges();
@@ -431,4 +467,5 @@ void test_var_expand(void)
        test_var_has_key();
        test_var_expand_extensions();
        test_var_expand_if();
+       test_var_expand_merge_tables();
 }
index cdcb5da4dc41d61dc611b1fa091d7d6379a15238..0e18bb6238866840bf326530586c2057d3ff3102 100644 (file)
@@ -777,3 +777,29 @@ var_expand_unregister_func_array(const struct var_expand_extension_func_table *f
                }
        }
 }
+
+struct var_expand_table *
+var_expand_merge_tables(pool_t pool, const struct var_expand_table *a,
+                       const struct var_expand_table *b)
+{
+       ARRAY(struct var_expand_table) table;
+       size_t a_size = var_expand_table_size(a);
+       size_t b_size = var_expand_table_size(b);
+       p_array_init(&table, pool, a_size + b_size + 1);
+       for(size_t i=0; i<a_size; i++) {
+               struct var_expand_table *entry =
+                       array_append_space(&table);
+               entry->key = a[i].key;
+               entry->value = p_strdup(pool, a[i].value);
+               entry->long_key = p_strdup(pool, a[i].long_key);
+       }
+       for(size_t i=0; i<b_size; i++) {
+               struct var_expand_table *entry =
+                       array_append_space(&table);
+               entry->key = b[i].key;
+               entry->value = p_strdup(pool, b[i].value);
+               entry->long_key = p_strdup(pool, b[i].long_key);
+       }
+       array_append_zero(&table);
+       return array_idx_modifiable(&table, 0);
+}
index 40798b0a58089a268fc3f61ea11fa72adc8d4ca9..c8485a43770fcac16f958557a0078ac9cde53ae2 100644 (file)
@@ -42,4 +42,19 @@ void var_get_key_range(const char *str, unsigned int *idx_r,
    If key is '\0', it's ignored. If long_key is NULL, it's ignored. */
 bool var_has_key(const char *str, char key, const char *long_key) ATTR_PURE;
 
+static inline size_t ATTR_PURE
+var_expand_table_size(const struct var_expand_table *table)
+{
+       size_t n = 0;
+       while(table != NULL && (table[n].key != '\0' ||
+                               table[n].long_key != NULL))
+                n++;
+       return n;
+}
+
+struct var_expand_table *
+var_expand_merge_tables(pool_t pool, const struct var_expand_table *a,
+                       const struct var_expand_table *b);
+#define t_var_expand_merge_tables(a, b) \
+       (const struct var_expand_table *)var_expand_merge_tables(pool_datastack_create(), (a), (b))
 #endif