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