Commit 36117978 by Arthur Schreiber

Fix the existence check for `regcomp_l`.

`xlocale.h` only defines `regcomp_l` if `regex.h` was included as well.

Also change the test cases to actually test `p_regcomp` works with
a multibyte locale.
parent 45dc219f
...@@ -508,7 +508,7 @@ ELSE () ...@@ -508,7 +508,7 @@ ELSE ()
ENDIF () ENDIF ()
ENDIF() ENDIF()
CHECK_SYMBOL_EXISTS(regcomp_l "xlocale.h" HAVE_REGCOMP_L) CHECK_SYMBOL_EXISTS(regcomp_l "regex.h;xlocale.h" HAVE_REGCOMP_L)
IF (HAVE_REGCOMP_L) IF (HAVE_REGCOMP_L)
ADD_DEFINITIONS(-DHAVE_REGCOMP_L) ADD_DEFINITIONS(-DHAVE_REGCOMP_L)
ENDIF () ENDIF ()
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
# endif # endif
#endif #endif
#include <locale.h>
#include "clar_libgit2.h" #include "clar_libgit2.h"
#include "posix.h" #include "posix.h"
#include "userdiff.h" #include "userdiff.h"
...@@ -148,26 +150,46 @@ void test_core_posix__utimes(void) ...@@ -148,26 +150,46 @@ void test_core_posix__utimes(void)
p_unlink("foo"); p_unlink("foo");
} }
void test_core_posix__p_regcomp_compile_single_byte_regexps(void) void test_core_posix__p_regcomp_ignores_global_locale_ctype(void)
{ {
regex_t preg; regex_t preg;
int error = 0;
const char* oldlocale = setlocale(LC_CTYPE, NULL);
if (!setlocale(LC_CTYPE, "UTF-8") &&
!setlocale(LC_CTYPE, "c.utf8") &&
!setlocale(LC_CTYPE, "en_US.UTF-8"))
cl_skip();
cl_must_pass(p_regcomp(&preg, "[\xc0-\xff][\x80-\xbf]", REG_EXTENDED)); if (MB_CUR_MAX == 1) {
setlocale(LC_CTYPE, oldlocale);
cl_fail("Expected locale to be switched to multibyte");
}
p_regcomp(&preg, "[\xc0-\xff][\x80-\xbf]", REG_EXTENDED);
regfree(&preg); regfree(&preg);
setlocale(LC_CTYPE, oldlocale);
cl_must_pass(error);
} }
void test_core_posix__p_regcomp_compile_userdiff_regexps(void) void test_core_posix__p_regcomp_compile_userdiff_regexps(void)
{ {
regex_t preg;
size_t idx; size_t idx;
for (idx = 0; idx < ARRAY_SIZE(builtin_defs); ++idx) { for (idx = 0; idx < ARRAY_SIZE(builtin_defs); ++idx) {
git_diff_driver_definition ddef = builtin_defs[idx]; git_diff_driver_definition ddef = builtin_defs[idx];
int error = 0;
regex_t preg;
cl_must_pass(p_regcomp(&preg, ddef.fns, REG_EXTENDED | ddef.flags)); error = p_regcomp(&preg, ddef.fns, REG_EXTENDED | ddef.flags);
cl_must_pass(p_regcomp(&preg, ddef.words, REG_EXTENDED)); regfree(&preg);
} cl_must_pass(error);
error = p_regcomp(&preg, ddef.words, REG_EXTENDED);
regfree(&preg); regfree(&preg);
cl_must_pass(error);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment