1515#include "posix.h"
1616#include "userdiff.h"
1717
18+ static const char * old_locales [LC_ALL ];
19+
1820void test_core_posix__initialize (void )
1921{
22+ memset (& old_locales , 0 , sizeof (old_locales ));
23+
2024#ifdef GIT_WIN32
2125 /* on win32, the WSA context needs to be initialized
2226 * before any socket calls can be performed */
@@ -29,6 +33,13 @@ void test_core_posix__initialize(void)
2933
3034void test_core_posix__cleanup (void )
3135{
36+ int i ;
37+
38+ for (i = 0 ; i < LC_ALL ; i ++ ) {
39+ if (old_locales [i ])
40+ setlocale (i , old_locales [i ]);
41+ }
42+
3243 p_unlink ("fallocate_test" );
3344}
3445
@@ -152,54 +163,38 @@ void test_core_posix__utimes(void)
152163 p_unlink ("foo" );
153164}
154165
155- void test_core_posix__p_regcomp_ignores_global_locale_ctype ( void )
166+ static void try_set_locale ( int category )
156167{
157- p_regex_t preg ;
158- int error = 0 ;
168+ old_locales [category ] = setlocale (category , NULL );
159169
160- const char * oldlocale = setlocale (LC_CTYPE , NULL );
161-
162- if (!setlocale (LC_CTYPE , "UTF-8" ) &&
163- !setlocale (LC_CTYPE , "c.utf8" ) &&
164- !setlocale (LC_CTYPE , "en_US.UTF-8" ))
170+ if (!setlocale (category , "UTF-8" ) &&
171+ !setlocale (category , "c.utf8" ) &&
172+ !setlocale (category , "en_US.UTF-8" ))
165173 cl_skip ();
166174
167- if (MB_CUR_MAX == 1 ) {
168- setlocale (LC_CTYPE , oldlocale );
175+ if (MB_CUR_MAX == 1 )
169176 cl_fail ("Expected locale to be switched to multibyte" );
170- }
171-
172- error = p_regcomp (& preg , "[\xc0-\xff][\x80-\xbf]" , P_REG_EXTENDED );
173- p_regfree (& preg );
174-
175- setlocale (LC_CTYPE , oldlocale );
176-
177- cl_must_pass (error );
178177}
179178
180- void test_core_posix__p_regcomp_ignores_global_locale_collate (void )
179+ void test_core_posix__p_regcomp_ignores_global_locale_ctype (void )
181180{
182- regex_t preg ;
183- int error = 0 ;
181+ p_regex_t preg ;
184182
185- const char * oldlocale = setlocale ( LC_COLLATE , NULL );
183+ try_set_locale ( LC_CTYPE );
186184
187- if (!setlocale (LC_COLLATE , "UTF-8" ) &&
188- !setlocale (LC_COLLATE , "c.utf8" ) &&
189- !setlocale (LC_COLLATE , "en_US.UTF-8" ))
190- cl_skip ();
185+ cl_must_pass (p_regcomp (& preg , "[\xc0-\xff][\x80-\xbf]" , P_REG_EXTENDED ));
191186
192- if (MB_CUR_MAX == 1 ) {
193- setlocale (LC_COLLATE , oldlocale );
194- cl_fail ("Expected locale to be switched to multibyte" );
195- }
187+ p_regfree (& preg );
188+ }
196189
197- error = p_regcomp (& preg , "[\xc0-\xff][\x80-\xbf]" , REG_EXTENDED );
198- regfree (& preg );
190+ void test_core_posix__p_regcomp_ignores_global_locale_collate (void )
191+ {
192+ p_regex_t preg ;
199193
200- setlocale (LC_COLLATE , oldlocale );
194+ try_set_locale (LC_COLLATE );
195+ cl_must_pass (p_regcomp (& preg , "[\xc0-\xff][\x80-\xbf]" , P_REG_EXTENDED ));
201196
202- cl_must_pass ( error );
197+ p_regfree ( & preg );
203198}
204199
205200void test_core_posix__p_regcomp_compile_userdiff_regexps (void )
0 commit comments