* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2023 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
+/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Code for mail filtering functions. */
cond_above, cond_begins, cond_begins, cond_below, cond_contains,
cond_contains, cond_ends, cond_ends, cond_is, cond_matches, cond_matches };
-/* Command identities: must be kept in step with the list of command words
-and the list of expanded argument counts which follow. */
+/* Command identities */
enum { add_command, defer_command, deliver_command, elif_command, else_command,
endif_command, finish_command, fail_command, freeze_command,
mail_command, noerror_command, pipe_command, save_command, seen_command,
testprint_command, unseen_command, vacation_command };
-static const char *command_list[] = {
- "add", "defer", "deliver", "elif", "else", "endif", "finish",
- "fail", "freeze", "headers", "if", "logfile", "logwrite", "mail",
- "noerror", "pipe", "save", "seen", "testprint", "unseen", "vacation"
+static const char * command_list[] = {
+ [add_command] = "add",
+ [defer_command] = "defer",
+ [deliver_command] = "deliver",
+ [elif_command] = "elif",
+ [else_command] = "else",
+ [endif_command] = "endif",
+ [finish_command] = "finish",
+ [fail_command] = "fail",
+ [freeze_command] = "freeze",
+ [headers_command] = "headers",
+ [if_command] = "if",
+ [logfile_command] = "logfile",
+ [logwrite_command] = "logwrite",
+ [mail_command] = "mail",
+ [noerror_command] = "noerror",
+ [pipe_command] = "pipe",
+ [save_command] = "save",
+ [seen_command] = "seen",
+ [testprint_command] = "testprint",
+ [unseen_command] = "unseen",
+ [vacation_command] = "vacation"
};
static int command_list_count = nelem(command_list);
If the top bit is set, it means that the default for the command is "seen". */
static uschar command_exparg_count[] = {
- 2, /* add */
- 1, /* defer */
- 128+2, /* deliver */
- 0, /* elif */
- 0, /* else */
- 0, /* endif */
- 0, /* finish */
- 1, /* fail */
- 1, /* freeze */
- 1, /* headers */
- 0, /* if */
- 1, /* logfile */
- 1, /* logwrite */
- MAILARGS_STRING_COUNT, /* mail */
- 0, /* noerror */
- 128+0, /* pipe */
- 128+1, /* save */
- 0, /* seen */
- 1, /* testprint */
- 0, /* unseen */
- MAILARGS_STRING_COUNT /* vacation */
+ [add_command] = 2,
+ [defer_command] = 1,
+ [deliver_command] = 128+2,
+ [elif_command] = 0,
+ [else_command] = 0,
+ [endif_command] = 0,
+ [finish_command] = 0,
+ [fail_command] = 1,
+ [freeze_command] = 1,
+ [headers_command] = 1,
+ [if_command] = 0,
+ [logfile_command] = 1,
+ [logwrite_command] = 1,
+ [mail_command] = MAILARGS_STRING_COUNT,
+ [noerror_command] = 0,
+ [pipe_command] = 128+0,
+ [save_command] = 128+1,
+ [seen_command] = 0,
+ [testprint_command] = 1,
+ [unseen_command] = 0,
+ [vacation_command] = MAILARGS_STRING_COUNT
};
for (;;)
{
while (isspace(*ptr))
- {
- if (*ptr == '\n') line_number++;
- ptr++;
- }
+ if (*ptr++ == '\n') line_number++;
if (comment_allowed && *ptr == '#')
- {
- while (*(++ptr) != '\n' && *ptr != 0);
- continue;
- }
- else break;
+ while (*++ptr != '\n' && *ptr) ;
+ else
+ break;
}
return ptr;
}
static const uschar *
nextword(const uschar *ptr, uschar *buffer, int size, BOOL bracket)
{
-uschar *bp = buffer;
-while (*ptr != 0 && !isspace(*ptr) &&
+uschar * bp = buffer;
+while (*ptr && !isspace(*ptr) &&
(!bracket || (*ptr != '(' && *ptr != ')')))
- {
- if (bp - buffer < size - 1) *bp++ = *ptr++; else
+ if (bp - buffer < size - 1)
+ *bp++ = *ptr++;
+ else
{
*error_pointer = string_sprintf("word is too long in line %d of "
"filter file (max = %d chars)", line_number, size);
break;
}
- }
-*bp = 0;
+
+*bp = '\0';
return nextsigchar(ptr, TRUE);
}
if (sscanf(CS s, "%i%n", &value, &count) != 1) return 0;
if (tolower(s[count]) == 'k') { value *= 1024; count++; }
if (tolower(s[count]) == 'm') { value *= 1024*1024; count++; }
-while (isspace((s[count]))) count++;
-if (s[count] != 0) return 0;
+while (isspace(s[count])) count++;
+if (s[count]) return 0;
*ok = TRUE;
return value;
}
{
// if (toplevel) *saveptr = 0;
// else
- if (!toplevel)
- *error_pointer = string_sprintf("missing \")\" at end of "
+ if (!toplevel)
+ *error_pointer = string_sprintf("missing \")\" at end of "
"condition near line %d of filter file", line_number);
break;
}
testing and verification. */
case cond_errormsg:
- yield = message_id[0] != 0 &&
- (sender_address == NULL || sender_address[0] == 0);
+ yield = message_id[0] && (!sender_address || !*sender_address);
break;
/* Only FALSE if a message is actually being processed; TRUE for address
and filter testing and verification. */
case cond_firsttime:
- yield = filter_test != FTEST_NONE || message_id[0] == 0 || f.deliver_firsttime;
+ yield = filter_test != FTEST_NONE || !message_id[0] || f.deliver_firsttime;
break;
/* Only TRUE if a message is actually being processed; FALSE for address
testing and verification. */
case cond_manualthaw:
- yield = message_id[0] != 0 && f.deliver_manual_thaw;
+ yield = message_id[0] && f.deliver_manual_thaw;
break;
/* The foranyaddress condition loops through a list of addresses */
if (subtype == TRUE)
{
- while (isspace(*s)) s++;
- if (*s)
+ if (Uskip_whitespace(&s))
{
header_add(htype_other, "%s%s", s,
s[Ustrlen(s)-1] == '\n' ? "" : "\n");
gstring * log_addr = NULL;
if (!to) to = expand_string(US"$reply_address");
- while (isspace(*to)) to++;
+ Uskip_whitespace(&to);
for (tt = to; *tt; tt++) /* Get rid of newlines */
if (*tt == '\n')
/* Move on past this address */
tt = ss + (*ss ? 1 : 0);
- while (isspace(*tt)) tt++;
+ Uskip_whitespace(&tt);
}
if (log_addr)
/* End of filter.c */
+/* vi: aw ai sw=2
+*/