From bd77b96855dad7ed158ad2d7bf56cae734ca96b4 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Wed, 22 Jun 2011 19:14:29 +0200 Subject: [PATCH] msvcp90: Added basic_string::last_index_of implementation. --- dlls/msvcp90/msvcp90.spec | 32 ++++++------ dlls/msvcp90/string.c | 106 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 16 deletions(-) diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec index de2a139a16d..0dbd4733284 100644 --- a/dlls/msvcp90/msvcp90.spec +++ b/dlls/msvcp90/msvcp90.spec @@ -3919,14 +3919,14 @@ @ stub -arch=win64 ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z @ stub -arch=win32 ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z @ stub -arch=win64 ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z -@ stub -arch=win32 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z -@ stub -arch=win64 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z -@ stub -arch=win32 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z -@ stub -arch=win64 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z -@ stub -arch=win32 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z -@ stub -arch=win64 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z -@ stub -arch=win32 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z -@ stub -arch=win64 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z +@ thiscall -arch=win32 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z(ptr ptr long) MSVCP_basic_string_char_find_last_of +@ cdecl -arch=win64 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z(ptr ptr long) MSVCP_basic_string_char_find_last_of +@ thiscall -arch=win32 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z(ptr long long) MSVCP_basic_string_char_find_last_of_ch +@ cdecl -arch=win64 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z(ptr long long) MSVCP_basic_string_char_find_last_of_ch +@ thiscall -arch=win32 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z(ptr str long) MSVCP_basic_string_char_find_last_of_cstr +@ cdecl -arch=win64 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z(ptr str long long) MSVCP_basic_string_char_find_last_of_cstr_substr +@ thiscall -arch=win32 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z(ptr str long long) MSVCP_basic_string_char_find_last_of_cstr_substr +@ cdecl -arch=win64 ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z(ptr str long) MSVCP_basic_string_char_find_last_of_cstr @ stub -arch=win32 ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z @ stub -arch=win64 ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z @ stub -arch=win32 ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z @@ -3935,14 +3935,14 @@ @ stub -arch=win64 ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z @ stub -arch=win32 ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z @ stub -arch=win64 ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z -@ stub -arch=win32 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z -@ stub -arch=win64 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z -@ stub -arch=win32 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z -@ stub -arch=win64 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z -@ stub -arch=win32 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z -@ stub -arch=win64 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z -@ stub -arch=win32 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z -@ stub -arch=win64 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z +@ thiscall -arch=win32 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z(ptr ptr long) MSVCP_basic_string_wchar_find_last_of +@ cdecl -arch=win64 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z(ptr ptr long) MSVCP_basic_string_wchar_find_last_of +@ thiscall -arch=win32 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z(ptr ptr long) MSVCP_basic_string_wchar_find_last_of_cstr +@ cdecl -arch=win64 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z(ptr ptr long long) MSVCP_basic_string_wchar_find_last_of_cstr_substr +@ thiscall -arch=win32 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z(ptr ptr long long) MSVCP_basic_string_wchar_find_last_of_cstr_substr +@ cdecl -arch=win64 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z(ptr ptr long) MSVCP_basic_string_wchar_find_last_of_cstr +@ thiscall -arch=win32 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z(ptr long long) MSVCP_basic_string_wchar_find_last_of_ch +@ cdecl -arch=win64 ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z(ptr long long) MSVCP_basic_string_wchar_find_last_of_ch @ thiscall -arch=win32 ?flags@ios_base@std@@QAEHH@Z(ptr long) ios_base_flags_set @ cdecl -arch=win64 ?flags@ios_base@std@@QEAAHH@Z(ptr long) ios_base_flags_set @ thiscall -arch=win32 ?flags@ios_base@std@@QBEHXZ(ptr) ios_base_flags_get diff --git a/dlls/msvcp90/string.c b/dlls/msvcp90/string.c index bbaebb5a1a6..88a542ae1a1 100644 --- a/dlls/msvcp90/string.c +++ b/dlls/msvcp90/string.c @@ -1150,6 +1150,59 @@ MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_of_ch( return MSVCP_basic_string_char_find_first_of_cstr_substr(this, &ch, off, 1); } +/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */ +/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_of_cstr_substr, 16) +MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_of_cstr_substr( + const basic_string_char *this, const char *find, MSVCP_size_t off, MSVCP_size_t len) +{ + const char *p, *beg; + + TRACE("%p %p %lu %lu\n", this, find, off, len); + + + if(len>0 && this->size>0) { + if(off >= this->size) + off = this->size-1; + + beg = basic_string_char_const_ptr(this); + for(p=beg+off; p>=beg; p--) + if(MSVCP_char_traits_char_find(find, len, p)) + return p-beg; + } + + return MSVCP_basic_string_char_npos; +} + +/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */ +/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_of, 12) +MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_of( + const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off) +{ + return MSVCP_basic_string_char_find_last_of_cstr_substr(this, + basic_string_char_const_ptr(find), off, find->size); +} + +/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */ +/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_of_cstr, 12) +MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_of_cstr( + const basic_string_char *this, const char *find, MSVCP_size_t off) +{ + return MSVCP_basic_string_char_find_last_of_cstr_substr( + this, find, off, MSVCP_char_traits_char_length(find)); +} + +/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */ +/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_of_ch, 12) +MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_of_ch( + const basic_string_char *this, char ch, MSVCP_size_t off) +{ + return MSVCP_basic_string_char_find_last_of_cstr_substr(this, &ch, off, 1); +} + /* ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAADI@Z */ /* ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAD_K@Z */ /* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAADI@Z */ @@ -1867,6 +1920,59 @@ MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_of_ch( return MSVCP_basic_string_wchar_find_first_of_cstr_substr(this, &ch, off, 1); } +/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */ +/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_of_cstr_substr, 16) +MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_of_cstr_substr( + const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off, MSVCP_size_t len) +{ + const wchar_t *p, *beg; + + TRACE("%p %p %lu %lu\n", this, find, off, len); + + + if(len>0 && this->size>0) { + if(off >= this->size) + off = this->size-1; + + beg = basic_string_wchar_const_ptr(this); + for(p=beg+off; p>=beg; p--) + if(MSVCP_char_traits_wchar_find(find, len, p)) + return p-beg; + } + + return MSVCP_basic_string_wchar_npos; +} + +/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */ +/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_of, 12) +MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_of( + const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off) +{ + return MSVCP_basic_string_wchar_find_last_of_cstr_substr(this, + basic_string_wchar_const_ptr(find), off, find->size); +} + +/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */ +/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_of_cstr, 12) +MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_of_cstr( + const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off) +{ + return MSVCP_basic_string_wchar_find_last_of_cstr_substr( + this, find, off, MSVCP_char_traits_wchar_length(find)); +} + +/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */ +/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_of_ch, 12) +MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_of_ch( + const basic_string_wchar *this, wchar_t ch, MSVCP_size_t off) +{ + return MSVCP_basic_string_wchar_find_last_of_cstr_substr(this, &ch, off, 1); +} + /* ?at@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAA_WI@Z */ /* ?at@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEA_W_K@Z */ /* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAA_WI@Z */