Re: [PATCH] wip: change ISSPACE to use ascii whitespace check.
Alejandro Colomar via Mutt-dev <[email protected]>
| Newsgroups | gmane.mail.mutt.devel |
|---|---|
| Message-ID | <aZXMFTEbTxZKUwiD@devuan> |
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>
signature.asc
(application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEES7Jt9u9GbmlWADAi64mZXMKQwqkFAmmVzOUACgkQ64mZXMKQ wql0sg/+KrU4PmpdoDyxDiJGJWPyNv2eWPWNkIiXgN5XvQ6d79X/n3P1fUx4XH1H 39+JveJEWyJJqHnVRtah6yZfyrsoSSsNNoP40D6WR1doMjI/2XpQou3DCfxNn51L eoyMPzpCz5gUqw3CvwFKUY/htrucMe3LESUooXnPQ9F2+2yv7OG4vpc4joJTxQR5 S5YEBaZvggcks3E54jBZ/4/GKfa4jKfc1cVUxjrzYCp/MPzR7hkkOalre/MfIBLM Y5uXL8G7JXV+YiuVAkyHwubNjsthNWbwI0Al4T9ImaMEnqZ2Pbje/28oqJHV4nYE EjRAAX5UbM5Ht4K2HtC2PlmV+GTw2xrX1abrszIB5MAxNjlzLxY8fQDohJuQtWBb DiCT3Vy6qY7pmNOGY2bfOCJeLnjRcN9RlNp4HhVg3Fs9X3+zrvMurQ2kB1wy054U fh+xwg/C5JvYvA8FATL46bUP+/r2iXr1hxF6bfclNx+cdnyigH9YqIutn+a20Pps 0XPKAihEAMhvZYGMM1+pqwHD+VOty+ng6tuop1pE2n+tpTE7L+Ad3x1WokDynfIl l2WNGbAF07XMDFCkP1V353R2DPIMGd9gWo5dPSMWAn3GvlcuAIgiUwpcn47hZ2nP 1+PY0HZHCKlbtlleK3msKXe/lQWYzj/OpNG1zhA/1QdXaNnsYAI= =bDHY -----END PGP SIGNATURE-----