Re: [PATCH v3 1/2] Add CTYPE defines for various sets of characters.

Alejandro Colomar via Mutt-dev <[email protected]>
Newsgroups gmane.mail.mutt.devel
Message-ID <anR5DKCmVm7rBcUV@devuan>
Hi Kevin,

> Date: 2026-08-06 11:19:50+0800
> From: "Kevin J. McCarthy" <[email protected]>
>
> Thanks to Alejandro Colomar for the suggestion and the code for the
> define's that were added to lib.h.  This helps the readability a lot.
> ---

Reviewed-by: Alejandro Colomar <[email protected]>


Cheers,
Alex

>  crypt.c         |  2 +-
>  imap/command.c  |  2 +-
>  lib.c           |  2 +-
>  lib.h           | 14 ++++++++++++++
>  mutt_sasl_gnu.c |  2 +-
>  muttlib.c       |  2 +-
>  rfc2047.c       |  2 +-
>  url.c           |  2 +-
>  8 files changed, 21 insertions(+), 7 deletions(-)
> 
> diff --git a/crypt.c b/crypt.c
> index e4c8051d..80a6d6d1 100644
> --- a/crypt.c
> +++ b/crypt.c
> @@ -1295,7 +1295,7 @@ short crypt_is_numerical_keyid(const char *s)
>    if (strlen(s) % 8)
>      return 0;
>    while (*s)
> -    if (strchr("0123456789ABCDEFabcdef", *s++) == NULL)
> +    if (strchr(CTYPE_XDIGIT_C, *s++) == NULL)
>        return 0;
>  
>    return 1;
> diff --git a/imap/command.c b/imap/command.c
> index 63dedf6c..77bb7b8f 100644
> --- a/imap/command.c
> +++ b/imap/command.c
> @@ -701,7 +701,7 @@ static void cmd_parse_vanished(IMAP_DATA *idata, char *s)
>    end_of_seqset = s;
>    while (*end_of_seqset)
>    {
> -    if (!strchr("0123456789:,", *end_of_seqset))
> +    if (!strchr(CTYPE_UIDS_RFC7162_C, *end_of_seqset))
>        *end_of_seqset = '\0';
>      else
>        end_of_seqset++;
> diff --git a/lib.c b/lib.c
> index 9776fcdb..fdecda25 100644
> --- a/lib.c
> +++ b/lib.c
> @@ -573,7 +573,7 @@ success:
>  }
>  
>  
> -static const char safe_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+@{}._-:%";
> +static const char safe_chars[] = CTYPE_PFCHAR_C "+@{}:%";
>  
>  void mutt_sanitize_filename(char *f, int flags)
>  {
> diff --git a/lib.h b/lib.h
> index 25875656..08f1ac27 100644
> --- a/lib.h
> +++ b/lib.h
> @@ -147,6 +147,20 @@ static inline char *skip_email_wsp(const char *s)
>     on some systems */
>  #define SKIP_LOCALE_WS(c) while (*(c) && IS_LOCALE_WS(*(c))) c++;
>  
> +/*
> + * Various useful sets of characters
> + */
> +#define CTYPE_LOWER_C         "abcdefghijklmnopqrstuvwxyz"
> +#define CTYPE_UPPER_C         "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
> +#define CTYPE_DIGIT_C         "0123456789"
> +#define CTYPE_ALPHA_C         CTYPE_LOWER_C CTYPE_UPPER_C
> +#define CTYPE_ALNUM_C         CTYPE_ALPHA_C CTYPE_DIGIT_C
> +#define CTYPE_PFCHAR_C        CTYPE_ALNUM_C "._-"      // portable filename character set
> +#define CTYPE_UXDIGIT_C       CTYPE_DIGIT_C "ABCDEF"   // uppercase hex
> +#define CTYPE_XDIGIT_C        CTYPE_UXDIGIT_C "abcdef" // hex
> +
> +#define CTYPE_UIDS_RFC7162_C  CTYPE_DIGIT_C ":,"  // known-uids
> +
>  /*
>   * These functions aren't defined in lib.c, but
>   * they are used there.
> diff --git a/mutt_sasl_gnu.c b/mutt_sasl_gnu.c
> index 9a7a4b87..2bd5afbf 100644
> --- a/mutt_sasl_gnu.c
> +++ b/mutt_sasl_gnu.c
> @@ -66,7 +66,7 @@ void mutt_gsasl_done(void)
>  }
>  
>  static const char *VALID_MECHANISM_CHARACTERS =
> -  "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
> +  CTYPE_UPPER_C CTYPE_DIGIT_C "-_";
>  
>  /* This logic is derived from the libgsasl suggest code */
>  static int mechlist_contains(const char *uc_mech, const char *uc_mechlist)
> diff --git a/muttlib.c b/muttlib.c
> index d24a37f0..ee29cc17 100644
> --- a/muttlib.c
> +++ b/muttlib.c
> @@ -1178,7 +1178,7 @@ void _mutt_buffer_quote_filename(BUFFER *d, const char *f, int add_outer)
>      mutt_buffer_addch(d, '\'');
>  }
>  
> -static const char safe_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+@{}._-:%";
> +static const char safe_chars[] = CTYPE_PFCHAR_C "+@{}:%";
>  
>  void mutt_buffer_sanitize_filename(BUFFER *d, const char *f, int flags)
>  {
> diff --git a/rfc2047.c b/rfc2047.c
> index 2bdd8553..f043c9ab 100644
> --- a/rfc2047.c
> +++ b/rfc2047.c
> @@ -257,7 +257,7 @@ static size_t b_encoder(char *s, ICONV_CONST char *d, size_t dlen,
>  static size_t q_encoder(char *s, ICONV_CONST char *d, size_t dlen,
>                          const char *tocode)
>  {
> -  static const char hex[] = "0123456789ABCDEF";
> +  static const char hex[] = CTYPE_UXDIGIT_C;
>    char *s0 = s;
>  
>    memcpy(s, "=?", 2), s += 2;
> diff --git a/url.c b/url.c
> index 02dbf34c..37d091cf 100644
> --- a/url.c
> +++ b/url.c
> @@ -193,7 +193,7 @@ int url_parse_ciss(ciss_url_t *ciss, char *src)
>  
>  static void url_pct_encode(char *dst, size_t l, const char *src)
>  {
> -  static const char *alph = "0123456789ABCDEF";
> +  static const char *alph = CTYPE_UXDIGIT_C;
>  
>    *dst = 0;
>    l--;
> -- 
> 2.55.0
> 

-- 
<https://www.alejandro-colomar.es>
signature.asc (application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE-----

iQIzBAABCgAdFiEES7Jt9u9GbmlWADAi64mZXMKQwqkFAmp0eSkACgkQ64mZXMKQ
wqnnCQ/8CElY19EDO9NUizGlkRIkwiVHGC6ZTykZkPTuzAatrEtgcRnIepZagKqN
5mleA9VTkag3r6GOEFcKoOlVPycYGOVnj/ZLCux0vBPJBq0sdrR9jQJhvRNP35Yv
k/TqkUzJqdfEaisVxzG4B4VIiEb1GjoAv72sd3+4zUwrwgTLN+jUcbH9PDTmmZZ8
ADFiBRZPRjFfStcYgVpNsUhAUvFG6a78Gzoat/cRLJodWfmJC9s2MpxFC2x4aSjl
SH+Nnd18lEDD5L/Uz9HtSzuytFh7SOpkbpM7HwYEkRYe/281d6o2pkMUD9O50vLd
fnGUPKWYF9neWwzs6mK14mU3XbDbvFLqgDnds2CPQlIyCW1+CPPRisWP7i+/lOGT
zMfsQ1ZRUqjT7PUHvEWGRokQp5mEzBoff86G+ccOkYs5zf/ZW8bOKW5az7qFP9WO
Axd2bgaPDoghHagLCsvdp3ErJo3/uNDZLpETfTEm5iX9vMpjJ0Bp9RYmgWzRZ28L
n66b5FqSVyJiEuXiwKgpBEupfUGybgZWdOM43TD4LVPQ7GrauaM6UPiWYy79DJwS
a75LPIOuaOOAZxCFe3+2Rw4utX0ZLSETr1UFdnpOkAyC8BZMyt5eIYnjSGqW715V
XKzCTfErszDG13PXE6exPH84KOY3/sRsOkOkN3n2lSX2UJhk5Ac=
=M/UR
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.