changeset 810:8ddfc2d59a3f

Allow more characters in control and text filenames for substitutions.
author Ben Schmidt
date Mon, 16 Jan 2012 21:29:19 +1100
parents 99fb6ba7a76e
children 262752ddbbf5
files ChangeLog README.listtexts src/prepstdreply.c
diffstat 3 files changed, 18 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Jan 16 21:29:17 2012 +1100
+++ b/ChangeLog	Mon Jan 16 21:29:19 2012 +1100
@@ -1,3 +1,4 @@
+ o Allow more characters in control and text filenames for substitutions
  o Add %%, %^%, %comment%, %control C% and %text T% formatting directives
  o Allow a space in $originalmail N$ substitution
  o Improve algorithm for list text substitutions
--- a/README.listtexts	Mon Jan 16 21:29:17 2012 +1100
+++ b/README.listtexts	Mon Jan 16 21:29:19 2012 +1100
@@ -251,13 +251,13 @@
 
 - %text T%
   text from the file named T in the listdir/text directory; the name may only
-  include letters and digits; note that there is an unformatted version of
-  this directive
+  include letters, digits, underscore, dot and hyphen; note that there is an
+  unformatted version of this directive
 
 - %control C%
-  the contents of the control file named C in listir/control; the name may
-  only include letters and digits; note that there is an unformatted version
-  of this directive
+  the contents of the control file named C in listir/control; the name may only
+  include letters, digits, underscore, dot and hyphen; note that there is an
+  unformatted version of this directive
 
 - %originalmail%
 - %originalmail N%
@@ -331,8 +331,8 @@
 
 - $control C$
   the contents of the control file named C in listdir/control, with its final
-  newline stripped; the name may only include letters and digits; note that
-  there is a formatted version of this directive
+  newline stripped; the name may only include letters, digits, underscore, dot
+  and hyphen; note that there is a formatted version of this directive
 
 - $digestfirst$
   (available only in digest)
@@ -463,8 +463,8 @@
 
 - $text T$
   text from the file named T in the listdir/text directory, with its final
-  newline stripped; the name may only include letters and digits; note that
-  there is a formatted version of this directive
+  newline stripped; the name may only include letters, digits, underscore, dot
+  and hyphen; note that there is a formatted version of this directive
 
 - $$
   a single $
--- a/src/prepstdreply.c	Mon Jan 16 21:29:17 2012 +1100
+++ b/src/prepstdreply.c	Mon Jan 16 21:29:19 2012 +1100
@@ -62,13 +62,16 @@
 };
 
 
-static char *alphanum_token(char *token) {
+static char *filename_token(char *token) {
 	char *pos;
 	if (*token == '\0') return NULL;
 	for(pos = token; *pos != '\0'; pos++) {
 		if(*pos >= '0' && *pos <= '9') continue;
 		if(*pos >= 'A' && *pos <= 'Z') continue;
 		if(*pos >= 'a' && *pos <= 'z') continue;
+		if(*pos == '_') continue;
+		if(*pos == '-') continue;
+		if(*pos == '.') continue;
 		break;
 	}
 	if (*pos != '\0') return NULL;
@@ -146,10 +149,10 @@
 		value = concatstr(4, listname, listdelim, "subscribe-nomail@",
 				  fqdn);
 	} else if(strncmp(token, "control ", 8) == 0) {
-		token = alphanum_token(token + 8);
+		token = filename_token(token + 8);
 		if (token != NULL) value = ctrlcontent(listdir, token);
 	} else if(strncmp(token, "text ", 5) == 0) {
-		token = alphanum_token(token + 5);
+		token = filename_token(token + 5);
 		if (token != NULL) value = textcontent(listdir, token);
 	} else if(data) {
 		for(i = 0; i < datacount; i++) {
@@ -357,7 +360,7 @@
 		*pos_p = pos;
 		return;
 	} else if(strncmp(token, "control ", 8) == 0) {
-		token = alphanum_token(token + 8);
+		token = filename_token(token + 8);
 		if (token != NULL) {
 			filename = concatstr(3, listdir, "/control/", token);
 			begin_new_source_file(txt, line_p, pos_p, filename);
@@ -365,7 +368,7 @@
 			return;
 		}
 	} else if(strncmp(token, "text ", 5) == 0) {
-		token = alphanum_token(token + 5);
+		token = filename_token(token + 5);
 		if (token != NULL) {
 			filename = concatstr(3, listdir, "/text/", token);
 			begin_new_source_file(txt, line_p, pos_p, filename);