[exim-cvs] tidying: skip_whitespace

Startseite
Nachricht löschen
Nachricht beantworten
Autor: Exim Git Commits Mailing List
Datum:  
To: exim-cvs
Betreff: [exim-cvs] tidying: skip_whitespace
Gitweb: https://git.exim.org/exim.git/commitdiff/137ae145e066dda8f9d81cf6d2c9f76c15929605
Commit:     137ae145e066dda8f9d81cf6d2c9f76c15929605
Parent:     6641ba45c04b15d2d565c6e9bc6d37e6e731c49c
Author:     Jeremy Harris <jgh146exb@???>
AuthorDate: Sat Apr 4 14:25:07 2020 +0100
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Sat Apr 4 14:27:57 2020 +0100


    tidying: skip_whitespace
---
 src/src/acl.c                   | 19 +++++++------
 src/src/exim.c                  | 32 +++++++++++++---------
 src/src/expand.c                | 32 ++++++++++------------
 src/src/filter.c                | 17 ++++++------
 src/src/functions.h             | 10 +++++++
 src/src/globals.h               |  2 +-
 src/src/header.c                |  5 ++--
 src/src/log.c                   | 10 +++----
 src/src/lookups/sqlite.c        |  2 +-
 src/src/match.c                 |  8 +++---
 src/src/moan.c                  |  2 +-
 src/src/parse.c                 |  8 +++---
 src/src/rda.c                   | 10 +++----
 src/src/readconf.c              | 59 +++++++++++++++++++----------------------
 src/src/smtp_in.c               |  2 +-
 src/src/smtp_out.c              |  4 +--
 src/src/transports/appendfile.c |  4 +--
 src/src/verify.c                |  4 +--
 18 files changed, 118 insertions(+), 112 deletions(-)


diff --git a/src/src/acl.c b/src/src/acl.c
index 74ec1ef..9ed0057 100644
--- a/src/src/acl.c
+++ b/src/src/acl.c
@@ -732,7 +732,7 @@ uschar * s;

*error = NULL;

-while ((s = (*func)()) != NULL)
+while ((s = (*func)()))
{
int v, c;
BOOL negated = FALSE;
@@ -742,8 +742,7 @@ while ((s = (*func)()) != NULL)
/* Conditions (but not verbs) are allowed to be negated by an initial
exclamation mark. */

-  while (isspace(*s)) s++;
-  if (*s == '!')
+  if (Uskip_whitespace(&s) == '!')
     {
     negated = TRUE;
     s++;
@@ -859,7 +858,7 @@ while ((s = (*func)()) != NULL)
     }
       cond->u.varname = string_copyn(s, 18);
       s = endptr;
-      while (isspace(*s)) s++;
+      Uskip_whitespace(&s);
       }
     else
 #endif
@@ -895,7 +894,7 @@ while ((s = (*func)()) != NULL)


     cond->u.varname = string_copyn(s + 4, endptr - s - 4);
     s = endptr;
-    while (isspace(*s)) s++;
+    Uskip_whitespace(&s);
     }


   /* For "set", we are now positioned for the data. For the others, only
@@ -909,7 +908,7 @@ while ((s = (*func)()) != NULL)
         conditions[c].is_modifier ? US"modifier" : US"condition");
       return NULL;
       }
-    while (isspace(*s)) s++;
+    Uskip_whitespace(&s);
     cond->arg = string_copy(s);
     }
   }
@@ -3843,16 +3842,16 @@ uschar *yield;


 for(;;)
   {
-  while (isspace(*acl_text)) acl_text++;   /* Leading spaces/empty lines */
-  if (*acl_text == 0) return NULL;         /* No more data */
-  yield = acl_text;                        /* Potential data line */
+  Uskip_whitespace(&acl_text);       /* Leading spaces/empty lines */
+  if (!*acl_text) return NULL;        /* No more data */
+  yield = acl_text;            /* Potential data line */


while (*acl_text && *acl_text != '\n') acl_text++;

/* If we hit the end before a newline, we have the whole logical line. If
it's a comment, there's no more data to be given. Otherwise, yield it. */

- if (*acl_text == 0) return (*yield == '#')? NULL : yield;
+ if (!*acl_text) return *yield == '#' ? NULL : yield;

/* After reaching a newline, end this loop if the physical line does not
start with '#'. If it does, it's a comment, and the loop continues. */
diff --git a/src/src/exim.c b/src/src/exim.c
index 10526ba..bb49ee6 100644
--- a/src/src/exim.c
+++ b/src/src/exim.c
@@ -1629,7 +1629,6 @@ uschar *malware_test_file = NULL;
uschar *real_sender_address;
uschar *originator_home = US"/";
size_t sz;
-rmark reset_point;

struct passwd *pw;
struct stat statbuf;
@@ -1948,11 +1947,16 @@ running in an unprivileged state. */

unprivileged = (real_uid != root_uid && original_euid != root_uid);

+/* For most of the args-parsing we need to use permanent pool memory */
+ {
+ int old_pool = store_pool;
+ store_pool = POOL_PERM;
+
/* Scan the program's arguments. Some can be dealt with right away; others are
simply recorded for checking and handling afterwards. Do a high-level switch
on the second character (the one after '-'), to save some effort. */

-for (i = 1; i < argc; i++)
+ for (i = 1; i < argc; i++)
   {
   BOOL badarg = FALSE;
   uschar * arg = argv[i];
@@ -2401,11 +2405,14 @@ for (i = 1; i < argc; i++)
         else
               {
               /* Well, the trust list at least is up to scratch... */
-              rmark reset_point = store_mark();
+              rmark reset_point;
               uschar *trusted_configs[32];
               int nr_configs = 0;
               int i = 0;
+          int old_pool = store_pool;
+          store_pool = POOL_MAIN;


+              reset_point = store_mark();
               while (Ufgets(big_buffer, big_buffer_size, trust_list))
                 {
                 uschar *start = big_buffer, *nl;
@@ -2443,6 +2450,7 @@ for (i = 1; i < argc; i++)
               else    /* No valid prefixes found in trust_list file. */
                 f.trusted_config = FALSE;
               store_reset(reset_point);
+          store_pool = old_pool;
               }
         }
           else        /* Could not open trust_list file. */
@@ -3210,20 +3218,16 @@ for (i = 1; i < argc; i++)


     if (*argrest)
       {
-      uschar *hn;
+      uschar * hn = Ustrchr(argrest, ':');


       if (received_protocol)
         exim_fail("received_protocol is set already\n");


-      hn = Ustrchr(argrest, ':');
       if (!hn)
         received_protocol = string_copy_taint(argrest, TRUE);
       else
         {
-    int old_pool = store_pool;
-    store_pool = POOL_PERM;
         received_protocol = string_copyn_taint(argrest, hn - argrest, TRUE);
-    store_pool = old_pool;
         sender_host_name = string_copy_taint(hn + 1, TRUE);
         }
       }
@@ -3482,12 +3486,15 @@ for (i = 1; i < argc; i++)


/* If -R or -S have been specified without -q, assume a single queue run. */

-if (  (deliver_selectstring || deliver_selectstring_sender)
-   && queue_interval < 0)
-    queue_interval = 0;
+ if (  (deliver_selectstring || deliver_selectstring_sender)
+    && queue_interval < 0)
+  queue_interval = 0;



END_ARG:
+ store_pool = old_pool;
+ }
+
/* If usage_wanted is set we call the usage function - which never returns */
if (usage_wanted) exim_usage(called_as);

@@ -5088,6 +5095,7 @@ if (host_checking)

   if (smtp_start_session())
     {
+    rmark reset_point;
     for (; (reset_point = store_mark()); store_reset(reset_point))
       {
       if (smtp_setup_msg() <= 0) break;
@@ -5339,7 +5347,7 @@ collapsed). */


while (more)
{
- reset_point = store_mark();
+ rmark reset_point = store_mark();
message_id[0] = 0;

/* Handle the SMTP case; call smtp_setup_mst() to deal with the initial SMTP
diff --git a/src/src/expand.c b/src/src/expand.c
index de53fe4..789f099 100644
--- a/src/src/expand.c
+++ b/src/src/expand.c
@@ -1174,7 +1174,7 @@ static uschar *
expand_getkeyed(uschar * key, const uschar * s)
{
int length = Ustrlen(key);
-while (isspace(*s)) s++;
+Uskip_whitespace(&s);

/* Loop to search for the key */

@@ -1186,14 +1186,13 @@ while (*s)

while (*s && *s != '=' && !isspace(*s)) s++;
dkeylength = s - dkey;
- while (isspace(*s)) s++;
- if (*s == '=') while (isspace((*(++s))));
+ if (Uskip_whitespace(&s) == '=') while (isspace((*(++s))));

   data = string_dequote(&s);
   if (length == dkeylength && strncmpic(key, dkey, length) == 0)
     return data;


- while (isspace(*s)) s++;
+ Uskip_whitespace(&s);
}

 return NULL;
@@ -2044,7 +2043,7 @@ switch (vp->type)
     s = find_header(US"reply-to:", newsize,
         exists_only ? FH_EXISTS_ONLY|FH_WANT_RAW : FH_WANT_RAW,
         headers_charset);
-    if (s) while (isspace(*s)) s++;
+    if (s) Uskip_whitespace(&s);
     if (!s || !*s)
       {
       *newsize = 0;                            /* For the *s==0 case */
@@ -2055,8 +2054,8 @@ switch (vp->type)
     if (s)
       {
       uschar *t;
-      while (isspace(*s)) s++;
-      for (t = s; *t != 0; t++) if (*t == '\n') *t = ' ';
+      Uskip_whitespace(&s);
+      for (t = s; *t; t++) if (*t == '\n') *t = ' ';
       while (t > s && isspace(t[-1])) t--;
       *t = 0;
       }
@@ -2144,7 +2143,7 @@ read_subs(uschar **sub, int n, int m, const uschar **sptr, BOOL skipping,
 {
 const uschar *s = *sptr;


-while (isspace(*s)) s++;
+Uskip_whitespace(&s);
 for (int i = 0; i < n; i++)
   {
   if (*s != '{')
@@ -2161,7 +2160,7 @@ for (int i = 0; i < n; i++)
   if (!(sub[i] = expand_string_internal(s+1, TRUE, &s, skipping, TRUE, resetok)))
     return 3;
   if (*s++ != '}') return 1;
-  while (isspace(*s)) s++;
+  Uskip_whitespace(&s);
   }
 if (check_end && *s++ != '}')
   {
@@ -2284,9 +2283,7 @@ uschar * p = s;
 unsigned depth = 0;
 BOOL quotesmode = wrap[0] == wrap[1];


-while (isspace(*p)) p++;
-
-if (*p == *wrap)
+if (Uskip_whitespace(&p) == *wrap)
{
s = ++p;
wrap++;
@@ -4026,8 +4023,7 @@ int c;
int_eximarith_t n;
uschar *s = *sptr;

-while (isspace(*s)) s++;
-if (isdigit((c = *s)))
+if (isdigit((c = Uskip_whitespace(&s))))
   {
   int count;
   (void)sscanf(CS s, (decimal? SC_EXIM_DEC "%n" : SC_EXIM_ARITH "%n"), &n, &count);
@@ -4039,7 +4035,7 @@ if (isdigit((c = *s)))
     case 'm': n *= 1024*1024; s++; break;
     case 'g': n *= 1024*1024*1024; s++; break;
     }
-  while (isspace (*s)) s++;
+  Uskip_whitespace(&s);
   }
 else if (c == '(')
   {
@@ -4061,7 +4057,7 @@ eval_op_unary(uschar **sptr, BOOL decimal, uschar **error)
 {
 uschar *s = *sptr;
 int_eximarith_t x;
-while (isspace(*s)) s++;
+Uskip_whitespace(&s);
 if (*s == '+' || *s == '-' || *s == '~')
   {
   int op = *s++;
@@ -4819,12 +4815,12 @@ while (*s != 0)
       kinds. Allow everything except space or { to appear; the actual content
       is checked by search_findtype_partial. */        /*}*/


-      while (*s != 0 && *s != '{' && !isspace(*s))    /*}*/
+      while (*s && *s != '{' && !isspace(*s))        /*}*/
         {
         if (nameptr < sizeof(name) - 1) name[nameptr++] = *s;
         s++;
         }
-      name[nameptr] = 0;
+      name[nameptr] = '\0';
       while (isspace(*s)) s++;


       /* Now check for the individual search type and any partial or default
diff --git a/src/src/filter.c b/src/src/filter.c
index 90e83e6..c508169 100644
--- a/src/src/filter.c
+++ b/src/src/filter.c
@@ -2386,12 +2386,11 @@ Previously the test was for "auto-". */


for (h = header_list; h; h = h->next)
{
- uschar *s;
if (h->type == htype_old) continue;

   if (strncmpic(h->text, US"List-", 5) == 0)
     {
-    s = h->text + 5;
+    uschar * s = h->text + 5;
     if (strncmpic(s, US"Id:", 3) == 0 ||
         strncmpic(s, US"Help:", 5) == 0 ||
         strncmpic(s, US"Subscribe:", 10) == 0 ||
@@ -2404,12 +2403,12 @@ for (h = header_list; h; h = h->next)


   else if (strncmpic(h->text, US"Auto-submitted:", 15) == 0)
     {
-    s = h->text + 15;
-    while (isspace(*s)) s++;
+    uschar * s = h->text + 15;
+    Uskip_whitespace(&s);
     if (strncmpic(s, US"no", 2) != 0) return FALSE;
     s += 2;
-    while (isspace(*s)) s++;
-    if (*s != 0) return FALSE;
+    Uskip_whitespace(&s);
+    if (*s) return FALSE;
     }
   }


@@ -2422,13 +2421,13 @@ self_to = rewrite_one(self, rewrite_to, NULL, FALSE, US"",
global_rewrite_rules);


-if (self_from == NULL) self_from = self;
-if (self_to == NULL) self_to = self;
+if (!self_from) self_from = self;
+if (self_to) self_to = self;

/* If there's a prefix or suffix set, we must include the prefixed/
suffixed version of the local part in the tests. */

-if (deliver_localpart_prefix != NULL || deliver_localpart_suffix != NULL)
+if (deliver_localpart_prefix || deliver_localpart_suffix)
   {
   psself = string_sprintf("%s%s%s@%s",
     (deliver_localpart_prefix == NULL)? US"" : deliver_localpart_prefix,
diff --git a/src/src/functions.h b/src/src/functions.h
index f387756..28d6f26 100644
--- a/src/src/functions.h
+++ b/src/src/functions.h
@@ -13,6 +13,7 @@ are in in fact in separate headers. */
 #ifndef _FUNCTIONS_H_
 #define _FUNCTIONS_H_


+#include <ctype.h>
#include <sys/time.h>


@@ -666,6 +667,15 @@ return US strncpy(CS dst, CCS src, n);
/*XXX will likely need unchecked copy also */


+/* Advance the string pointer given over any whitespace.
+Return the next char as there's enought places using it to be useful. */
+
+#define Uskip_whitespace(sp) skip_whitespace(CUSS sp)
+
+static inline uschar skip_whitespace(const uschar ** sp)
+{ while (isspace(**sp)) (*sp)++; return **sp; }
+
+
/******************************************************************************/

 #if !defined(MACRO_PREDEF) && !defined(COMPILE_UTILITY)
diff --git a/src/src/globals.h b/src/src/globals.h
index 882f289..b46e20b 100644
--- a/src/src/globals.h
+++ b/src/src/globals.h
@@ -344,7 +344,7 @@ extern gid_t  *admin_groups;           /* List of admin groups */
 extern BOOL    allow_domain_literals;  /* As it says */
 extern BOOL    allow_mx_to_ip;         /* Allow MX records to -> ip address */
 #ifdef EXPERIMENTAL_ARC
-struct arc_set *arc_received;           /* highest ARC instance evaluation struct */
+extern struct arc_set *arc_received;   /* highest ARC instance evaluation struct */
 extern int     arc_received_instance;  /* highest ARC instance number in headers */
 extern int     arc_oldest_pass;        /* lowest passing instance number in headers */
 extern const uschar *arc_state;           /* verification state */
diff --git a/src/src/header.c b/src/src/header.c
index cbfc4f8..8573519 100644
--- a/src/src/header.c
+++ b/src/src/header.c
@@ -321,9 +321,8 @@ while (bot < top)


   if (c == 0)
     {
-    uschar *s = text + mid->len;
-    while (isspace(*s)) s++;
-    if (*s == ':')
+    uschar * s = text + mid->len;
+    if (Uskip_whitespace(&s) == ':')
       return (!is_resent || mid->allow_resent)? mid->htype : htype_other;
     c = 1;
     }
diff --git a/src/src/log.c b/src/src/log.c
index d9cf23a..5fa0017 100644
--- a/src/src/log.c
+++ b/src/src/log.c
@@ -1298,14 +1298,14 @@ decode_bits(unsigned int *selector, size_t selsize, int *notall,
   uschar *string, bit_table *options, int count, uschar *which, int flags)
 {
 uschar *errmsg;
-if (string == NULL) return;
+if (!string) return;


 if (*string == '=')
   {
   char *end;    /* Not uschar */
   memset(selector, 0, sizeof(*selector)*selsize);
   *selector = strtoul(CS string+1, &end, 0);
-  if (*end == 0) return;
+  if (!*end) return;
   errmsg = string_sprintf("malformed numeric %s_selector setting: %s", which,
     string);
   goto ERROR_RETURN;
@@ -1320,8 +1320,8 @@ else for(;;)
   int len;
   bit_table *start, *end;


- while (isspace(*string)) string++;
- if (*string == 0) return;
+ Uskip_whitespace(&string);
+ if (!*string) return;

   if (*string != '+' && *string != '-')
     {
@@ -1343,7 +1343,6 @@ else for(;;)
     bit_table *middle = start + (end - start)/2;
     int c = Ustrncmp(s, middle->name, len);
     if (c == 0)
-      {
       if (middle->name[len] != 0) c = -1; else
         {
         unsigned int bit = middle->bit;
@@ -1365,7 +1364,6 @@ else for(;;)


         break;  /* Out of loop to match selector name */
         }
-      }
     if (c < 0) end = middle; else start = middle + 1;
     }  /* Loop to match selector name */


diff --git a/src/src/lookups/sqlite.c b/src/src/lookups/sqlite.c
index a7cca54..deb3b4e 100644
--- a/src/src/lookups/sqlite.c
+++ b/src/src/lookups/sqlite.c
@@ -79,7 +79,7 @@ sqlite_find(void * handle, const uschar * filename, const uschar * query,
int ret;
gstring * res = NULL;

-ret = sqlite3_exec(handle, CS query, sqlite_callback, &res, (char **)errmsg);
+ret = sqlite3_exec(handle, CS query, sqlite_callback, &res, CSS errmsg);
if (ret != SQLITE_OK)
{
debug_printf_indent("sqlite3_exec failed: %s\n", *errmsg);
diff --git a/src/src/match.c b/src/src/match.c
index 2ad28a9..a0899bf 100644
--- a/src/src/match.c
+++ b/src/src/match.c
@@ -276,14 +276,14 @@ if (!cb->use_partial) partial = -1;
/* Set the parameters for the three different kinds of lookup. */

keyquery = semicolon + 1;
-while (isspace(*keyquery)) keyquery++;
+Uskip_whitespace(&keyquery);

if (mac_islookup(search_type, lookup_absfilequery))
{
filename = keyquery;
- while (*keyquery != 0 && !isspace(*keyquery)) keyquery++;
+ while (*keyquery && !isspace(*keyquery)) keyquery++;
filename = string_copyn(filename, keyquery - filename);
- while (isspace(*keyquery)) keyquery++;
+ Uskip_whitespace(&keyquery);
}

else if (!mac_islookup(search_type, lookup_querystyle))
@@ -301,7 +301,7 @@ if (!(handle = search_open(filename, search_type, 0, NULL, NULL)))
result = search_find(handle, filename, keyquery, partial, affix, affixlen,
starflags, &expand_setup, opts);

-if (!result) return f.search_find_defer? DEFER : FAIL;
+if (!result) return f.search_find_defer ? DEFER : FAIL;
if (valueptr) *valueptr = result;

 expand_nmax = expand_setup;
diff --git a/src/src/moan.c b/src/src/moan.c
index 48d4f90..7d49c4c 100644
--- a/src/src/moan.c
+++ b/src/src/moan.c
@@ -63,7 +63,7 @@ if (!message_id)
     if (h->type == htype_id)
       {
       message_id = Ustrchr(h->text, ':') + 1;
-      while (isspace(*message_id)) message_id++;
+      Uskip_whitespace(&message_id);
       }


 for (h = header_list; h; h = h->next)
diff --git a/src/src/parse.c b/src/src/parse.c
index 5d50d68..9bc76c3 100644
--- a/src/src/parse.c
+++ b/src/src/parse.c
@@ -197,10 +197,10 @@ last_comment_position = s;
 while (*s)
   {
   int c, level;
-  while (isspace(*s)) s++;
-  if (*s != '(') break;
+
+  if (Uskip_whitespace(&s) != '(') break;
   level = 1;
-  while((c = *(++s)) != 0)
+  while((c = *(++s)))
     {
     if (c == '(') level++;
     else if (c == ')') { if (--level <= 0) { s++; break; } }
@@ -2190,7 +2190,7 @@ while (Ufgets(buffer, sizeof(buffer), stdin) != NULL)
       }


     s = ss + (terminator? 1:0);
-    while (isspace(*s)) s++;
+    Uskip_whitespace(&s);
     }
   }


diff --git a/src/src/rda.c b/src/src/rda.c
index 0dc8591..aed8abc 100644
--- a/src/src/rda.c
+++ b/src/src/rda.c
@@ -42,7 +42,7 @@ Returns:   FILTER_EXIM    if it starts with "# Exim filter"
 static BOOL
 match_tag(const uschar *s, const uschar *tag)
 {
-for (; *tag != 0; s++, tag++)
+for (; *tag; s++, tag++)
   if (*tag == ' ')
     {
     while (*s == ' ' || *s == '\t') s++;
@@ -60,10 +60,10 @@ tags for other types of filter. */
 int
 rda_is_filter(const uschar *s)
 {
-while (isspace(*s)) s++;     /* Skips initial blank lines */
-if (match_tag(s, CUS"# exim filter")) return FILTER_EXIM;
-  else if (match_tag(s, CUS"# sieve filter")) return FILTER_SIEVE;
-    else return FILTER_FORWARD;
+Uskip_whitespace(&s);            /* Skips initial blank lines */
+if (match_tag(s, CUS"# exim filter"))        return FILTER_EXIM;
+else if (match_tag(s, CUS"# sieve filter"))    return FILTER_SIEVE;
+else                        return FILTER_FORWARD;
 }



diff --git a/src/src/readconf.c b/src/src/readconf.c
index 2bf1e63..04b3e11 100644
--- a/src/src/readconf.c
+++ b/src/src/readconf.c
@@ -692,7 +692,7 @@ while (isalnum(*s) || *s == '_')
}
name[namelen] = 0;

-while (isspace(*s)) s++;
+Uskip_whitespace(&s);
if (*s++ != '=')
{
log_write(0, LOG_PANIC|LOG_CONFIG_IN, "malformed macro definition");
@@ -704,7 +704,7 @@ if (*s == '=')
redef = TRUE;
s++;
}
-while (isspace(*s)) s++;
+Uskip_whitespace(&s);

/* If an existing macro of the same name was defined on the command line, we
just skip this definition. It's an error to attempt to redefine a macro without
@@ -796,7 +796,7 @@ uschar * s;
/* Find the true start of the physical line - leading spaces are always
ignored. */

-while (isspace(*ss)) ss++;
+Uskip_whitespace(&ss);

 /* Process the physical line for macros. If this is the start of the logical
 line, skip over initial text at the start of the line if it starts with an
@@ -808,8 +808,7 @@ s = ss;
 if (len == 0 && isupper(*s))
   {
   while (isalnum(*s) || *s == '_') s++;
-  while (isspace(*s)) s++;
-  if (*s != '=') s = ss;          /* Not a macro definition */
+  if (Uskip_whitespace(&s) != '=') s = ss;          /* Not a macro definition */
   }


/* Skip leading chars which cannot start a macro name, to avoid multiple
@@ -872,7 +871,7 @@ if (*s) for (macro_item * m = *s == '_' ? macros : macros_user; m; m = m->next)
/* An empty macro replacement at the start of a line could mean that ss no
longer points to the first non-blank character. */

-while (isspace(*ss)) ss++;
+Uskip_whitespace(&ss);
return ss;
}

@@ -1045,7 +1044,7 @@ for (;;)
     struct stat statbuf;


     ss += 9 + include_if_exists;
-    while (isspace(*ss)) ss++;
+    Uskip_whitespace(&ss);
     t = ss + Ustrlen(ss);
     while (t > ss && isspace(t[-1])) t--;
     if (*ss == '\"' && t[-1] == '\"')
@@ -1136,7 +1135,7 @@ if (config_lines)
 if (strncmpic(s, US"begin ", 6) == 0)
   {
   s += 6;
-  while (isspace(*s)) s++;
+  Uskip_whitespace(&s);
   if (big_buffer + len - s > sizeof(next_section) - 2)
     s[sizeof(next_section) - 2] = 0;
   Ustrcpy(next_section, s);
@@ -1170,17 +1169,16 @@ uschar *
 readconf_readname(uschar *name, int len, uschar *s)
 {
 int p = 0;
-while (isspace(*s)) s++;
-if (isalpha(*s))
-  {
+
+if (isalpha(Uskip_whitespace(&s)))
   while (isalnum(*s) || *s == '_')
     {
     if (p < len-1) name[p++] = *s;
     s++;
     }
-  }
+
 name[p] = 0;
-while (isspace(*s)) s++;
+Uskip_whitespace(&s);
 return s;
 }


@@ -1416,15 +1414,15 @@ rewrite_rule *next = store_get(sizeof(rewrite_rule), FALSE);
next->next = NULL;
next->key = string_dequote(&p);

-while (isspace(*p)) p++;
-if (*p == 0)
+Uskip_whitespace(&p);
+if (!*p)
   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
     "missing rewrite replacement string");


next->flags = 0;
next->replacement = string_dequote(&p);

-while (*p != 0) switch (*p++)
+while (*p) switch (*p++)
{
case ' ': case '\t': break;

@@ -3001,13 +2999,13 @@ if (*numberp >= max)
  log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "too many named %ss (max is %d)\n",
    tname, max);


-while (isspace(*s)) s++;
+Uskip_whitespace(&s);
ss = s;
while (isalnum(*s) || *s == '_') s++;
t = store_get(sizeof(tree_node) + s-ss, is_tainted(ss));
Ustrncpy(t->name, ss, s-ss);
t->name[s-ss] = 0;
-while (isspace(*s)) s++;
+Uskip_whitespace(&s);

if (!tree_insertnode(anchorp, t))
log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
@@ -3020,7 +3018,7 @@ nb->hide = hide;

if (*s++ != '=') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
"missing '=' after \"%s\"", t->name);
-while (isspace(*s)) s++;
+Uskip_whitespace(&s);
nb->string = read_string(s, t->name);
nb->cache_data = NULL;

@@ -3763,7 +3761,7 @@ while ((buffer = get_config_line()))

     /* Check nothing more on this line, then do the next loop iteration. */


-    while (isspace(*s)) s++;
+    Uskip_whitespace(&s);
     if (*s) extra_chars_error(s, US"driver name ", name, US"");
     continue;
     }
@@ -4016,7 +4014,7 @@ const uschar *pp;


if (*p++ != ',') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "comma expected");

-while (isspace(*p)) p++;
+Uskip_whitespace(&p);
pp = p;
while (isalnum(*p) || (type == 1 && *p == '.')) p++;

@@ -4057,7 +4055,7 @@ while ((p = get_config_line()))
rchain = &(next->rules);

next->pattern = string_dequote(&p);
- while (isspace(*p)) p++;
+ Uskip_whitespace(&p);
pp = p;
while (mac_isgraph(*p)) p++;
if (p - pp <= 0) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
@@ -4074,22 +4072,22 @@ while ((p = get_config_line()))
fudge. Anything that is not a retry rule starting "F," or "G," is treated as
an address list. */

-  while (isspace(*p)) p++;
+  Uskip_whitespace(&p);
   if (Ustrncmp(p, "senders", 7) == 0)
     {
     p += 7;
-    while (isspace(*p)) p++;
+    Uskip_whitespace(&p);
     if (*p++ != '=') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
       "\"=\" expected after \"senders\" in retry rule");
-    while (isspace(*p)) p++;
+    Uskip_whitespace(&p);
     next->senders = string_dequote(&p);
     }


/* Now the retry rules. Keep the maximum timeout encountered. */

- while (isspace(*p)) p++;
+ Uskip_whitespace(&p);

-  while (*p != 0)
+  while (*p)
     {
     retry_rule *rule = store_get(sizeof(retry_rule), FALSE);
     *rchain = rule;
@@ -4122,13 +4120,12 @@ while ((p = get_config_line()))
       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
         "bad parameters for retry rule");


-    while (isspace(*p)) p++;
-    if (*p == ';')
+    if (Uskip_whitespace(&p) == ';')
       {
       p++;
-      while (isspace(*p)) p++;
+      Uskip_whitespace(&p);
       }
-    else if (*p != 0)
+    else if (*p)
       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "semicolon expected");
     }
   }
diff --git a/src/src/smtp_in.c b/src/src/smtp_in.c
index 9055020..2c54a4c 100644
--- a/src/src/smtp_in.c
+++ b/src/src/smtp_in.c
@@ -3194,7 +3194,7 @@ for (;;)
     {
     smtp_printf("%.3s-%.*s%.*s\r\n", TRUE, code, esclen, esc, (int)(nl - msg), msg);
     msg = nl + 1;
-    while (isspace(*msg)) msg++;
+    Uskip_whitespace(&msg);
     }
   }
 }
diff --git a/src/src/smtp_out.c b/src/src/smtp_out.c
index 12ed5bc..7ea5a7c 100644
--- a/src/src/smtp_out.c
+++ b/src/src/smtp_out.c
@@ -63,8 +63,8 @@ if (is_tainted(expint))
   return FALSE;
   }


-while (isspace(*expint)) expint++;
-if (*expint == 0) return TRUE;
+Uskip_whitespace(&expint);
+if (!*expint) return TRUE;

 while ((iface = string_nextinlist(&expint, &sep, big_buffer,
           big_buffer_size)))
diff --git a/src/src/transports/appendfile.c b/src/src/transports/appendfile.c
index 426a8c1..f96d001 100644
--- a/src/src/transports/appendfile.c
+++ b/src/src/transports/appendfile.c
@@ -289,9 +289,9 @@ for (int i = 0; i < 5; i++)
        rest += sizeof("/no_check") - 1;
       }


-    while (isspace(*rest)) rest++;
+    Uskip_whitespace(&rest);


-    if (*rest != 0)
+    if (*rest)
       {
       *errmsg = string_sprintf("Malformed value \"%s\" (expansion of \"%s\") "
         "in %s transport", s, q, tblock->name);
diff --git a/src/src/verify.c b/src/src/verify.c
index dc2e576..4b584c0 100644
--- a/src/src/verify.c
+++ b/src/src/verify.c
@@ -2417,7 +2417,7 @@ for (int i = 0; i < recipients_count; i++)


     colon = Ustrchr(h->text, ':');
     s = colon + 1;
-    while (isspace(*s)) s++;
+    Uskip_whitespace(&s);


     /* Loop for multiple addresses in the header, enabling group syntax. Note
     that we have to reset this after the header has been scanned. */
@@ -2455,7 +2455,7 @@ for (int i = 0; i < recipients_count; i++)
       /* Advance to the next address */


       s = ss + (terminator ? 1:0);
-      while (isspace(*s)) s++;
+      Uskip_whitespace(&s);
       }   /* Next address */


     f.parse_allow_group = FALSE;