]> git.ipfire.org Git - thirdparty/git.git/commitdiff
t-ctype: allow NUL anywhere in the specification string
authorRené Scharfe <l.s.r@web.de>
Sun, 3 Mar 2024 10:13:25 +0000 (11:13 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 3 Mar 2024 17:47:33 +0000 (09:47 -0800)
Replace the custom function is_in() for looking up a character in the
specification string with memchr(3) and sizeof.  This is shorter,
simpler and allows NUL anywhere in the string, which may come in handy
if we ever want to support more character classes that contain it.

Getting the string size using sizeof only works in a macro and with a
string constant.  Use ARRAY_SIZE and compile-time checks to make sure we
are not passed a string pointer.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/unit-tests/t-ctype.c

index f3154899843708308a6d43074d200b8d145424be..35473c41d87b30e385d94ddec6aa3d5e276053b7 100644 (file)
@@ -1,23 +1,13 @@
 #include "test-lib.h"
 
-static int is_in(const char *s, int ch)
-{
-       /*
-        * 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 ch == *s;
-       if (*s == '\0')
-               s++;
-       return !!strchr(s, ch);
-}
-
 /* Macro to test a character type */
 #define TEST_CTYPE_FUNC(func, string) \
 static void test_ctype_##func(void) { \
+       size_t len = ARRAY_SIZE(string) - 1 + \
+               BUILD_ASSERT_OR_ZERO(ARRAY_SIZE(string) > 0) + \
+               BUILD_ASSERT_OR_ZERO(sizeof(string[0]) == sizeof(char)); \
        for (int i = 0; i < 256; i++) { \
-               if (!check_int(func(i), ==, is_in(string, i))) \
+               if (!check_int(func(i), ==, !!memchr(string, i, len))) \
                        test_msg("       i: 0x%02x", i); \
        } \
        if (!check(!func(EOF))) \