[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