[dovecot-cvs] dovecot/src/lib strfuncs.c, 1.38, 1.39 strfuncs.h, 1.18, 1.19 var-expand.c, 1.1, 1.2 var-expand.h, 1.1, 1.2

cras at procontrol.fi cras at procontrol.fi
Tue May 25 01:33:53 EEST 2004


Update of /home/cvs/dovecot/src/lib
In directory talvi:/tmp/cvs-serv15693/src/lib

Modified Files:
	strfuncs.c strfuncs.h var-expand.c var-expand.h 
Log Message:
Fixed var_expand() to take a table of variables rather than a few predefined
ones. Added support for modifiers.



Index: strfuncs.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/strfuncs.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- a/strfuncs.c	23 Oct 2003 08:30:04 -0000	1.38
+++ b/strfuncs.c	24 May 2004 22:33:50 -0000	1.39
@@ -433,6 +433,16 @@
         return str;
 }
 
+const char *t_str_lcase(const char *str)
+{
+	return str_lcase(t_strdup_noconst(str));
+}
+
+const char *t_str_ucase(const char *str)
+{
+	return str_ucase(t_strdup_noconst(str));
+}
+
 int null_strcmp(const char *s1, const char *s2)
 {
 	if (s1 == NULL)

Index: strfuncs.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib/strfuncs.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- a/strfuncs.h	20 Oct 2003 04:15:17 -0000	1.18
+++ b/strfuncs.h	24 May 2004 22:33:50 -0000	1.19
@@ -50,6 +50,8 @@
 
 char *str_ucase(char *str);
 char *str_lcase(char *str);
+const char *t_str_lcase(const char *str);
+const char *t_str_ucase(const char *str);
 
 int null_strcmp(const char *s1, const char *s2);
 int memcasecmp(const void *p1, const void *p2, size_t size);

Index: var-expand.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/var-expand.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- a/var-expand.c	27 Jan 2003 01:27:51 -0000	1.1
+++ b/var-expand.c	24 May 2004 22:33:50 -0000	1.2
@@ -2,53 +2,70 @@
 
 #include "lib.h"
 #include "str.h"
+#include "strescape.h"
 #include "var-expand.h"
 
+struct var_expand_modifier {
+	char key;
+	const char *(*func)(const char *);
+};
+
+static const struct var_expand_modifier modifiers[] = {
+	{ 'L', t_str_lcase },
+	{ 'U', t_str_ucase },
+	{ 'E', str_escape },
+	{ '\0', NULL }
+};
+
 void var_expand(string_t *dest, const char *str,
-		const char *user, const char *home)
+		const struct var_expand_table *table)
 {
+        const struct var_expand_modifier *m;
+        const struct var_expand_table *t;
 	const char *var;
 	unsigned int width;
+	const char *(*modifier)(const char *);
 
 	for (; *str != '\0'; str++) {
 		if (*str != '%')
 			str_append_c(dest, *str);
 		else {
+			str++;
 			width = 0;
-			while (str[1] >= '0' && str[1] <= '9') {
-				width = width*10 + (str[1] - '0');
+			while (*str >= '0' && *str <= '9') {
+				width = width*10 + (*str - '0');
 				str++;
 			}
 
-			switch (str[1]) {
-			case '%':
-				var = "%";
-				break;
-			case 'u':
-				var = user;
-				break;
-			case 'h':
-				var = home;
-				break;
-			case 'n':
-				var = t_strcut(user, '@');
-				break;
-			case 'd':
-				var = strchr(user, '@');
-				if (var != NULL) var++;
-				break;
-			default:
-				str_append_c(dest, '%');
-				if (str[1] != '\0')
-					str_append_c(dest, str[1]);
-				var = NULL;
+			modifier = NULL;
+			for (m = modifiers; m->key != '\0'; m++) {
+				if (m->key == *str) {
+					modifier = m->func;
+					str++;
+					break;
+				}
+			}
+
+			if (*str == '\0')
 				break;
+
+			var = NULL;
+			for (t = table; t->key != '\0'; t++) {
+				if (t->key == *str) {
+					var = t->value != NULL ? t->value : "";
+					break;
+				}
 			}
 
-			if (str[1] != '\0')
-				str++;
+			if (var == NULL) {
+				/* not found */
+				if (*str == '%')
+					var = "%";
+			}
 
 			if (var != NULL) {
+				if (modifier != NULL)
+					var = modifier(var);
 				if (width == 0)
 					str_append(dest, var);
 				else

Index: var-expand.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib/var-expand.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- a/var-expand.h	27 Jan 2003 01:27:51 -0000	1.1
+++ b/var-expand.h	24 May 2004 22:33:50 -0000	1.2
@@ -1,13 +1,14 @@
 #ifndef __VAR_EXPAND_H
 #define __VAR_EXPAND_H
 
-/* Expand % variables in str:
+struct var_expand_table {
+	char key;
+	const char *value;
+};
 
-    %u user or user at domain
-    %h home
-    %n user
-    %d domain */
+/* 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 char *user, const char *home);
+		const struct var_expand_table *table);
 
 #endif



More information about the dovecot-cvs mailing list