changeset 875:c5d38273f64c

Fix and improve how tokens are recognised for conditionals etc..
author Ben Schmidt
date Fri, 20 Apr 2012 10:41:58 +1000
parents 80f082f2319a
children 29c3094e3f19
files README.listtexts src/prepstdreply.c
diffstat 2 files changed, 23 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/README.listtexts	Fri Apr 20 10:35:27 2012 +1000
+++ b/README.listtexts	Fri Apr 20 10:41:58 2012 +1000
@@ -341,13 +341,13 @@
 
 - %text T%
   text from the file named T in the listdir/text directory; the name may only
-  include letters, digits, underscore, dot and hyphen; note that there is an
-  unformatted version of this directive
+  include letters, digits, underscore, dot and hyphen, and may not start with a
+  dot; 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, digits, underscore, dot and hyphen; note that there is an
-  unformatted version of this directive
+  include letters, digits, underscore, dot and hyphen, and may not start with a
+  dot; note that there is an unformatted version of this directive
 
 - %originalmail%
 - %originalmail N%
@@ -418,7 +418,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, digits, underscore, dot
-  and hyphen; note that there is a formatted version of this directive
+  and hyphen, and may not start with a dot; note that there is a formatted
+  version of this directive
 
 - $digestfirst$
   (available only in digest)
@@ -562,7 +563,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, digits, underscore, dot
-  and hyphen; note that there is a formatted version of this directive
+  and hyphen, and may not start with a dot; note that there is a formatted
+  version of this directive
 
 Escapes
 -------
--- a/src/prepstdreply.c	Fri Apr 20 10:35:27 2012 +1000
+++ b/src/prepstdreply.c	Fri Apr 20 10:41:58 2012 +1000
@@ -298,14 +298,14 @@
 
 static char *filename_token(char *token)
 {
-	char *pos;
-	if (*token == '\0') return NULL;
-	pos = token;
+	char *pos = token;
+	if (*pos == '\0') return NULL;
 	while (
 		(*pos >= '0' && *pos <= '9') ||
 		(*pos >= 'A' && *pos <= 'Z') ||
 		(*pos >= 'a' && *pos <= 'z') ||
-		(*pos == '_') || (*pos == '-') || (*pos == '.')
+		(*pos == '_') || (*pos == '-') ||
+		(*pos == '.' && pos != token)
 	) {
 		pos++;
 	}
@@ -736,18 +736,17 @@
 	conditional *cond;
 
 	if (txt->skip == NULL) {
+		for (;;) {
 		pos = token;
-		for (;;) {
-			if (*token == '\0') break;
-			for (; *pos != '\0' && (!multi || *pos != ' ');
-					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') break;
+			while (
+				(*pos >= '0' && *pos <= '9') ||
+				(*pos >= 'A' && *pos <= 'Z') ||
+				(*pos >= 'a' && *pos <= 'z') ||
+				(*pos == '_') || (*pos == '-') ||
+				(*pos == '.' && pos != token)
+			) {
+				pos++;
 			}
 			if (*pos == ' ') {
 				*pos = '\0';
@@ -780,7 +779,7 @@
 
 			if (!multi) break;
 			*pos = ' ';
-			pos++;
+			token = pos + 1;
 		}
 	} else {
 		/* We consider nested conditionals as successful while skipping