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