Module: wine Branch: master Commit: c08b647cf637c21a25f3807e2b7eda97d548074b URL: http://source.winehq.org/git/wine.git/?a=commit;h=c08b647cf637c21a25f3807e2b... Author: Piotr Caban <piotr(a)codeweavers.com> Date: Fri Apr 29 11:15:15 2011 +0200 msvcp90: Added basic_string<char> find implementation. --- dlls/msvcp90/msvcp90.spec | 16 +++++----- dlls/msvcp90/string.c | 70 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 8 deletions(-) diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec index 81eaf08..82f02ec 100644 --- a/dlls/msvcp90/msvcp90.spec +++ b/dlls/msvcp90/msvcp90.spec @@ -3819,11 +3819,11 @@ @ stub -arch=win64 ?fill@?$basic_ios(a)_WU?$char_traits(a)_W@std@@@std@@QEBA_WXZ @ stub -arch=win32 ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QBEIABV12(a)I@Z @ stub -arch=win64 ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QEBA_KAEBV12(a)_K@Z -@ stub -arch=win32 ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QBEIDI(a)Z -@ stub -arch=win64 ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QEBA_KD_K(a)Z +@ thiscall -arch=win32 ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QBEIDI(a)Z(ptr long long) MSVCP_basic_string_char_find_ch +@ cdecl -arch=win64 ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QEBA_KD_K(a)Z(ptr long long) MSVCP_basic_string_char_find_ch @ stub -arch=win32 ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QBEIPBDI(a)Z -@ stub -arch=win64 ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QEBA_KPEBD_K1(a)Z -@ stub -arch=win32 ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QBEIPBDII(a)Z +@ cdecl -arch=win64 ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QEBA_KPEBD_K1(a)Z(ptr str long long) MSVCP_basic_string_char_find_cstr_substr +@ thiscall -arch=win32 ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QBEIPBDII(a)Z(ptr str long long) MSVCP_basic_string_char_find_cstr_substr @ stub -arch=win64 ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QEBA_KPEBD_K(a)Z @ stub -arch=win32 ?find@?$basic_string(a)GU?$char_traits(a)G@std@@V?$allocator(a)G@2@@std@@QBEIABV12(a)I@Z @ stub -arch=win64 ?find@?$basic_string(a)GU?$char_traits(a)G@std@@V?$allocator(a)G@2@@std@@QEBA_KAEBV12(a)_K@Z @@ -3836,11 +3836,11 @@ @ stub -arch=win32 ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QBEIABV12(a)I@Z @ stub -arch=win64 ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QEBA_KAEBV12(a)_K@Z @ stub -arch=win32 ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QBEIPB_WI(a)Z -@ stub -arch=win64 ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QEBA_KPEB_W_K1(a)Z -@ stub -arch=win32 ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QBEIPB_WII(a)Z +@ cdecl -arch=win64 ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QEBA_KPEB_W_K1(a)Z(ptr wstr long long) MSVCP_basic_string_wchar_find_cstr_substr +@ thiscall -arch=win32 ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QBEIPB_WII(a)Z(ptr wstr long long) MSVCP_basic_string_wchar_find_cstr_substr @ stub -arch=win64 ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QEBA_KPEB_W_K(a)Z -@ stub -arch=win32 ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QBEI_WI(a)Z -@ stub -arch=win64 ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QEBA_K_W_K(a)Z +@ thiscall -arch=win32 ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QBEI_WI(a)Z(ptr long long) MSVCP_basic_string_wchar_find_ch +@ cdecl -arch=win64 ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QEBA_K_W_K(a)Z(ptr long long) MSVCP_basic_string_wchar_find_ch @ cdecl -arch=win32 ?find@?$char_traits(a)D@std@@SAPBDPBDIABD(a)Z(ptr long ptr) MSVCP_char_traits_char_find @ cdecl -arch=win64 ?find@?$char_traits(a)D@std@@SAPEBDPEBD_KAEBD(a)Z(ptr long ptr) MSVCP_char_traits_char_find @ cdecl -arch=win32 ?find@?$char_traits(a)G@std@@SAPBGPBGIABG(a)Z(ptr long ptr) MSVCP_char_traits_short_find diff --git a/dlls/msvcp90/string.c b/dlls/msvcp90/string.c index 5169426..23b5c3b 100644 --- a/dlls/msvcp90/string.c +++ b/dlls/msvcp90/string.c @@ -1025,6 +1025,41 @@ MSVCP_BOOL __cdecl MSVCP_basic_string_char_lower_cstr_bstr( return MSVCP_basic_string_char_compare_cstr(right, left) > 0; } +/* ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QBEIPBDII(a)Z */ +/* ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QEBA_KPEBD_K1(a)Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_cstr_substr, 16) +size_t __thiscall MSVCP_basic_string_char_find_cstr_substr( + const basic_string_char *this, const char *find, size_t pos, size_t len) +{ + const char *p, *end; + + TRACE("%p %s %lu %lu\n", this, find, (unsigned long)pos, (unsigned long)len); + + if(len==0 && pos<=this->size) + return pos; + + end = basic_string_char_const_ptr(this)+this->size-len+1; + for(p=basic_string_char_const_ptr(this)+pos; p<end; p++) { + p = MSVCP_char_traits_char_find(p, end-p, find); + if(!p) + break; + + if(!MSVCP_char_traits_char_compare(p, find, len)) + return p-basic_string_char_const_ptr(this); + } + + return MSVCP_basic_string_char_npos; +} + +/* ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QBEIDI(a)Z */ +/* ?find@?$basic_string(a)DU?$char_traits(a)D@std@@V?$allocator(a)D@2@@std@@QEBA_KD_K(a)Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_ch, 12) +size_t __thiscall MSVCP_basic_string_char_find_ch( + const basic_string_char *this, char ch, size_t pos) +{ + return MSVCP_basic_string_char_find_cstr_substr(this, &ch, pos, 1); +} + /* basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t>> */ /* ?npos@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@2IB */ /* ?npos@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@2_KB */ @@ -1552,3 +1587,38 @@ MSVCP_BOOL __cdecl MSVCP_basic_string_wchar_lower_cstr_bstr( { return MSVCP_basic_string_wchar_compare_cstr(right, left) > 0; } + +/* ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QBEIPB_WII(a)Z */ +/* ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QEBA_KPEB_W_K1(a)Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_cstr_substr, 16) +size_t __thiscall MSVCP_basic_string_wchar_find_cstr_substr( + const basic_string_wchar *this, const wchar_t *find, size_t pos, size_t len) +{ + const wchar_t *p, *end; + + TRACE("%p %s %lu %lu\n", this, debugstr_w(find), (unsigned long)pos, (unsigned long)len); + + if(len==0 && pos<=this->size) + return pos; + + end = basic_string_wchar_const_ptr(this)+this->size-len+1; + for(p=basic_string_wchar_const_ptr(this)+pos; p<end; p++) { + p = MSVCP_char_traits_wchar_find(p, end-p, find); + if(!p) + break; + + if(!MSVCP_char_traits_wchar_compare(p, find, len)) + return p-basic_string_wchar_const_ptr(this); + } + + return MSVCP_basic_string_wchar_npos; +} + +/* ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QBEI_WI(a)Z */ +/* ?find@?$basic_string(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@QEBA_K_W_K(a)Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_ch, 12) +size_t __thiscall MSVCP_basic_string_wchar_find_ch( + const basic_string_wchar *this, wchar_t ch, size_t pos) +{ + return MSVCP_basic_string_wchar_find_cstr_substr(this, &ch, pos, 1); +}