From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/mbcs.c | 91 ++++++++++++++++++++++++------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +- 8 files changed, 67 insertions(+), 40 deletions(-)
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 f36bb07756a..aab8d7e3e14 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); @@ -2845,50 +2850,72 @@ 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) - return str; + if (!MSVCRT_CHECK_PMT(str)) + return NULL;
- /* unpack multibyte string to temp buffer */ - p=str; - for(i=0; i<len; i++) - { - if (_ismbblead(*p)) - { - temp[i*2]=*p++; - temp[i*2+1]=*p++; - } - else - { - temp[i*2]=*p++; - temp[i*2+1]=0; - } - } + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo();
- /* repack it in the reverse order */ - p=str; - for(i=len-1; i>=0; i--) + if (mbcinfo->ismbcodepage) { - if(_ismbblead(temp[i*2])) + 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 < len; i++) { - *p++=temp[i*2]; - *p++=temp[i*2+1]; + if (_ismbblead_l(*p, locale)) + { + temp[i * 2] = *p++; + temp[i * 2 + 1] = *p++; + } + else + { + temp[i * 2] = *p++; + temp[i * 2 + 1] = 0; + } } - else + + /* repack it in the reverse order */ + p = str; + for (i = len - 1; i >= 0; i--) { - *p++=temp[i*2]; + if (_ismbblead_l(temp[i * 2], locale)) + { + *p++ = temp[i * 2]; + *p++ = temp[i * 2 + 1]; + } + else + { + *p++ = temp[i * 2]; + } } - }
- free(temp); + free(temp); + return str; + } + return u__strrev(str); +}
- return str; +/********************************************************************* + * _mbsrev (MSVCRT.@) + */ +unsigned char* CDECL _mbsrev(unsigned char* str) +{ + return _mbsrev_l(str, NULL); }
/********************************************************************* 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