On 2026-02-18T15:20:28+0100, Alejandro Colomar wrote:
> Hi Kevin,
> 
> On 2026-02-18T14:49:46+0800, Kevin J. McCarthy wrote:
> > From: Kevin McCarthy <[email protected]>
> [...]
> > diff --git a/browser.c b/browser.c
> > index 86653824..9ff9fc60 100644
> > --- a/browser.c
> > +++ b/browser.c
> > @@ -1348,11 +1348,11 @@ void _mutt_buffer_select_file (BUFFER *f, int 
> > flags, char ***files, int *numfile
> >            /* assume that the user wants to see everything */
> >            if (!(mutt_buffer_len (buf)))
> >              mutt_buffer_strcpy (buf, ".");
> > -          SKIPWS (s);
> > +          SKIP_ASCII_WS (s);
> 
> I've been looking at these functions and macros recently in neomutt(1),
> and I was thinking that maybe we should have macros that define the
> specific different kinds of white space.  Something like this:
> 
>       #define MUTT_CTYPE_SPACE_C      " \t\n\v\f\r"  // [:space:]
>       #define MUTT_CTYPE_RFC5322_FWS  " \t\r\n"   // 'FWS' (3.2.2.)
> 
> then, we could use it for example here to replace the SKIPWS() call as
> 
>       s += strspn(s, MUTT_CTYPE_SPACE_C);
> 
> The name of the white-space macro would make it more readable to
> understand exactly which kind of white space is used in each call.
> 
> Also, strspn() is C89 standard, and quite simple to understand, compared
> to groking all the different macros --with inconsistent names-- we have.
> 
> What do you think?
> 
> 
> Have a lovely day!
> Alex
> 
> >            if (*s == '!')
> >            {
> >              s++;
> > -            SKIPWS (s);
> > +            SKIP_ASCII_WS (s);
> >              not = 1;
> >            }
> >  
> > diff --git a/check_sec.sh b/check_sec.sh
> > index 3bd08804..fe7f8b48 100755
> > --- a/check_sec.sh
> > +++ b/check_sec.sh
> > @@ -38,6 +38,7 @@ do_check '\<sprintf.*%s' __SPRINTF_CHECKED__ "Alert: 
> > Unchecked sprintf calls."
> >  do_check '\<strncat' __STRNCAT_CHECKED__ "You probably meant safe_strcat 
> > here."
> >  do_check '\<safe_free' __SAFE_FREE_CHECKED__ "You probably meant FREE 
> > here."
> >  do_check '\<FREE[ ]?\([^&]' __FREE_CHECKED__ "You probably meant 
> > FREE(&...) here."
> > +do_check '\<isspace' __SAFE_ISSPACE_CHECKED__ "You probably meant 
> > IS_ASCII_WS here."
> >  
> >  # don't do this check on others' code.
> >  do_check_files '\<(malloc|realloc|free|strdup)[    ]*\(' __MEM_CHECKED__ 
> > "Alert: Use of traditional memory management calls." \
> > diff --git a/crypt.c b/crypt.c
> > index cc6c376d..4adf436c 100644
> > --- a/crypt.c
> > +++ b/crypt.c
> > @@ -1221,7 +1221,7 @@ const char* crypt_get_fingerprint_or_id (char *p, 
> > const char **pphint,
> >     * if an ID was found and to simplify logic in the key loop's inner
> >     * condition of the caller. */
> >  
> > -  pf = mutt_skip_whitespace (p);
> > +  pf = mutt_skip_ascii_ws (p);
> >    if (!mutt_strncasecmp (pf, "0x", 2))
> >      pf += 2;
> >  
> > @@ -1258,7 +1258,7 @@ const char* crypt_get_fingerprint_or_id (char *p, 
> > const char **pphint,
> >      s1 = s2 = pfcopy;
> >      do
> >      {
> > -      *(s1++) = *(s2 = mutt_skip_whitespace (s2));
> > +      *(s1++) = *(s2 = mutt_skip_ascii_ws (s2));
> >      } while (*(s2++));
> >  
> >      phint = pfcopy;
> > diff --git a/edit.c b/edit.c
> > index 143118e4..b8db756e 100644
> > --- a/edit.c
> > +++ b/edit.c
> > @@ -360,11 +360,11 @@ int mutt_builtin_editor (SEND_CONTEXT *sctx)
> >      {
> >        /* remove trailing whitespace from the line */
> >        p = tmp + mutt_strlen (tmp) - 1;
> > -      while (p >= tmp && ISSPACE (*p))

BTW, with the macros shown above, one could implement:

        #define streq(a,b)  (strcmp(a,b) == 0)

        #define isspace_c(c)            (!streq(strchrnul(MUTT_CTYPE_SPACE_C, 
c), ""))
        #define isspace_rfc5322_fws(c)  
(!streq(strchrnul(MUTT_CTYPE_RFC5322_FWS, c), ""))

Although, in general, using the strspn(3) family of functions directly
seems more ergonomic.


Cheers,
Alex

> > +      while (p >= tmp && IS_ASCII_WS (*p))
> >          *p-- = 0;
> >  
> >        p = tmp + 2;
> > -      SKIPWS (p);
> > +      SKIP_ASCII_WS (p);
> >  
> >        switch (tmp[1])
> >        {
> > diff --git a/from.c b/from.c
> > index 662709ba..6426cab1 100644
> > --- a/from.c
> > +++ b/from.c
> > @@ -28,9 +28,9 @@
> >  
> >  static const char *next_word (const char *s)
> >  {
> > -  while (*s && !ISSPACE (*s))
> > +  while (*s && !IS_ASCII_WS (*s))
> >      s++;
> > -  SKIPWS (s);
> > +  SKIP_ASCII_WS (s);
> >    return s;
> >  }
> >  
> > @@ -38,9 +38,9 @@ static const char *prev_word (const char * const bos, 
> > const char *cur)
> >  {
> >    if (cur <= bos)
> >      return bos;
> > -  while (cur > bos && ISSPACE (*(cur-1)))
> > +  while (cur > bos && IS_ASCII_WS (*(cur-1)))
> >      cur--;
> > -  while (cur > bos && !ISSPACE (*(cur-1)))
> > +  while (cur > bos && !IS_ASCII_WS (*(cur-1)))
> >      cur--;
> >    return cur;
> >  }
> > @@ -59,7 +59,7 @@ static int is_day_name (const char *s)
> >  {
> >    int i;
> >  
> > -  if ((strlen (s) < 3) || !*(s + 3) || !ISSPACE (*(s+3)))
> > +  if ((strlen (s) < 3) || !*(s + 3) || !IS_ASCII_WS (*(s+3)))
> >      return 0;
> >    for (i=0; i<7; i++)
> >      if (mutt_strncasecmp (s, Weekdays[i], 3) == 0)
> > @@ -100,7 +100,7 @@ static int is_from_forward_scan (const char *s,
> >      size_t len;
> >      short q = 0;
> >  
> > -    for (p = s; *p && (q || !ISSPACE (*p)); p++)
> > +    for (p = s; *p && (q || !IS_ASCII_WS (*p)); p++)
> >      {
> >        if (*p == '\\')
> >        {
> > @@ -137,7 +137,7 @@ static int is_from_forward_scan (const char *s,
> >      }
> >  
> >      s = p + 1;
> > -    SKIPWS (s);
> > +    SKIP_ASCII_WS (s);
> >      if (!*s)
> >        return 0;
> >  
> > @@ -268,7 +268,7 @@ static int is_from_reverse_scan (const char * const bos,
> >    }
> >  
> >    /* return path? */
> > -  while (cur > bos && ISSPACE (*(cur-1)))
> > +  while (cur > bos && IS_ASCII_WS (*(cur-1)))
> >      cur--;
> >    if (cur != bos && path)
> >    {
> > diff --git a/handler.c b/handler.c
> > index 58a3f077..ebba86d6 100644
> > --- a/handler.c
> > +++ b/handler.c
> > @@ -269,7 +269,7 @@ static void mutt_decode_quoted (STATE *s, LOFF_T len, 
> > int istext, iconv_t cd)
> >      /* chop trailing whitespace if we got the full line */
> >      if (last == '\n')
> >      {
> > -      while (linelen > 0 && ISSPACE (line[linelen-1]))
> > +      while (linelen > 0 && IS_ASCII_WS (line[linelen-1]))
> >          linelen--;
> >        line[linelen]=0;
> >      }
> > @@ -390,7 +390,7 @@ static void mutt_decode_uuencoded (STATE *s, LOFF_T 
> > len, int istext, iconv_t cd)
> >      if ((fgets(tmps, sizeof(tmps), s->fpin)) == NULL)
> >        goto cleanup;
> >      len -= mutt_strlen(tmps);
> > -    if ((!mutt_strncmp (tmps, "begin", 5)) && ISSPACE (tmps[5]))
> > +    if ((!mutt_strncmp (tmps, "begin", 5)) && IS_ASCII_WS (tmps[5]))
> >        break;
> >    }
> >    while (len > 0)
> > diff --git a/headers.c b/headers.c
> > index f62dee8c..dbec2f1d 100644
> > --- a/headers.c
> > +++ b/headers.c
> > @@ -325,7 +325,7 @@ int mutt_label_message(HEADER *hdr)
> >      return 0;
> >  
> >    new = buf;
> > -  SKIPWS(new);
> > +  SKIP_ASCII_WS(new);
> >    if (*new == '\0')
> >      new = NULL;
> >  
> > diff --git a/help.c b/help.c
> > index 6e6bd718..5094313c 100644
> > --- a/help.c
> > +++ b/help.c
> > @@ -256,7 +256,7 @@ static void format_line (FILE *f, int ismacro,
> >  
> >        if (ismacro >= 0)
> >        {
> > -        SKIPWS(t3);
> > +        SKIP_ASCII_WS(t3);
> >          n = get_wrapped_width (t3, n);
> >        }
> >  
> > diff --git a/hook.c b/hook.c
> > index feb9e80e..5db5b307 100644
> > --- a/hook.c
> > +++ b/hook.c
> > @@ -63,7 +63,7 @@ int mutt_parse_hook (BUFFER *buf, BUFFER *s, union 
> > pointer_long_t udata, BUFFER
> >    if (*s->dptr == '!')
> >    {
> >      s->dptr++;
> > -    SKIPWS (s->dptr);
> > +    SKIP_ASCII_WS (s->dptr);
> >      not = 1;
> >    }
> >  
> > @@ -346,7 +346,7 @@ int mutt_parse_idxfmt_hook (BUFFER *buf, BUFFER *s, 
> > union pointer_long_t udata,
> >    if (*s->dptr == '!')
> >    {
> >      s->dptr++;
> > -    SKIPWS (s->dptr);
> > +    SKIP_ASCII_WS (s->dptr);
> >      not = 1;
> >    }
> >    mutt_extract_token (pattern, s, 0);
> > diff --git a/imap/command.c b/imap/command.c
> > index b85304c7..e9b632b2 100644
> > --- a/imap/command.c
> > +++ b/imap/command.c
> > @@ -591,7 +591,7 @@ static int cmd_handle_untagged (IMAP_DATA* idata)
> >  
> >      /* server shut down our connection */
> >      s += 3;
> > -    SKIPWS (s);
> > +    SKIP_ASCII_WS (s);
> >      mutt_error ("%s", s);
> >      mutt_sleep (2);
> >      cmd_handle_fatal (idata);
> > @@ -812,7 +812,7 @@ static void cmd_parse_fetch (IMAP_DATA* idata, char* s)
> >  
> >    while (*s)
> >    {
> > -    SKIPWS (s);
> > +    SKIP_ASCII_WS (s);
> >  
> >      if (ascii_strncasecmp ("FLAGS", s, 5) == 0)
> >      {
> > @@ -821,7 +821,7 @@ static void cmd_parse_fetch (IMAP_DATA* idata, char* s)
> >          break;
> >  
> >        s += 5;
> > -      SKIPWS(s);
> > +      SKIP_ASCII_WS(s);
> >        if (*s != '(')
> >        {
> >          muttdbg(1, "bogus FLAGS response: %s", s);
> > @@ -841,7 +841,7 @@ static void cmd_parse_fetch (IMAP_DATA* idata, char* s)
> >      else if (ascii_strncasecmp ("UID", s, 3) == 0)
> >      {
> >        s += 3;
> > -      SKIPWS (s);
> > +      SKIP_ASCII_WS (s);
> >        if (mutt_atoui (s, &uid, MUTT_ATOI_ALLOW_TRAILING) < 0)
> >        {
> >          muttdbg(1, "cmd_parse_fetch: Illegal UID.  Skipping update.");
> > @@ -860,7 +860,7 @@ static void cmd_parse_fetch (IMAP_DATA* idata, char* s)
> >      else if (ascii_strncasecmp ("MODSEQ", s, 6) == 0)
> >      {
> >        s += 6;
> > -      SKIPWS(s);
> > +      SKIP_ASCII_WS(s);
> >        if (*s != '(')
> >        {
> >          muttdbg (1, "bogus MODSEQ response: %s", s);
> > @@ -970,7 +970,7 @@ static void cmd_parse_list (IMAP_DATA* idata, char* s)
> >      {
> >        *s = '\0';
> >        s++;
> > -      SKIPWS(s);
> > +      SKIP_ASCII_WS(s);
> >      }
> >    }
> >    else
> > @@ -1041,7 +1041,7 @@ static void cmd_parse_myrights (IMAP_DATA* idata, 
> > const char* s)
> >    /* zero out current rights set */
> >    memset (idata->ctx->rights, 0, sizeof (idata->ctx->rights));
> >  
> > -  while (*s && !isspace((unsigned char) *s))
> > +  while (*s && !IS_ASCII_WS((unsigned char) *s))
> >    {
> >      switch (*s)
> >      {
> > @@ -1150,7 +1150,7 @@ static void cmd_parse_status (IMAP_DATA* idata, char* 
> > s)
> >      s = mailbox + litlen;
> >      *s = '\0';
> >      s++;
> > -    SKIPWS(s);
> > +    SKIP_ASCII_WS(s);
> >    }
> >    else
> >    {
> > diff --git a/imap/imap.c b/imap/imap.c
> > index 3368112d..89694067 100644
> > --- a/imap/imap.c
> > +++ b/imap/imap.c
> > @@ -749,7 +749,7 @@ static char* imap_get_flags (LIST** hflags, char* s)
> >      return NULL;
> >    }
> >    s += 5;
> > -  SKIPWS(s);
> > +  SKIP_ASCII_WS(s);
> >    if (*s != '(')
> >    {
> >      muttdbg (1, "bogus FLAGS response: %s", s);
> > @@ -763,9 +763,9 @@ static char* imap_get_flags (LIST** hflags, char* s)
> >    while (*s && *s != ')')
> >    {
> >      s++;
> > -    SKIPWS(s);
> > +    SKIP_ASCII_WS(s);
> >      flag_word = s;
> > -    while (*s && (*s != ')') && !ISSPACE (*s))
> > +    while (*s && (*s != ')') && !IS_ASCII_WS (*s))
> >        s++;
> >      ctmp = *s;
> >      *s = '\0';
> > @@ -1398,7 +1398,7 @@ int imap_sync_message_for_copy (IMAP_DATA *idata, 
> > HEADER *hdr, BUFFER *cmd,
> >    if (mutt_bit_isset (idata->ctx->rights, MUTT_ACL_WRITE))
> >      imap_add_keywords (flags, hdr, idata->flags, sizeof (flags));
> >  
> > -  mutt_remove_trailing_ws (flags);
> > +  mutt_remove_trailing_ascii_ws (flags);
> >  
> >    /* UW-IMAP is OK with null flags, Cyrus isn't. The only solution is to
> >     * explicitly revoke all system flags (if we have permission) */
> > @@ -1411,7 +1411,7 @@ int imap_sync_message_for_copy (IMAP_DATA *idata, 
> > HEADER *hdr, BUFFER *cmd,
> >      imap_set_flag (idata, MUTT_ACL_DELETE, !HEADER_DATA(hdr)->deleted,
> >                     "\\Deleted ", flags, sizeof (flags));
> >  
> > -    mutt_remove_trailing_ws (flags);
> > +    mutt_remove_trailing_ascii_ws (flags);
> >  
> >      mutt_buffer_addstr (cmd, " -FLAGS.SILENT (");
> >    }
> > @@ -2247,7 +2247,7 @@ static int imap_compile_search (const pattern_t* pat, 
> > BUFFER* buf)
> >          /* and field */
> >          *delim = ':';
> >          delim++;
> > -        SKIPWS(delim);
> > +        SKIP_ASCII_WS(delim);
> >          imap_quote_string (term, sizeof (term), delim);
> >          mutt_buffer_addstr (buf, term);
> >          break;
> > diff --git a/imap/message.c b/imap/message.c
> > index 6260113d..dbc91034 100644
> > --- a/imap/message.c
> > +++ b/imap/message.c
> > @@ -1924,7 +1924,7 @@ static int msg_parse_fetch (IMAP_HEADER *h, char *s)
> >  
> >    while (*s)
> >    {
> > -    SKIPWS (s);
> > +    SKIP_ASCII_WS (s);
> >  
> >      if (ascii_strncasecmp ("FLAGS", s, 5) == 0)
> >      {
> > @@ -1934,7 +1934,7 @@ static int msg_parse_fetch (IMAP_HEADER *h, char *s)
> >      else if (ascii_strncasecmp ("UID", s, 3) == 0)
> >      {
> >        s += 3;
> > -      SKIPWS (s);
> > +      SKIP_ASCII_WS (s);
> >        if (mutt_atoui (s, &h->data->uid, MUTT_ATOI_ALLOW_TRAILING) < 0)
> >          return -1;
> >  
> > @@ -1943,7 +1943,7 @@ static int msg_parse_fetch (IMAP_HEADER *h, char *s)
> >      else if (ascii_strncasecmp ("INTERNALDATE", s, 12) == 0)
> >      {
> >        s += 12;
> > -      SKIPWS (s);
> > +      SKIP_ASCII_WS (s);
> >        if (*s != '\"')
> >        {
> >          muttdbg(1, "bogus INTERNALDATE entry: %s", s);
> > @@ -1966,7 +1966,7 @@ static int msg_parse_fetch (IMAP_HEADER *h, char *s)
> >      else if (ascii_strncasecmp ("RFC822.SIZE", s, 11) == 0)
> >      {
> >        s += 11;
> > -      SKIPWS (s);
> > +      SKIP_ASCII_WS (s);
> >        ptmp = tmp;
> >        dlen = sizeof(tmp) - 1;
> >        while (isdigit ((unsigned char) *s) && dlen)
> > @@ -1987,7 +1987,7 @@ static int msg_parse_fetch (IMAP_HEADER *h, char *s)
> >      else if (ascii_strncasecmp ("MODSEQ", s, 6) == 0)
> >      {
> >        s += 6;
> > -      SKIPWS(s);
> > +      SKIP_ASCII_WS(s);
> >        if (*s != '(')
> >        {
> >          muttdbg (1, "bogus MODSEQ response: %s", s);
> > @@ -2029,7 +2029,7 @@ static char* msg_parse_flags (IMAP_HEADER* h, char* s)
> >      return NULL;
> >    }
> >    s += 5;
> > -  SKIPWS(s);
> > +  SKIP_ASCII_WS(s);
> >    if (*s != '(')
> >    {
> >      muttdbg (1, "bogus FLAGS response: %s", s);
> > @@ -2079,14 +2079,14 @@ static char* msg_parse_flags (IMAP_HEADER* h, char* 
> > s)
> >        if (!hd->keywords)
> >          hd->keywords = mutt_new_list ();
> >  
> > -      while (*s && !ISSPACE (*s) && *s != ')')
> > +      while (*s && !IS_ASCII_WS (*s) && *s != ')')
> >          s++;
> >        ctmp = *s;
> >        *s = '\0';
> >        mutt_add_list (hd->keywords, flag_word);
> >        *s = ctmp;
> >      }
> > -    SKIPWS(s);
> > +    SKIP_ASCII_WS(s);
> >    }
> >  
> >    /* wrap up, or note bad flags response */
> > diff --git a/imap/util.c b/imap/util.c
> > index 8d8b9fb7..9bb850b5 100644
> > --- a/imap/util.c
> > +++ b/imap/util.c
> > @@ -656,12 +656,12 @@ char *imap_next_word (char *s)
> >      }
> >      if (*s == '\"')
> >        quoted = quoted ? 0 : 1;
> > -    if (!quoted && ISSPACE (*s))
> > +    if (!quoted && IS_ASCII_WS (*s))
> >        break;
> >      s++;
> >    }
> >  
> > -  SKIPWS (s);
> > +  SKIP_ASCII_WS (s);
> >    return s;
> >  }
> >  
> > @@ -889,7 +889,7 @@ int imap_wordcasecmp(const char *a, const char *b)
> >    tmp[SHORT_STRING-1] = 0;
> >    for (i=0;i < SHORT_STRING-2;i++,s++)
> >    {
> > -    if (!*s || ISSPACE(*s))
> > +    if (!*s || IS_ASCII_WS(*s))
> >      {
> >        tmp[i] = 0;
> >        break;
> > diff --git a/init.c b/init.c
> > index 62aa4993..4a297a6e 100644
> > --- a/init.c
> > +++ b/init.c
> > @@ -184,13 +184,13 @@ int mutt_extract_token (BUFFER *dest, BUFFER *tok, 
> > int flags)
> >      mutt_buffer_increase_size (dest, STRING);
> >    mutt_buffer_clear (dest);
> >  
> > -  SKIPWS (tok->dptr);
> > +  SKIP_ASCII_WS (tok->dptr);
> >  
> >    if ((*tok->dptr == '(') && !(flags & MUTT_TOKEN_NOLISP) &&
> >        ((flags & MUTT_TOKEN_LISP) || option (OPTMUTTLISPINLINEEVAL)))
> >    {
> >      int rc = mutt_lisp_eval_list (dest, tok);
> > -    SKIPWS (tok->dptr);
> > +    SKIP_ASCII_WS (tok->dptr);
> >      return rc;
> >    }
> >  
> > @@ -198,7 +198,7 @@ int mutt_extract_token (BUFFER *dest, BUFFER *tok, int 
> > flags)
> >    {
> >      if (!qc)
> >      {
> > -      if ((ISSPACE (ch) && !(flags & MUTT_TOKEN_SPACE)) ||
> > +      if ((IS_ASCII_WS (ch) && !(flags & MUTT_TOKEN_SPACE)) ||
> >            (ch == '#' && !(flags & MUTT_TOKEN_COMMENT)) ||
> >            (ch == '=' && (flags & MUTT_TOKEN_EQUAL)) ||
> >            (ch == ';' && !(flags & MUTT_TOKEN_SEMICOLON)) ||
> > @@ -391,7 +391,7 @@ int mutt_extract_token (BUFFER *dest, BUFFER *tok, int 
> > flags)
> >      else
> >        mutt_buffer_addch (dest, ch);
> >    }
> > -  SKIPWS (tok->dptr);
> > +  SKIP_ASCII_WS (tok->dptr);
> >    return 0;
> >  }
> >  
> > @@ -2226,7 +2226,7 @@ static int parse_setenv(BUFFER *tmp, BUFFER *s, union 
> > pointer_long_t udata, BUFF
> >    if (*s->dptr == '=')
> >    {
> >      s->dptr++;
> > -    SKIPWS (s->dptr);
> > +    SKIP_ASCII_WS (s->dptr);
> >    }
> >  
> >    if (!MoreArgs (s))
> > @@ -2293,7 +2293,7 @@ static int parse_set (BUFFER *tmp, BUFFER *s, union 
> > pointer_long_t udata, BUFFER
> >        snprintf (err->data, err->dsize, _("%s: unknown variable"), 
> > tmp->data);
> >        return (-1);
> >      }
> > -    SKIPWS (s->dptr);
> > +    SKIP_ASCII_WS (s->dptr);
> >  
> >      if (reset)
> >      {
> > @@ -3067,7 +3067,7 @@ int mutt_parse_rc_buffer (BUFFER *line, BUFFER 
> > *token, BUFFER *err)
> >    /* Read from the beginning of line->data */
> >    mutt_buffer_rewind (line);
> >  
> > -  SKIPWS (line->dptr);
> > +  SKIP_ASCII_WS (line->dptr);
> >    while (*line->dptr)
> >    {
> >      if (*line->dptr == '#')
> > @@ -3165,11 +3165,11 @@ int mutt_command_complete (char *buffer, size_t 
> > len, int pos, int numtabs)
> >    int spaces; /* keep track of the number of leading spaces on the line */
> >    myvar_t *myv;
> >  
> > -  SKIPWS (buffer);
> > +  SKIP_ASCII_WS (buffer);
> >    spaces = buffer - pt;
> >  
> >    pt = buffer + pos - spaces;
> > -  while ((pt > buffer) && !isspace ((unsigned char) *pt))
> > +  while ((pt > buffer) && !IS_ASCII_WS ((unsigned char) *pt))
> >      pt--;
> >  
> >    if (pt == buffer) /* complete cmd */
> > @@ -3312,7 +3312,7 @@ int mutt_command_complete (char *buffer, size_t len, 
> > int pos, int numtabs)
> >    else if (!mutt_strncmp (buffer, "cd", 2))
> >    {
> >      pt = buffer + 2;
> > -    SKIPWS (pt);
> > +    SKIP_ASCII_WS (pt);
> >      if (numtabs == 1)
> >      {
> >        if (mutt_complete (pt, buffer + len - pt - spaces))
> > @@ -3364,11 +3364,11 @@ int mutt_var_value_complete (char *buffer, size_t 
> > len, int pos)
> >    if (buffer[0] == 0)
> >      return 0;
> >  
> > -  SKIPWS (buffer);
> > +  SKIP_ASCII_WS (buffer);
> >    spaces = buffer - pt;
> >  
> >    pt = buffer + pos - spaces;
> > -  while ((pt > buffer) && !isspace ((unsigned char) *pt))
> > +  while ((pt > buffer) && !IS_ASCII_WS ((unsigned char) *pt))
> >      pt--;
> >    pt++; /* move past the space */
> >    if (*pt == '=') /* abort if no var before the '=' */
> > @@ -4137,7 +4137,7 @@ int mutt_label_complete (char *buffer, size_t len, 
> > int numtabs)
> >    if (!Context || !Context->label_hash)
> >      return 0;
> >  
> > -  SKIPWS (buffer);
> > +  SKIP_ASCII_WS (buffer);
> >    spaces = buffer - pt;
> >  
> >    /* first TAB. Collect all the matches */
> > diff --git a/keymap.c b/keymap.c
> > index 2c9cdcc0..0a63e4b1 100644
> > --- a/keymap.c
> > +++ b/keymap.c
> > @@ -177,7 +177,7 @@ static int parse_keycode (const char *s)
> >    char *endChar;
> >    long int result = strtol(s+1, &endChar, 8);
> >    /* allow trailing whitespace, eg.  < 1001 > */
> > -  while (ISSPACE(*endChar))
> > +  while (IS_ASCII_WS(*endChar))
> >      ++endChar;
> >    /* negative keycodes don't make sense, also detect overflow */
> >    if (*endChar != '>' || result < 0 || result == LONG_MAX)
> > diff --git a/lib.c b/lib.c
> > index dd0c9c3a..7db581d9 100644
> > --- a/lib.c
> > +++ b/lib.c
> > @@ -742,17 +742,17 @@ const char *mutt_stristr (const char *haystack, const 
> > char *needle)
> >    return NULL;
> >  }
> >  
> > -char *mutt_skip_whitespace (char *p)
> > +char *mutt_skip_ascii_ws (char *p)
> >  {
> > -  SKIPWS (p);
> > +  SKIP_ASCII_WS (p);
> >    return p;
> >  }
> >  
> > -void mutt_remove_trailing_ws (char *s)
> > +void mutt_remove_trailing_ascii_ws (char *s)
> >  {
> >    char *p;
> >  
> > -  for (p = s + mutt_strlen (s) - 1 ; p >= s && ISSPACE (*p) ; p--)
> > +  for (p = s + mutt_strlen (s) - 1 ; p >= s && IS_ASCII_WS (*p) ; p--)
> >      *p = 0;
> >  }
> >  
> > diff --git a/lib.h b/lib.h
> > index b31a2ab4..1d0c8115 100644
> > --- a/lib.h
> > +++ b/lib.h
> > @@ -74,7 +74,6 @@
> >  
> >  # define FREE(x) safe_free(x)
> >  # define NONULL(x) x?x:""
> > -# define ISSPACE(c) isspace((unsigned char)c)
> >  
> >  #ifdef HAVE_MEMCCPY
> >  # define strfcpy(A,B,C) memccpy(A,B,0,(C)-1), *((A)+(C)-1)=0
> > @@ -106,27 +105,43 @@
> >  
> >  #define FOREVER while (1)
> >  
> > -/* this macro must check for *c == 0 since isspace(0) has unreliable 
> > behavior
> > -   on some systems */
> > -# define SKIPWS(c) while (*(c) && isspace ((unsigned char) *(c))) c++;
> > +/*
> > + * ASCII Whitespace
> > + * 0x09-0x0d (\t \n \v \f \r)
> > + * 0x20      (space)
> > + */
> > +#define IS_ASCII_WS(c) ((9 <= (c) && (c) <= 13) || (c) == 32)
> >  
> > +#define SKIP_ASCII_WS(c) while (IS_ASCII_WS (*(c))) c++;
> > +
> > +/*
> > + * WSP as defined by RFC5322.
> > + * This is used primarily for parsing header fields.
> > + */
> >  #define EMAIL_WSP " \t\r\n"
> >  
> > -/* skip over WSP as defined by RFC5322.  This is used primarily for parsing
> > - * header fields. */
> > +static inline int is_email_wsp (char c)
> > +{
> > +  return c && (strchr(EMAIL_WSP, c) != NULL);
> > +}
> >  
> > -static inline char *skip_email_wsp(const char *s)
> > +static inline char *skip_email_wsp (const char *s)
> >  {
> >    if (s)
> >      return (char *)(s + strspn(s, EMAIL_WSP));
> >    return (char *)s;
> >  }
> >  
> > -static inline int is_email_wsp(char c)
> > -{
> > -  return c && (strchr(EMAIL_WSP, c) != NULL);
> > -}
> > +/*
> > + * Locale-defined whitespace.
> > + * This should only be used when dealing with user input, because
> > + * some platforms return unexpected results with 8-bit values.
> > + */
> > +#define IS_LOCALE_WS(c) isspace((unsigned char)c)
> >  
> > +/* this macro must check for *c == 0 since isspace(0) has unreliable 
> > behavior
> > +   on some systems */
> > +#define SKIP_LOCALE_WS(c) while (*(c) && IS_LOCALE_WS (*(c))) c++;
> >  
> >  /*
> >   * These functions aren't defined in lib.c, but
> > @@ -186,7 +201,7 @@ void mutt_debug_f (const char *, const int, const char 
> > *, const int err, const c
> >  
> >  char *mutt_concat_path (char *, const char *, const char *, size_t);
> >  char *mutt_read_line (char *, size_t *, FILE *, int *, int);
> > -char *mutt_skip_whitespace (char *);
> > +char *mutt_skip_ascii_ws (char *);
> >  char *mutt_strlower (char *);
> >  char *mutt_substrcpy (char *, const char *, const char *, size_t);
> >  char *mutt_substrdup (const char *, const char *);
> > @@ -236,7 +251,7 @@ size_t mutt_strlen (const char *);
> >  void *safe_calloc (size_t, size_t);
> >  void *safe_malloc (size_t);
> >  void mutt_nocurses_error (const char *, ...);
> > -void mutt_remove_trailing_ws (char *);
> > +void mutt_remove_trailing_ascii_ws (char *);
> >  void mutt_sanitize_filename (char *, int flags);
> >  void mutt_str_replace (char **p, const char *s);
> >  int mutt_mkdir (char *path, mode_t mode);
> > diff --git a/mbyte.c b/mbyte.c
> > index 762e7f25..34989356 100644
> > --- a/mbyte.c
> > +++ b/mbyte.c
> > @@ -265,9 +265,9 @@ int iswprint (wint_t wc)
> >  int iswspace (wint_t wc)
> >  {
> >    if (Charset_is_utf8 || charset_is_ja)
> > -    return (9 <= wc && wc <= 13) || wc == 32;
> > +    return IS_ASCII_WS (wc);
> >    else
> > -    return (0 <= wc && wc < 256) ? isspace (wc) : 0;
> > +    return (0 <= wc && wc < 256) ? isspace (wc) : 0;  /* 
> > __SAFE_ISSPACE_CHECKED__ */
> >  }
> >  
> >  int iswblank (wint_t wc)
> > diff --git a/mutt_lisp.c b/mutt_lisp.c
> > index 6707f772..152a0662 100644
> > --- a/mutt_lisp.c
> > +++ b/mutt_lisp.c
> > @@ -74,7 +74,7 @@ static int read_list (BUFFER *list, BUFFER *line)
> >    if (!line->dptr || !*line->dptr)
> >      return 0;
> >  
> > -  SKIPWS (line->dptr);
> > +  SKIP_ASCII_WS (line->dptr);
> >  
> >    if (*line->dptr != '(')
> >      return -1;
> > @@ -135,7 +135,7 @@ static int read_atom (BUFFER *atom, BUFFER *line)
> >    if (!line->dptr || !*line->dptr)
> >      return 0;
> >  
> > -  SKIPWS (line->dptr);
> > +  SKIP_ASCII_WS (line->dptr);
> >  
> >    while (*line->dptr)
> >    {
> > @@ -156,7 +156,7 @@ static int read_atom (BUFFER *atom, BUFFER *line)
> >      }
> >      else if (!quotechar)
> >      {
> > -      if (ISSPACE (ch) || ch == '(' || ch == ')')
> > +      if (IS_ASCII_WS (ch) || ch == '(' || ch == ')')
> >          break;
> >        if (ch == '"' || ch == '\'')
> >          quotechar = ch;
> > @@ -180,7 +180,7 @@ static int read_sexp (BUFFER *sexp, BUFFER *line)
> >    if (!line->dptr || !*line->dptr)
> >      return 0;
> >  
> > -  SKIPWS (line->dptr);
> > +  SKIP_ASCII_WS (line->dptr);
> >  
> >    if (*line->dptr == '(')
> >      rc = read_list (sexp, line);
> > @@ -472,7 +472,7 @@ int mutt_lisp_eval_list (BUFFER *result, BUFFER *line)
> >    function = mutt_buffer_new ();
> >    if (read_sexp (function, list) <= 0)
> >      goto cleanup;
> > -  SKIPWS (list->dptr);
> > +  SKIP_ASCII_WS (list->dptr);
> >  
> >    if (eval_function (result, mutt_b2s (function), list) < 0)
> >      goto cleanup;
> > diff --git a/muttlib.c b/muttlib.c
> > index b7e45d20..18f3ebf0 100644
> > --- a/muttlib.c
> > +++ b/muttlib.c
> > @@ -1400,7 +1400,7 @@ void mutt_safe_path (BUFFER *dest, ADDRESS *a)
> >  
> >    mutt_buffer_save_path (dest, a);
> >    for (p = dest->data; *p; p++)
> > -    if (*p == '/' || ISSPACE (*p) || !IsPrint ((unsigned char) *p))
> > +    if (*p == '/' || IS_ASCII_WS (*p) || !IsPrint ((unsigned char) *p))
> >        *p = '_';
> >  }
> >  
> > diff --git a/pager.c b/pager.c
> > index 950a430f..1598a59e 100644
> > --- a/pager.c
> > +++ b/pager.c
> > @@ -174,7 +174,7 @@ static int check_sig (const char *s, struct line_t 
> > *info, int n)
> >      /* check for a blank line */
> >      while (*s)
> >      {
> > -      if (!ISSPACE (*s))
> > +      if (!IS_ASCII_WS (*s))
> >          return 0;
> >        s++;
> >      }
> > diff --git a/parse.c b/parse.c
> > index 94573a4b..141947f4 100644
> > --- a/parse.c
> > +++ b/parse.c
> > @@ -335,7 +335,7 @@ void mutt_parse_content_type (char *s, BODY *ct)
> >    if ((pc = strchr(s, ';')) != NULL)
> >    {
> >      *pc++ = 0;
> > -    while (*pc && ISSPACE (*pc))
> > +    while (*pc && IS_ASCII_WS (*pc))
> >        pc++;
> >      ct->parameter = parse_parameters(pc, 0);
> >  
> > @@ -357,7 +357,7 @@ void mutt_parse_content_type (char *s, BODY *ct)
> >    if ((subtype = strchr(s, '/')))
> >    {
> >      *subtype++ = '\0';
> > -    for (pc = subtype; *pc && !ISSPACE(*pc) && *pc != ';'; pc++)
> > +    for (pc = subtype; *pc && !IS_ASCII_WS(*pc) && *pc != ';'; pc++)
> >        ;
> >      *pc = '\0';
> >      ct->subtype = safe_strdup (subtype);
> > @@ -737,7 +737,7 @@ static BODY *_parse_multipart (FILE *fp, const char 
> > *boundary, LOFF_T end_off,
> >        }
> >  
> >        /* Remove any trailing whitespace, up to the length of the boundary 
> > */
> > -      for (i = len - 1; ISSPACE (buffer[i]) && i >= blen + 2; i--)
> > +      for (i = len - 1; IS_ASCII_WS (buffer[i]) && i >= blen + 2; i--)
> >          buffer[i] = 0;
> >  
> >        /* Check for the end boundary */
> > diff --git a/pattern.c b/pattern.c
> > index a6518ac6..d6f64e8e 100644
> > --- a/pattern.c
> > +++ b/pattern.c
> > @@ -653,7 +653,7 @@ static int eat_range (pattern_t *pat, int flags, BUFFER 
> > *s, BUFFER *err)
> >    if (skip_quote && *tmp == '"')
> >      tmp++;
> >  
> > -  SKIPWS (tmp);
> > +  SKIP_ASCII_WS (tmp);
> >    s->dptr = tmp;
> >    return 0;
> >  }
> > @@ -814,7 +814,7 @@ static const char * parse_date_range (const char* pc, 
> > struct tm *min,
> >    {
> >      const char *pt;
> >      char ch = *pc++;
> > -    SKIPWS (pc);
> > +    SKIP_ASCII_WS (pc);
> >      switch (ch)
> >      {
> >        case '-':
> > @@ -878,7 +878,7 @@ static const char * parse_date_range (const char* pc, 
> > struct tm *min,
> >        default:
> >          flag |= MUTT_PDR_ERRORDONE;
> >      }
> > -    SKIPWS (pc);
> > +    SKIP_ASCII_WS (pc);
> >    }
> >    if ((flag & MUTT_PDR_ERROR) && !(flag & MUTT_PDR_ABSOLUTE))
> >    { /* getDate has its own error message, don't overwrite it here */
> > @@ -968,11 +968,11 @@ static int eval_date_minmax (pattern_t *pat, const 
> > char *s, BUFFER *err)
> >          return (-1);
> >        }
> >        haveMin = TRUE;
> > -      SKIPWS (pc);
> > +      SKIP_ASCII_WS (pc);
> >        if (*pc == '-')
> >        {
> >          const char *pt = pc + 1;
> > -        SKIPWS (pt);
> > +        SKIP_ASCII_WS (pt);
> >          untilNow = (*pt == '\0');
> >        }
> >      }
> > @@ -1172,7 +1172,7 @@ pattern_t *mutt_pattern_comp (/* const */ char *s, 
> > int flags, BUFFER *err)
> >    ps.dptr = s;
> >    ps.dsize = mutt_strlen (s);
> >  
> > -  SKIPWS (ps.dptr);
> > +  SKIP_ASCII_WS (ps.dptr);
> >    while (*ps.dptr)
> >    {
> >      switch (*ps.dptr)
> > @@ -1316,7 +1316,7 @@ pattern_t *mutt_pattern_comp (/* const */ char *s, 
> > int flags, BUFFER *err)
> >          tmp->op = entry->op;
> >  
> >          ps.dptr++; /* eat the operator and any optional whitespace */
> > -        SKIPWS (ps.dptr);
> > +        SKIP_ASCII_WS (ps.dptr);
> >  
> >          if (entry->eat_arg)
> >          {
> > @@ -1382,7 +1382,7 @@ pattern_t *mutt_pattern_comp (/* const */ char *s, 
> > int flags, BUFFER *err)
> >          mutt_pattern_free (&curlist);
> >          return NULL;
> >      }
> > -    SKIPWS (ps.dptr);
> > +    SKIP_ASCII_WS (ps.dptr);
> >    }
> >    if (!curlist)
> >    {
> > diff --git a/pgp.c b/pgp.c
> > index 355b8eca..c355b1d1 100644
> > --- a/pgp.c
> > +++ b/pgp.c
> > @@ -371,7 +371,7 @@ static void pgp_copy_clearsigned (FILE *fpin, STATE *s, 
> > char *charset)
> >  
> >      if (armor_header)
> >      {
> > -      char *p = mutt_skip_whitespace (buf);
> > +      char *p = mutt_skip_ascii_ws (buf);
> >        if (*p == '\0')
> >          armor_header = 0;
> >        continue;
> > diff --git a/pgpmicalg.c b/pgpmicalg.c
> > index 3d5c5421..4ed02486 100644
> > --- a/pgpmicalg.c
> > +++ b/pgpmicalg.c
> > @@ -95,7 +95,7 @@ static void pgp_dearmor (FILE *in, FILE *out)
> >  
> >    while ((r = fgets (line, sizeof (line), in)) != NULL)
> >    {
> > -    SKIPWS (r);
> > +    SKIP_ASCII_WS (r);
> >      if (!*r) break;
> >    }
> >    if (r == NULL)
> > diff --git a/pop_lib.c b/pop_lib.c
> > index 73136c6d..66494daa 100644
> > --- a/pop_lib.c
> > +++ b/pop_lib.c
> > @@ -92,7 +92,7 @@ void pop_error (POP_DATA *pop_data, char *msg)
> >    }
> >  
> >    strfcpy (t, c, sizeof (pop_data->err_msg) - strlen (pop_data->err_msg));
> > -  mutt_remove_trailing_ws (pop_data->err_msg);
> > +  mutt_remove_trailing_ascii_ws (pop_data->err_msg);
> >  }
> >  
> >  /* Parse CAPA output */
> > diff --git a/rfc1524.c b/rfc1524.c
> > index a9ea49a4..273614b1 100644
> > --- a/rfc1524.c
> > +++ b/rfc1524.c
> > @@ -173,20 +173,20 @@ static char *get_field (char *s)
> >        break;
> >      }
> >    }
> > -  mutt_remove_trailing_ws (s);
> > +  mutt_remove_trailing_ascii_ws (s);
> >    return ch;
> >  }
> >  
> >  static int get_field_text (char *field, char **entry,
> >                             const char *type, const char *filename, int 
> > line)
> >  {
> > -  field = mutt_skip_whitespace (field);
> > +  field = mutt_skip_ascii_ws (field);
> >    if (*field == '=')
> >    {
> >      if (entry)
> >      {
> >        field++;
> > -      field = mutt_skip_whitespace (field);
> > +      field = mutt_skip_ascii_ws (field);
> >        mutt_str_replace (entry, field);
> >      }
> >      return 1;
> > diff --git a/sendlib.c b/sendlib.c
> > index 07cb8395..f0e34d99 100644
> > --- a/sendlib.c
> > +++ b/sendlib.c
> > @@ -1028,13 +1028,13 @@ int mutt_lookup_mime_type (BODY *att, const char 
> > *path)
> >  
> >          /* remove any leading space. */
> >          ct = buf;
> > -        SKIPWS (ct);
> > +        SKIP_ASCII_WS (ct);
> >  
> >          /* position on the next field in this line */
> >          if ((p = strpbrk (ct, " \t")) == NULL)
> >            continue;
> >          *p++ = 0;
> > -        SKIPWS (p);
> > +        SKIP_ASCII_WS (p);
> >  
> >          /* cycle through the file extensions */
> >          while ((p = strtok (p, " \t\n")))
> > @@ -1053,7 +1053,7 @@ int mutt_lookup_mime_type (BODY *att, const char 
> > *path)
> >              }
> >              *p++ = 0;
> >  
> > -            for (q = p; *q && !ISSPACE (*q); q++)
> > +            for (q = p; *q && !IS_ASCII_WS (*q); q++)
> >                ;
> >  
> >              mutt_substrcpy (subtype, p, q, sizeof (subtype));
> > -- 
> > 2.53.0
> > 
> 
> -- 
> <https://www.alejandro-colomar.es>



-- 
<https://www.alejandro-colomar.es>

Attachment: signature.asc
Description: PGP signature

Reply via email to