dovecot-2.2: liblib: Added var_get_key_range()
dovecot at dovecot.org
dovecot at dovecot.org
Sun May 20 03:26:27 EEST 2012
details: http://hg.dovecot.org/dovecot-2.2/rev/13d4c4f91622
changeset: 14339:13d4c4f91622
user: Timo Sirainen <tss at iki.fi>
date: Wed Mar 14 13:42:08 2012 +0200
description:
liblib: Added var_get_key_range()
diffstat:
src/lib/test-var-expand.c | 31 +++++++++++++++++++++++++++++++
src/lib/var-expand.c | 40 +++++++++++++++++++++++++++++++---------
src/lib/var-expand.h | 4 ++++
3 files changed, 66 insertions(+), 9 deletions(-)
diffs (126 lines):
diff -r f94f289ce009 -r 13d4c4f91622 src/lib/test-var-expand.c
--- a/src/lib/test-var-expand.c Wed Mar 14 13:39:00 2012 +0200
+++ b/src/lib/test-var-expand.c Wed Mar 14 13:42:08 2012 +0200
@@ -11,6 +11,11 @@
const char *out;
};
+struct var_get_key_range_test {
+ const char *in;
+ unsigned int idx, size;
+};
+
static void test_var_expand_builtin(void)
{
static struct var_expand_test tests[] = {
@@ -37,7 +42,33 @@
test_end();
}
+static void test_var_get_key_range(void)
+{
+ static struct var_get_key_range_test tests[] = {
+ { "", 0, 0 },
+ { "{", 1, 0 },
+ { "k", 0, 1 },
+ { "{key}", 1, 3 },
+ { "5.5Rk", 4, 1 },
+ { "5.5R{key}", 5, 3 },
+ { "{key", 1, 3 }
+ };
+ unsigned int i, idx, size;
+
+ test_begin("var_get_key_range");
+ for (i = 0; i < N_ELEMENTS(tests); i++) {
+ var_get_key_range(tests[i].in, &idx, &size);
+ test_assert(tests[i].idx == idx);
+ test_assert(tests[i].size == size);
+
+ if (tests[i].size == 1)
+ test_assert(tests[i].in[idx] == var_get_key(tests[i].in));
+ }
+ test_end();
+}
+
void test_var_expand(void)
{
test_var_expand_builtin();
+ test_var_get_key_range();
}
diff -r f94f289ce009 -r 13d4c4f91622 src/lib/var-expand.c
--- a/src/lib/var-expand.c Wed Mar 14 13:39:00 2012 +0200
+++ b/src/lib/var-expand.c Wed Mar 14 13:42:08 2012 +0200
@@ -348,28 +348,50 @@
char var_get_key(const char *str)
{
+ unsigned int idx, size;
+
+ var_get_key_range(str, &idx, &size);
+ return str[idx];
+}
+
+void var_get_key_range(const char *str, unsigned int *idx_r,
+ unsigned int *size_r)
+{
const struct var_expand_modifier *m;
+ unsigned int i = 0;
/* [<offset>.]<width>[<modifiers>]<variable> */
- while ((*str >= '0' && *str <= '9') || *str == '-')
- str++;
+ while ((str[i] >= '0' && str[i] <= '9') || str[i] == '-')
+ i++;
- if (*str == '.') {
- str++;
- while (*str >= '0' && *str <= '9')
- str++;
+ if (str[i] == '.') {
+ i++;
+ while (str[i] >= '0' && str[i] <= '9')
+ i++;
}
do {
for (m = modifiers; m->key != '\0'; m++) {
- if (m->key == *str) {
- str++;
+ if (m->key == str[i]) {
+ i++;
break;
}
}
} while (m->key != '\0');
- return *str;
+ if (str[i] != '{') {
+ /* short key */
+ *idx_r = i;
+ *size_r = str[i] == '\0' ? 0 : 1;
+ } else {
+ /* long key */
+ *idx_r = ++i;
+ for (; str[i] != '\0'; i++) {
+ if (str[i] == '}')
+ break;
+ }
+ *size_r = i - *idx_r;
+ }
}
static bool var_has_long_key(const char **str, const char *long_key)
diff -r f94f289ce009 -r 13d4c4f91622 src/lib/var-expand.h
--- a/src/lib/var-expand.h Wed Mar 14 13:39:00 2012 +0200
+++ b/src/lib/var-expand.h Wed Mar 14 13:42:08 2012 +0200
@@ -27,6 +27,10 @@
/* 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. */
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. long_key may be NULL. */
bool var_has_key(const char *str, char key, const char *long_key) ATTR_PURE;
More information about the dovecot-cvs
mailing list