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