view src/lib/var-expand.h @ 23017:c1d36f2575c7 default tip

lib-imap: Fix "Don't accept strings with NULs" cherry-pick
author Timo Sirainen <timo.sirainen@open-xchange.com>
date Thu, 29 Aug 2019 09:55:25 +0300
parents 7b6f77272538
children
line wrap: on
line source

#ifndef VAR_EXPAND_H
#define VAR_EXPAND_H

struct var_expand_table {
	char key;
	const char *value;
	const char *long_key;
};

struct var_expand_func_table {
	const char *key;
	/* %{key:data}, or data is "" with %{key}, */
	const char *(*func)(const char *data, void *context);
};

/* Expand % variables in src and append the string in dest.
   table must end with key = 0. */
void var_expand(string_t *dest, const char *str,
		const struct var_expand_table *table);
/* Like var_expand(), but support also callback functions for
   variable expansion. */
void var_expand_with_funcs(string_t *dest, const char *str,
			   const struct var_expand_table *table,
			   const struct var_expand_func_table *func_table,
			   void *func_context) ATTR_NULL(3, 4, 5);

/* Returns the actual key character for given string, ie. skip any modifiers
   that are before it. The string should be the data after the '%' character.
   For %{long_variable}, '{' is returned. */
char var_get_key(const char *str) ATTR_PURE;
/* Similar to var_get_key(), but works for long keys as well. For single char
   keys size=1, while for e.g. %{key} size=3 and idx points to 'k'. */
void var_get_key_range(const char *str, unsigned int *idx_r,
		       unsigned int *size_r);
/* Returns TRUE if key variable is used in the string.
   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