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 | 79 +++++++++++++++++++++++-------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/msvcrt/tests/string.c | 39 ++++++++++++++---- dlls/ucrtbase/ucrtbase.spec | 4 +- 9 files changed, 89 insertions(+), 45 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 75b782ea8e3..68b8b2f713d 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1156,7 +1156,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 80132da3c6d..456821a0b2c 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1513,7 +1513,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 44baaaedb60..d8963036835 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1524,7 +1524,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index f0e5e709bba..2482c2cb340 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -828,7 +828,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index cdb867d1234..7fa54577b02 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -806,7 +806,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 4aaf991a14a..14664efc05b 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -839,47 +839,66 @@ int CDECL _mbccpy_s(unsigned char* dest, size_t maxsize, return _mbccpy_s_l(dest, maxsize, copied, src, NULL); }
+ /********************************************************************* - * _mbsncpy(MSVCRT.@) + * _mbsncpy_l(MSVCRT.@) * REMARKS * The parameter n is the number or characters to copy, not the size of - * the buffer. Use _mbsnbcpy for a function analogical to strncpy + * the buffer. Use _mbsnbcpy_l for a function analogical to strncpy */ -unsigned char* CDECL _mbsncpy(unsigned char* dst, const unsigned char* src, size_t n) +unsigned char* CDECL _mbsncpy_l(unsigned char* dst, const unsigned char* src, size_t n, _locale_t locale) { - unsigned char* ret = dst; - if(!n) - return dst; - if (get_mbcinfo()->ismbcodepage) - { - while (*src && n) + unsigned char* ret = dst; + pthreadmbcinfo mbcinfo; + + if (!n) + return dst; + if (!MSVCRT_CHECK_PMT(dst && src)) + return NULL; + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (mbcinfo->ismbcodepage) { - n--; - if (_ismbblead(*src)) - { - if (!*(src+1)) + while (*src && n) { - *dst++ = 0; - *dst++ = 0; - break; + n--; + if (_ismbblead_l(*src, locale)) + { + if (!*(src + 1)) + { + *dst++ = 0; + *dst++ = 0; + break; + } + *dst++ = *src++; + } + *dst++ = *src++; } - - *dst++ = *src++; - } - - *dst++ = *src++; } - } - else - { - while (n) + else { - n--; - if (!(*dst++ = *src++)) break; + while (n) + { + n--; + if (!(*dst++ = *src++)) break; + } } - } - while (n--) *dst++ = 0; - return ret; + while (n--) *dst++ = 0; + return ret; +} + +/********************************************************************* + * _mbsncpy(MSVCRT.@) + * REMARKS + * The parameter n is the number or characters to copy, not the size of + * the buffer. Use _mbsnbcpy for a function analogical to strncpy + */ +unsigned char* CDECL _mbsncpy(unsigned char* dst, const unsigned char* src, size_t n) +{ + return _mbsncpy_l(dst, src, n, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 9f98662b65a..b603f71a6bd 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -777,7 +777,7 @@ @ stub _mbsncoll(str str long) # stub _mbsncoll_l(str str long ptr) @ cdecl _mbsncpy(ptr str long) -# stub _mbsncpy_l(ptr str long ptr) +@ cdecl _mbsncpy_l(ptr str long ptr) # stub _mbsncpy_s(ptr long str long) # stub _mbsncpy_s_l(ptr long str long ptr) @ cdecl _mbsnextc(str) diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c index cdc19736832..5f8fec4f594 100644 --- a/dlls/msvcrt/tests/string.c +++ b/dlls/msvcrt/tests/string.c @@ -133,13 +133,13 @@ static void test_swab( void ) { char expected1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ@#"; char expected2[] = "ABCDEFGHIJKLMNOPQRSTUVWX$"; char expected3[] = "$"; - + char from[30]; char to[30]; - + int testsize; - - /* Test 1 - normal even case */ + + /* Test 1 - normal even case */ memset(to,'$', sizeof(to)); memset(from,'@', sizeof(from)); testsize = 26; @@ -147,7 +147,7 @@ static void test_swab( void ) { _swab( from, to, testsize ); ok(memcmp(to,expected1,testsize) == 0, "Testing even size %d returned '%*.*s'\n", testsize, testsize, testsize, to);
- /* Test 2 - uneven case */ + /* Test 2 - uneven case */ memset(to,'$', sizeof(to)); memset(from,'@', sizeof(from)); testsize = 25; @@ -155,7 +155,7 @@ static void test_swab( void ) { _swab( from, to, testsize ); ok(memcmp(to,expected2,testsize) == 0, "Testing odd size %d returned '%*.*s'\n", testsize, testsize, testsize, to);
- /* Test 3 - from = to */ + /* Test 3 - from = to */ memset(to,'$', sizeof(to)); memset(from,'@', sizeof(from)); testsize = 26; @@ -163,7 +163,7 @@ static void test_swab( void ) { _swab( to, to, testsize ); ok(memcmp(to,expected1,testsize) == 0, "Testing overlapped size %d returned '%*.*s'\n", testsize, testsize, testsize, to);
- /* Test 4 - 1 bytes */ + /* Test 4 - 1 bytes */ memset(to,'$', sizeof(to)); memset(from,'@', sizeof(from)); testsize = 1; @@ -264,6 +264,7 @@ static void test_mbcp(void) unsigned char *mbstring2 = (unsigned char *)"\xb0\xb1\xb2\xb3Q\xb4\xb5"; /* correct string */ unsigned char *mbsonlylead = (unsigned char *)"\xb0\0\xb1\xb2 \xb3"; unsigned char buf[16]; + unsigned char *ret; int step; CPINFO cp_info;
@@ -461,6 +462,30 @@ static void test_mbcp(void) expect_bin(buf, "\x00\xff", 2); }
+ memset(buf, 0xff, sizeof(buf)); + errno = 0xdeadbeef; + ret = _mbsncpy(NULL, mbstring, 1); + ok(ret == NULL, "_mbsncpy returned %p, expected NULL\n", ret); + ok(errno == EINVAL, "_mbsncpy returned %d\n", errno); + + memset(buf, 0xff, sizeof(buf)); + errno = 0xdeadbeef; + ret = _mbsncpy(buf, NULL, 1); + ok(ret == NULL, "_mbsncpy returned %p, expected NULL\n", ret); + ok(errno == EINVAL, "_mbsncpy returned %d\n", errno); + + memset(buf, 0xff, sizeof(buf)); + ret = _mbsncpy(NULL, mbstring, 0); + ok(ret == NULL, "_mbsncpy returned %p, expected %p\n", ret, buf); + + memset(buf, 0xff, sizeof(buf)); + ret = _mbsncpy(buf, NULL, 0); + ok(ret == buf, "_mbsncpy returned %p, expected %sp\n", ret, buf); + + memset(buf, 0xff, sizeof(buf)); + ret = _mbsncpy(buf, mbstring, 0); + ok(ret == buf, "_mbsncpy returned %p, expected %p\n", ret, buf); + memset(buf, 0xff, sizeof(buf)); _mbsncpy(buf, mbstring, 1); expect_bin(buf, "\xb0\xb1\xff", 3); diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 569a5d42725..c5127f5059f 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -672,7 +672,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) @@ -1241,7 +1241,7 @@ @ stub _o__mbsncoll @ stub _o__mbsncoll_l @ cdecl _o__mbsncpy(ptr str long) _mbsncpy -@ stub _o__mbsncpy_l +@ cdecl _o__mbsncpy_l(ptr str long ptr) _mbsncpy_l @ stub _o__mbsncpy_s @ stub _o__mbsncpy_s_l @ cdecl _o__mbsnextc(str) _mbsnextc