msvcp90: Implement basic_string and cstring versions of basic_string::find.

Vincent Pelletier plr.vincent at gmail.com
Sat Apr 2 01:49:57 CDT 2011


---
 dlls/msvcp90/msvcp90.spec   |    8 ++++----
 dlls/msvcp90/string.c       |   22 ++++++++++++++++++++++
 dlls/msvcp90/tests/string.c |   41 ++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 66 insertions(+), 5 deletions(-)

diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec
index b09fa20..0d13ba3 100644
--- a/dlls/msvcp90/msvcp90.spec
+++ b/dlls/msvcp90/msvcp90.spec
@@ -3817,14 +3817,14 @@
 @ stub -arch=win64 ?fill@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QEAA_W_W at Z
 @ stub -arch=win32 ?fill@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QBE_WXZ
 @ stub -arch=win64 ?fill@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QEBA_WXZ
-@ stub -arch=win32 ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEIABV12 at I@Z
-@ stub -arch=win64 ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBA_KAEBV12 at _K@Z
+@ thiscall -arch=win32 ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEIABV12 at I@Z(ptr ptr long) MSVCP_basic_string_char_find
+@ cdecl -arch=win64 ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBA_KAEBV12 at _K@Z(ptr ptr long) MSVCP_basic_string_char_find
 @ stub -arch=win32 ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEIDI at Z
 @ stub -arch=win64 ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBA_KD_K at Z
-@ stub -arch=win32 ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEIPBDI at Z
+@ thiscall -arch=win32 ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEIPBDI at Z(ptr ptr long) MSVCP_basic_string_char_find_cstr
 @ stub -arch=win64 ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBA_KPEBD_K1 at Z
 @ stub -arch=win32 ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEIPBDII at Z
-@ stub -arch=win64 ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBA_KPEBD_K at Z
+@ cdecl -arch=win64 ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBA_KPEBD_K at Z(ptr ptr long) MSVCP_basic_string_char_find_cstr
 @ stub -arch=win32 ?find@?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QBEIABV12 at I@Z
 @ stub -arch=win64 ?find@?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEBA_KAEBV12 at _K@Z
 @ stub -arch=win32 ?find@?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QBEIGI at Z
diff --git a/dlls/msvcp90/string.c b/dlls/msvcp90/string.c
index b604092..14e6c02 100644
--- a/dlls/msvcp90/string.c
+++ b/dlls/msvcp90/string.c
@@ -689,6 +689,28 @@ basic_string_char* __thiscall MSVCP_basic_string_char_assign_cstr(
             MSVCP_char_traits_char_length(str));
 }
 
+/* ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEIPBDI at Z */
+/* ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBA_KAEBV12 at _K@Z */
+DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_cstr, 12)
+size_t __thiscall MSVCP_basic_string_char_find_cstr(
+        basic_string_char *this, const char *str, size_t offset)
+{
+    const char *this_str = basic_string_char_const_ptr(this);
+    const char *found = strstr(this_str+offset, str);
+    if (found)
+        return found - this_str;
+    return MSVCP_basic_string_char_npos;
+}
+
+/* ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEIABV12 at I@Z */
+/* ?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBA_KPEBD_K at Z */
+DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find, 12)
+size_t __thiscall MSVCP_basic_string_char_find(
+        basic_string_char *this, const basic_string_char *str, size_t offset)
+{
+    return MSVCP_basic_string_char_find_cstr(this, basic_string_char_const_ptr(str), offset);
+}
+
 /* ?c_str@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEPBDXZ */
 /* ?c_str@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBAPEBDXZ */
 /* ?data@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEPBDXZ */
diff --git a/dlls/msvcp90/tests/string.c b/dlls/msvcp90/tests/string.c
index 4f84264..8b8fba8 100644
--- a/dlls/msvcp90/tests/string.c
+++ b/dlls/msvcp90/tests/string.c
@@ -52,6 +52,8 @@ static void* (__cdecl *p_set_invalid_parameter_handler)(void*);
 static basic_string_char* (WINAPI *p_basic_string_char_concatenate)(basic_string_char*, const basic_string_char*, const basic_string_char*);
 static basic_string_char* (WINAPI *p_basic_string_char_concatenate_cstr)(basic_string_char*, const basic_string_char*, const char*);
 
+const size_t *p_basic_string_char_npos;
+
 #ifdef __i386__
 static basic_string_char* (WINAPI *p_basic_string_char_ctor)(void);
 static basic_string_char* (WINAPI *p_basic_string_char_copy_ctor)(basic_string_char*);
@@ -68,6 +70,8 @@ static basic_string_char* (WINAPI *p_basic_string_char_append)(basic_string_char
 static basic_string_char* (WINAPI *p_basic_string_char_append_substr)(basic_string_char*, size_t, size_t);
 static int (WINAPI *p_basic_string_char_compare_substr_substr)(size_t, size_t, basic_string_char*, size_t, size_t);
 static int (WINAPI *p_basic_string_char_compare_substr_cstr_len)(size_t, size_t, const char*, size_t);
+static size_t (WINAPI *p_basic_string_char_find)(basic_string_char*, basic_string_char*, size_t);
+static size_t (WINAPI *p_basic_string_char_find_cstr)(basic_string_char*, const char*, size_t);
 
 static basic_string_wchar* (WINAPI *p_basic_string_wchar_ctor)(void);
 static basic_string_wchar* (WINAPI *p_basic_string_wchar_copy_ctor)(basic_string_wchar*);
@@ -96,6 +100,8 @@ static basic_string_char* (WINAPI *p_basic_string_char_append)(basic_string_char
 static basic_string_char* (WINAPI *p_basic_string_char_append_substr)(basic_string_char*, basic_string_char*, size_t, size_t);
 static int (WINAPI *p_basic_string_char_compare_substr_substr)(basic_string_char*, size_t, size_t, basic_string_char*, size_t, size_t);
 static int (WINAPI *p_basic_string_char_compare_substr_cstr_len)(basic_string_char*, size_t, size_t, const char*, size_t);
+static size_t (__cdecl *p_basic_string_char_find)(basic_string_char*, basic_string_char*, size_t);
+static size_t (__cdecl *p_basic_string_char_find_cstr)(basic_string_char*, const char*, size_t);
 
 static basic_string_wchar* (__cdecl *p_basic_string_wchar_ctor)(basic_string_wchar*);
 static basic_string_wchar* (__cdecl *p_basic_string_wchar_copy_ctor)(basic_string_wchar*, basic_string_wchar*);
@@ -347,6 +353,9 @@ static BOOL init(void)
     p_set_invalid_parameter_handler(test_invalid_parameter_handler);
 
     if(sizeof(void*) == 8) { /* 64-bit initialization */
+        p_basic_string_char_npos = (const size_t *)GetProcAddress(msvcp,
+                "?npos@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@2_KB");
+
         p_basic_string_char_ctor = (void*)GetProcAddress(msvcp,
                 "??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEAA at XZ");
         p_basic_string_char_copy_ctor = (void*)GetProcAddress(msvcp,
@@ -381,6 +390,10 @@ static BOOL init(void)
                 "??$?HDU?$char_traits at D@std@@V?$allocator at D@1@@std@@YA?AV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@0 at AEBV10@0 at Z");
         p_basic_string_char_concatenate_cstr = (void*)GetProcAddress(msvcp,
                 "??$?HDU?$char_traits at D@std@@V?$allocator at D@1@@std@@YA?AV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@0 at AEBV10@PEBD at Z");
+        p_basic_string_char_find_cstr = (void*)GetProcAddress(msvcp,
+                "?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBA_KPEBD_K at Z");
+        p_basic_string_char_find = (void*)GetProcAddress(msvcp,
+                "?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBA_KAEBV12 at _K@Z");
 
         p_basic_string_wchar_ctor = (void*)GetProcAddress(msvcp,
                 "??0?$basic_string at _WU?$char_traits at _W@std@@V?$allocator at _W@2@@std@@QEAA at XZ");
@@ -405,6 +418,9 @@ static BOOL init(void)
         p_basic_string_wchar_swap = (void*)GetProcAddress(msvcp,
                 "?swap@?$basic_string at _WU?$char_traits at _W@std@@V?$allocator at _W@2@@std@@QEAAXAEAV12@@Z");
     } else {
+        p_basic_string_char_npos = (const size_t *)GetProcAddress(msvcp,
+                "?npos@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@2IB");
+
         p_basic_string_char_ctor = (void*)GetProcAddress(msvcp,
                 "??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at XZ");
         p_basic_string_char_copy_ctor = (void*)GetProcAddress(msvcp,
@@ -439,6 +455,10 @@ static BOOL init(void)
                 "??$?HDU?$char_traits at D@std@@V?$allocator at D@1@@std@@YA?AV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@0 at ABV10@0 at Z");
         p_basic_string_char_concatenate_cstr = (void*)GetProcAddress(msvcp,
                 "??$?HDU?$char_traits at D@std@@V?$allocator at D@1@@std@@YA?AV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@0 at ABV10@PBD at Z");
+        p_basic_string_char_find_cstr = (void*)GetProcAddress(msvcp,
+                "?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEIPBDI at Z");
+        p_basic_string_char_find = (void*)GetProcAddress(msvcp,
+                "?find@?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEIABV12 at I@Z");
 
         p_basic_string_wchar_ctor = (void*)GetProcAddress(msvcp,
                 "??0?$basic_string at _WU?$char_traits at _W@std@@V?$allocator at _W@2@@std@@QAE at XZ");
@@ -476,7 +496,8 @@ static void test_basic_string_char(void) {
             || !p_basic_string_char_ctor_cstr || !p_basic_string_char_dtor
             || !p_basic_string_char_erase || !p_basic_string_char_assign_cstr_len
             || !p_basic_string_char_cstr || !p_basic_string_char_data
-            || !p_basic_string_char_size || !p_basic_string_char_capacity) {
+            || !p_basic_string_char_size || !p_basic_string_char_capacity
+            || !p_basic_string_char_find || !p_basic_string_char_find_cstr) {
         win_skip("basic_string<char> unavailable\n");
         return;
     }
@@ -541,6 +562,24 @@ static void test_basic_string_char(void) {
     str = call_func1(p_basic_string_char_data, &str2);
     ok(!memcmp(str, "es", 3), "str = %s\n", str);
 
+    call_func3(p_basic_string_char_assign_cstr_len, &str1, "aa ab aa", 8);
+    size = call_func3(p_basic_string_char_find_cstr, &str1, "aa", 0);
+    ok(size == 0, "position = %d\n", size);
+    size = call_func3(p_basic_string_char_find_cstr, &str1, "aa", 1);
+    ok(size == 6, "position = %d\n", size);
+    call_func3(p_basic_string_char_assign_cstr_len, &str2, "aa", 2);
+    size = call_func3(p_basic_string_char_find, &str1, &str2, 0);
+    ok(size == 0, "position = %d\n", size);
+    size = call_func3(p_basic_string_char_find, &str1, &str2, 1);
+    ok(size == 6, "position = %d\n", size);
+    size = call_func3(p_basic_string_char_find_cstr, &str1, "c", 0);
+    ok(size == *p_basic_string_char_npos, "position = %d, npos = %d\n",
+        size, *p_basic_string_char_npos);
+    call_func3(p_basic_string_char_assign_cstr_len, &str2, "c", 1);
+    size = call_func3(p_basic_string_char_find, &str1, &str2, 0);
+    ok(size == *p_basic_string_char_npos, "position = %d, npos = %d\n",
+        size, *p_basic_string_char_npos);
+
     call_func1(p_basic_string_char_dtor, &str1);
     call_func1(p_basic_string_char_dtor, &str2);
 }
-- 
1.7.4.1





More information about the wine-patches mailing list