- %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%
- $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)
- $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
-------
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++;
}
conditional *cond;
if (txt->skip == NULL) {
- 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;
+ pos = token;
+ 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';
if (!multi) break;
*pos = ' ';
- pos++;
+ token = pos + 1;
}
} else {
/* We consider nested conditionals as successful while skipping