- fix isleadbyte
 - implement mbrlen
 - avoid race condition when creatong global ANSI locale

svn path=/trunk/; revision=57907
This commit is contained in:
Jérôme Gardou 2012-12-13 16:32:17 +00:00
parent 5a862da366
commit ac12febb5b
4 changed files with 36 additions and 5 deletions

View file

@ -1266,7 +1266,7 @@
@ cdecl -i386 longjmp(ptr long) @ cdecl -i386 longjmp(ptr long)
@ cdecl malloc(long) @ cdecl malloc(long)
@ cdecl mblen(ptr long) @ cdecl mblen(ptr long)
# stub mbrlen @ cdecl mbrlen(ptr long ptr)
# stub mbrtowc # stub mbrtowc
# stub mbsdup_dbg # stub mbsdup_dbg
# stub mbsrtowcs # stub mbsrtowcs

View file

@ -1483,6 +1483,9 @@ void __init_global_locale()
unsigned i; unsigned i;
LOCK_LOCALE; LOCK_LOCALE;
/* Someone created it before us */
if(global_locale)
return;
global_locale = MSVCRT__create_locale(0, "C"); global_locale = MSVCRT__create_locale(0, "C");
MSVCRT___lc_codepage = MSVCRT_locale->locinfo->lc_codepage; MSVCRT___lc_codepage = MSVCRT_locale->locinfo->lc_codepage;

View file

@ -6,6 +6,6 @@
*/ */
int isleadbyte(int c) int isleadbyte(int c)
{ {
return _isctype( c, _MLEAD ); return _isctype( c, _LEADBYTE );
} }

View file

@ -9,10 +9,8 @@
* *
*/ */
#include <precomp.h>
#include <mbstring.h> #include <mbstring.h>
#include <stdlib.h>
int isleadbyte(int byte);
/* /*
* @implemented * @implemented
@ -40,3 +38,33 @@ int mblen( const char *str, size_t size )
} }
return 0; return 0;
} }
size_t __cdecl mbrlen(const char *str, size_t len, mbstate_t *state)
{
mbstate_t s = (state ? *state : 0);
size_t ret;
if(!len || !str || !*str)
return 0;
if(get_locinfo()->mb_cur_max == 1) {
return 1;
}else if(!s && isleadbyte((unsigned char)*str)) {
if(len == 1) {
s = (unsigned char)*str;
ret = -2;
}else {
ret = 2;
}
}else if(!s) {
ret = 1;
}else {
s = 0;
ret = 2;
}
if(state)
*state = s;
return ret;
}