Piotr Caban : msvcrt: Added strnlen implementation.
Alexandre Julliard
julliard at winehq.org
Thu Mar 25 11:44:42 CDT 2010
Module: wine
Branch: master
Commit: c7aba97338445a230a8c3ef5878c132a78490264
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c7aba97338445a230a8c3ef5878c132a78490264
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Mar 24 22:39:28 2010 +0100
msvcrt: Added strnlen implementation.
---
dlls/msvcr80/msvcr80.spec | 2 +-
dlls/msvcr90/msvcr90.spec | 2 +-
dlls/msvcrt/msvcrt.spec | 2 +-
dlls/msvcrt/string.c | 13 +++++++++++++
dlls/msvcrt/tests/string.c | 23 +++++++++++++++++++++++
5 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index ed283d9..7c1e100 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -1389,7 +1389,7 @@
@ cdecl strncmp(str str long) msvcrt.strncmp
@ cdecl strncpy(ptr str long) msvcrt.strncpy
@ stub strncpy_s
-@ stub strnlen
+@ cdecl strnlen(str long) msvcrt.strnlen
@ cdecl strpbrk(str str) msvcrt.strpbrk
@ cdecl strrchr(str long) msvcrt.strrchr
@ cdecl strspn(str str) msvcrt.strspn
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index cbfc6e2..f95f92b 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -1373,7 +1373,7 @@
@ cdecl strncmp(str str long) msvcrt.strncmp
@ cdecl strncpy(ptr str long) msvcrt.strncpy
@ stub strncpy_s
-@ stub strnlen
+@ cdecl strnlen(str long) msvcrt.strnlen
@ cdecl strpbrk(str str) msvcrt.strpbrk
@ cdecl strrchr(str long) msvcrt.strrchr
@ cdecl strspn(str str) msvcrt.strspn
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 058b9ae..988d48e 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1327,7 +1327,7 @@
@ cdecl strncmp(str str long) ntdll.strncmp
@ cdecl strncpy(ptr str long) ntdll.strncpy
# stub strncpy_s
-# stub strnlen
+@ cdecl strnlen(str long) MSVCRT_strnlen
@ cdecl strpbrk(str str) ntdll.strpbrk
@ cdecl strrchr(str long) ntdll.strrchr
@ cdecl strspn(str str) ntdll.strspn
diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c
index a5f9a19..2a7c9af 100644
--- a/dlls/msvcrt/string.c
+++ b/dlls/msvcrt/string.c
@@ -314,3 +314,16 @@ MSVCRT_ulong CDECL MSVCRT_strtoul(const char* nptr, char** end, int base)
return ret;
}
+
+/******************************************************************
+ * strnlen (MSVCRT.@)
+ */
+MSVCRT_size_t CDECL MSVCRT_strnlen(const char *s, MSVCRT_size_t maxlen)
+{
+ MSVCRT_size_t i;
+
+ for(i=0; i<maxlen; i++)
+ if(!s[i]) break;
+
+ return i;
+}
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index a7b3404..6fd64d9 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -52,6 +52,7 @@ static int (__cdecl *pstrcat_s)(char *dst, size_t len, const char *src);
static int (__cdecl *p_mbsnbcpy_s)(unsigned char * dst, size_t size, const unsigned char * src, size_t count);
static int (__cdecl *p_wcscpy_s)(wchar_t *wcDest, size_t size, const wchar_t *wcSrc);
static int (__cdecl *p_wcsupr_s)(wchar_t *str, size_t size);
+static size_t (__cdecl *p_strnlen)(const char *, size_t);
static int *p__mb_cur_max;
static unsigned char *p_mbctype;
@@ -911,6 +912,26 @@ static void test_strtol(void)
ok(errno == ERANGE, "wrong errno %d\n", errno);
}
+static void test_strnlen(void)
+{
+ static const char str[] = "string";
+ size_t res;
+
+ if(!p_strnlen) {
+ win_skip("strnlen not found\n");
+ return;
+ }
+
+ res = p_strnlen(str, 20);
+ ok(res == 6, "Returned length = %d\n", (int)res);
+
+ res = p_strnlen(str, 3);
+ ok(res == 3, "Returned length = %d\n", (int)res);
+
+ res = p_strnlen(NULL, 0);
+ ok(res == 0, "Returned length = %d\n", (int)res);
+}
+
START_TEST(string)
{
char mem[100];
@@ -930,6 +951,7 @@ START_TEST(string)
p_mbsnbcpy_s = (void *)GetProcAddress( hMsvcrt,"_mbsnbcpy_s" );
p_wcscpy_s = (void *)GetProcAddress( hMsvcrt,"wcscpy_s" );
p_wcsupr_s = (void *)GetProcAddress( hMsvcrt,"_wcsupr_s" );
+ p_strnlen = (void *)GetProcAddress( hMsvcrt,"strnlen" );
/* MSVCRT memcpy behaves like memmove for overlapping moves,
MFC42 CString::Insert seems to rely on that behaviour */
@@ -959,4 +981,5 @@ START_TEST(string)
test_wcscpy_s();
test__wcsupr_s();
test_strtol();
+ test_strnlen();
}
More information about the wine-cvs
mailing list