git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/3] test-ctype: test isascii

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 11, 2023, 19:48 UTC
Message-ID
<xmqqr0uwdlvh.fsf@gitster.g>
In-Reply-To
<21f316ab-714a-58f6-a8d2-466d738b4ed3@web.de>
René Scharfe <l.s.r@web.de> writes:
Show 7 quoted lines
> Test the character classifier added by c2e9364a06 (cleanup: add
> isascii(), 2009-03-07).  It returns 1 for NUL as well, which requires
> special treatment, as our string-based tester can't find it with
> strcmp(3).  Allow NUL to be given as the first character in a class
> specification string.  This has the downside of no longer supporting
> the empty string, but that's OK since we are not interested in testing
> character classes with no members.

I wonder how effective a test we can have by checking a table we use in production (i.e. ctype.c::sane_ctype[]) against another table we use only for testing (i.e. string literals in test-ctype.c), but that is not something new in this series.

I do not offhand know if the string literal prefixed with NUL is safe against clever compilers; my gut feeling says it should (i.e. allowing such an "optimization" does not seem to have much merit), but my gut has been wrong many times in this area, so...

Show 53 quoted lines
>
> Signed-off-by: René Scharfe <l.s.r@web.de>
> ---
>  t/helper/test-ctype.c | 19 +++++++++++++++++--
>  1 file changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/t/helper/test-ctype.c b/t/helper/test-ctype.c
> index 92c4c2313e..caf586649f 100644
> --- a/t/helper/test-ctype.c
> +++ b/t/helper/test-ctype.c
> @@ -11,9 +11,14 @@ static void report_error(const char *class, int ch)
>
>  static int is_in(const char *s, int ch)
>  {
> -	/* We can't find NUL using strchr.  It's classless anyway. */
> +	/*
> +	 * We can't find NUL using strchr. Accept it as the first
> +	 * character in the spec -- there are no empty classes.
> +	 */
>  	if (ch == '\0')
> -		return 0;
> +		return ch == *s;
> +	if (*s == '\0')
> +		s++;
>  	return !!strchr(s, ch);
>  }
>
> @@ -28,6 +33,15 @@ static int is_in(const char *s, int ch)
>  #define DIGIT "0123456789"
>  #define LOWER "abcdefghijklmnopqrstuvwxyz"
>  #define UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
> +#define ASCII \
> +	"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" \
> +	"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" \
> +	"\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f" \
> +	"\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f" \
> +	"\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f" \
> +	"\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f" \
> +	"\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f" \
> +	"\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
>
>  int cmd__ctype(int argc, const char **argv)
>  {
> @@ -38,6 +52,7 @@ int cmd__ctype(int argc, const char **argv)
>  	TEST_CLASS(is_glob_special, "*?[\\");
>  	TEST_CLASS(is_regex_special, "$()*+.?[\\^{|");
>  	TEST_CLASS(is_pathspec_magic, "!\"#%&',-/:;<=>@_`~");
> +	TEST_CLASS(isascii, ASCII);
>
>  	return rc;
>  }
> --
> 2.39.1
Previous: René ScharfeNext: René Scharfe
Message 3 of 14 in “test-ctype: test all classifiers”
  1. 0/3 test-ctype: test all classifiersRené Scharfe, Feb 11, 2023
  2. 1/3 test-ctype: test isasciiRené Scharfe, Feb 11, 2023
  3. Junio C HamanoFeb 11, 2023
  4. René ScharfeFeb 12, 2023
  5. Junio C HamanoFeb 13, 2023
  6. René ScharfeFeb 13, 2023
  7. Junio C HamanoFeb 13, 2023
  8. 2/3 test-ctype: test islower and isupperRené Scharfe, Feb 11, 2023
  9. 3/3 test-ctype: test iscntrl, ispunct, isxdigit and isprintRené Scharfe, Feb 11, 2023
  10. 0/3 test-ctype: test all classifiersRené Scharfe, Feb 13, 2023
  11. 1/3 test-ctype: test isasciiRené Scharfe, Feb 13, 2023
  12. 2/3 test-ctype: test islower and isupperRené Scharfe, Feb 13, 2023
  13. 3/3 test-ctype: test iscntrl, ispunct, isxdigit and isprintRené Scharfe, Feb 13, 2023
  14. Junio C HamanoFeb 13, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.