var-expand.c revision 3e859421cc59d28d4ba99f32830e3d0531334813
7cd08c67fde5371f662d8c95b30c341741950420Timo Sirainen/* Copyright (C) 2003-2004 Timo Sirainen */
a40649829bce4c8de6210a2cb4a4b4cf5bb40da8Timo Sirainen unsigned int width;
bb979386852c7689dc66c0fce03319382f66d501Timo Sirainen const char *(*func)(const char *, struct var_expand_context *);
bb979386852c7689dc66c0fce03319382f66d501Timo Sirainenstatic const char *
bb979386852c7689dc66c0fce03319382f66d501Timo Sirainenm_str_lcase(const char *str, struct var_expand_context *ctx __attr_unused__)
bb979386852c7689dc66c0fce03319382f66d501Timo Sirainenstatic const char *
bb979386852c7689dc66c0fce03319382f66d501Timo Sirainenm_str_ucase(const char *str, struct var_expand_context *ctx __attr_unused__)
bb979386852c7689dc66c0fce03319382f66d501Timo Sirainenstatic const char *
bb979386852c7689dc66c0fce03319382f66d501Timo Sirainenm_str_escape(const char *str, struct var_expand_context *ctx __attr_unused__)
bb979386852c7689dc66c0fce03319382f66d501Timo Sirainenstatic const char *
bb979386852c7689dc66c0fce03319382f66d501Timo Sirainenm_str_hex(const char *str, struct var_expand_context *ctx __attr_unused__)
7cd08c67fde5371f662d8c95b30c341741950420Timo Sirainen unsigned long long l;
8e0f89885f2ce60961da9ae2d96d71c7109e6032Timo Sirainenstatic const char *
8e0f89885f2ce60961da9ae2d96d71c7109e6032Timo Sirainenm_str_reverse(const char *str, struct var_expand_context *ctx __attr_unused__)
bb979386852c7689dc66c0fce03319382f66d501Timo Sirainenstatic const char *m_str_hash(const char *str, struct var_expand_context *ctx)
1036d2db2b718bdc5b10f0773dd01d62638e9ba9Timo Sirainenstatic const char *m_str_md5(const char *str, struct var_expand_context *ctx __attr_unused__)
28a57cc7b6f29cc55a4a586c80902b21daf5d55bTimo Sirainenstatic const char *m_str_ldap_dn(const char *str, struct var_expand_context *ctx __attr_unused__)
3b94ff5951db4d4eddb7a80ed4e3f61207202635Timo Sirainenstatic const struct var_expand_modifier modifiers[] = {
4cb2599c5cdf27362a66ac475ce295409c093c92Timo Sirainenvoid var_expand(string_t *dest, const char *str,
3b94ff5951db4d4eddb7a80ed4e3f61207202635Timo Sirainen const struct var_expand_modifier *m;
3b94ff5951db4d4eddb7a80ed4e3f61207202635Timo Sirainen const struct var_expand_table *t;
4cb2599c5cdf27362a66ac475ce295409c093c92Timo Sirainen const char *var;
bb979386852c7689dc66c0fce03319382f66d501Timo Sirainen (const char *, struct var_expand_context *);
7cd08c67fde5371f662d8c95b30c341741950420Timo Sirainen unsigned int i, modifier_count;
7cd08c67fde5371f662d8c95b30c341741950420Timo Sirainen /* [<offset>.]<width>[<modifiers>]<variable> */
d35364f4d7d139b4150d290e14717e10f1ede4cdTimo Sirainen /* if offset was prefixed with zero (or it was
d35364f4d7d139b4150d290e14717e10f1ede4cdTimo Sirainen plain zero), just ignore that. zero padding
d35364f4d7d139b4150d290e14717e10f1ede4cdTimo Sirainen is done with the width. */
7cd08c67fde5371f662d8c95b30c341741950420Timo Sirainen /* @UNSAFE */
3b94ff5951db4d4eddb7a80ed4e3f61207202635Timo Sirainen /* not found */
7cd08c67fde5371f662d8c95b30c341741950420Timo Sirainen for (i = 0; i < modifier_count; i++)
a40649829bce4c8de6210a2cb4a4b4cf5bb40da8Timo Sirainen /* if offset is < 0 then we want to
a40649829bce4c8de6210a2cb4a4b4cf5bb40da8Timo Sirainen start at the end */
d35364f4d7d139b4150d290e14717e10f1ede4cdTimo Sirainen /* %05d -like padding. no truncation. */
ee3cb11d230d549367a1213aefe4598345796256Timo Sirainen const struct var_expand_modifier *m;
7cd08c67fde5371f662d8c95b30c341741950420Timo Sirainen /* [<offset>.]<width>[<modifiers>]<variable> */
a40649829bce4c8de6210a2cb4a4b4cf5bb40da8Timo Sirainen while ((*str >= '0' && *str <= '9') || *str == '-')
3e859421cc59d28d4ba99f32830e3d0531334813Timo Sirainenvar_expand_table_build(char key, const char *value, char key2, ...)
3e859421cc59d28d4ba99f32830e3d0531334813Timo Sirainen ARRAY_DEFINE(variables, struct var_expand_table);
3e859421cc59d28d4ba99f32830e3d0531334813Timo Sirainen for (key = key2; key != '\0'; key = va_arg(args, int)) {
3e859421cc59d28d4ba99f32830e3d0531334813Timo Sirainen /* 0, NULL entry */