diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 3c901f0345b..30fbd397131 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1178,7 +1178,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -@ stub _mbsrev_l +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) @ stub _mbsset_l @ stub _mbsset_s diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index b633d20e713..aaff43ea736 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1535,7 +1535,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -@ stub _mbsrev_l +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) @ stub _mbsset_l @ stub _mbsset_s diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index a5fdb346323..df0ea4c24da 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1546,7 +1546,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -@ stub _mbsrev_l +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) @ stub _mbsset_l @ stub _mbsset_s diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index d842d4362f1..687a73b5d8a 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -850,7 +850,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -@ stub _mbsrev_l +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) @ stub _mbsset_l @ stub _mbsset_s diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 2334b07957a..38ffcc7ca22 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -828,7 +828,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -@ stub _mbsrev_l +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) @ stub _mbsset_l @ stub _mbsset_s diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index cb48fac6fb6..e1aa5ab2d6f 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -160,6 +160,11 @@ static inline unsigned char *u_strrchr( const unsigned char *s, unsigned char x return (unsigned char*) strrchr( (const char*)s, x ); } +static inline unsigned char* u__strrev(unsigned char *str) +{ + return (unsigned char*)_strrev((char *)str); +} + static inline unsigned char *u__strset( unsigned char *s, unsigned char c ) { return (unsigned char*) _strset( (char*)s, c); @@ -2848,52 +2853,73 @@ size_t CDECL _mbscspn(const unsigned char* str, const unsigned char* cmp) } /********************************************************************* - * _mbsrev (MSVCRT.@) + * _mbsrev_l (MSVCRT.@) */ -unsigned char* CDECL _mbsrev(unsigned char* str) +unsigned char* CDECL _mbsrev_l(unsigned char* str, _locale_t locale) { - int i, len = _mbslen(str); - unsigned char *p, *temp=malloc(len*2); + int i, len; + unsigned char *p, *temp; + pthreadmbcinfo mbcinfo; - if(!temp) + if (!MSVCRT_CHECK_PMT(str)) + return NULL; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (!mbcinfo->ismbcodepage) + return u__strrev(str); + + len = _mbslen_l(str, locale); + temp = malloc(len * 2); + if (!temp) return str; /* unpack multibyte string to temp buffer */ - p=str; - for(i=0; i=0; i--) + p = str; + for (i = len - 1; i >= 0; i--) { - if(_ismbblead(temp[i*2])) + if (_ismbblead_l(temp[i * 2], locale)) { - *p++=temp[i*2]; - *p++=temp[i*2+1]; + *p++ = temp[i * 2]; + *p++ = temp[i * 2 + 1]; } else { - *p++=temp[i*2]; + *p++ = temp[i * 2]; } } free(temp); - return str; } +/********************************************************************* + * _mbsrev (MSVCRT.@) + */ +unsigned char* CDECL _mbsrev(unsigned char* str) +{ + return _mbsrev_l(str, NULL); +} + /********************************************************************* * _mbspbrk_l (MSVCRT.@) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index b9947d4e885..a52016e6298 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -799,7 +799,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -# stub _mbsrev_l(str ptr) +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) # stub _mbsset_l(ptr long ptr) # stub _mbsset_s(ptr long long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index e0174dd897c..1f99c65ef05 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -694,7 +694,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -@ stub _mbsrev_l +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) @ stub _mbsset_l @ stub _mbsset_s @@ -1263,7 +1263,7 @@ @ cdecl _o__mbsrchr(str long) _mbsrchr @ cdecl _o__mbsrchr_l(str long ptr) _mbsrchr_l @ cdecl _o__mbsrev(str) _mbsrev -@ stub _o__mbsrev_l +@ cdecl _o__mbsrev_l(str ptr) _mbsrev_l @ cdecl _o__mbsset(ptr long) _mbsset @ stub _o__mbsset_l @ stub _o__mbsset_s