/* * Copyright 2010 Piotr Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" #include #include "msvcp90.h" #include "stdio.h" #include "windef.h" #include "winbase.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(msvcp90); /* char_traits */ /* ?assign@?$char_traits@D@std@@SAXAADABD@Z */ /* ?assign@?$char_traits@D@std@@SAXAEADAEBD@Z */ void CDECL MSVCP_char_traits_char_assign(char *ch, const char *assign) { *ch = *assign; } /* ?eq@?$char_traits@D@std@@SA_NABD0@Z */ /* ?eq@?$char_traits@D@std@@SA_NAEBD0@Z */ MSVCP_BOOL CDECL MSVCP_char_traits_char_eq(const char *ch1, const char *ch2) { return *ch1 == *ch2; } /* ?lt@?$char_traits@D@std@@SA_NABD0@Z */ /* ?lt@?$char_traits@D@std@@SA_NAEBD0@Z */ MSVCP_BOOL CDECL MSVCP_char_traits_lt(const char *ch1, const char *ch2) { return *ch1 < *ch2; } /* ?compare@?$char_traits@D@std@@SAHPBD0I@Z */ /* ?compare@?$char_traits@D@std@@SAHPEBD0_K@Z */ int CDECL MSVCP_char_traits_char_compare( const char *s1, const char *s2, size_t count) { int ret = memcmp(s1, s2, count); return (ret>0 ? 1 : (ret<0 ? -1 : 0)); } /* ?length@?$char_traits@D@std@@SAIPBD@Z */ /* ?length@?$char_traits@D@std@@SA_KPEBD@Z */ size_t CDECL MSVCP_char_traits_char_length(const char *str) { return strlen(str); } /* ?_Copy_s@?$char_traits@D@std@@SAPADPADIPBDI@Z */ /* ?_Copy_s@?$char_traits@D@std@@SAPEADPEAD_KPEBD1@Z */ char* CDECL MSVCP_char_traits_char__Copy_s(char *dest, size_t size, const char *src, size_t count) { if(!dest || !src || size */ /* ?assign@?$char_traits@_W@std@@SAXAA_WAB_W@Z */ /* ?assign@?$char_traits@_W@std@@SAXAEA_WAEB_W@Z */ void CDECL MSVCP_char_traits_wchar_assign(wchar_t *ch, const wchar_t *assign) { *ch = *assign; } /* ?eq@?$char_traits@_W@std@@SA_NAB_W0@Z */ /* ?eq@?$char_traits@_W@std@@SA_NAEB_W0@Z */ MSVCP_BOOL CDECL MSVCP_char_traits_wchar_eq(wchar_t *ch1, wchar_t *ch2) { return *ch1 == *ch2; } /* ?lt@?$char_traits@_W@std@@SA_NAB_W0@Z */ /* ?lt@?$char_traits@_W@std@@SA_NAEB_W0@Z */ MSVCP_BOOL CDECL MSVCP_char_traits_wchar_lt(const wchar_t *ch1, const wchar_t *ch2) { return *ch1 < *ch2; } /* ?compare@?$char_traits@_W@std@@SAHPB_W0I@Z */ /* ?compare@?$char_traits@_W@std@@SAHPEB_W0_K@Z */ int CDECL MSVCP_char_traits_wchar_compare(const wchar_t *s1, const wchar_t *s2, size_t count) { int ret = memcmp(s1, s2, sizeof(wchar_t[count])); return (ret>0 ? 1 : (ret<0 ? -1 : 0)); } /* ?length@?$char_traits@_W@std@@SAIPB_W@Z */ /* ?length@?$char_traits@_W@std@@SA_KPEB_W@Z */ size_t CDECL MSVCP_char_traits_wchar_length(const wchar_t *str) { return wcslen((WCHAR*)str); } /* ?_Copy_s@?$char_traits@_W@std@@SAPA_WPA_WIPB_WI@Z */ /* ?_Copy_s@?$char_traits@_W@std@@SAPEA_WPEA_W_KPEB_W1@Z */ wchar_t* CDECL MSVCP_char_traits_wchar__Copy_s(wchar_t *dest, size_t size, const wchar_t *src, size_t count) { if(!dest || !src || size */ /* ?assign@?$char_traits@G@std@@SAXAAGABG@Z */ /* ?assign@?$char_traits@G@std@@SAXAEAGAEBG@Z */ void CDECL MSVCP_char_traits_short_assign(unsigned short *ch, const unsigned short *assign) { *ch = *assign; } /* ?eq@?$char_traits@G@std@@SA_NABG0@Z */ /* ?eq@?$char_traits@G@std@@SA_NAEBG0@Z */ MSVCP_BOOL CDECL MSVCP_char_traits_short_eq(const unsigned short *ch1, const unsigned short *ch2) { return *ch1 == *ch2; } /* ?lt@?$char_traits@G@std@@SA_NABG0@Z */ /* ?lt@?$char_traits@G@std@@SA_NAEBG0@Z */ MSVCP_BOOL CDECL MSVCP_char_traits_short_lt(const unsigned short *ch1, const unsigned short *ch2) { return *ch1 < *ch2; } /* ?compare@?$char_traits@G@std@@SAHPBG0I@Z */ /* ?compare@?$char_traits@G@std@@SAHPEBG0_K@Z */ int CDECL MSVCP_char_traits_short_compare(const unsigned short *s1, const unsigned short *s2, size_t count) { size_t i; for(i=0; i, allocator> */ /* ?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2IB */ /* ?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2_KB */ const size_t MSVCP_basic_string_char_npos = -1; /* Internal: basic_string_char_ptr - return pointer to stored string */ static char* basic_string_char_ptr(basic_string_char *this) { if(this->res == BUF_SIZE_CHAR-1) return this->data.buf; return this->data.ptr; } /* Internal: basic_string_char_const_ptr - returns const pointer to stored string */ static const char* basic_string_char_const_ptr(const basic_string_char *this) { if(this->res == BUF_SIZE_CHAR-1) return this->data.buf; return this->data.ptr; } /* Internal: basic_string_char_eos - sets string length, puts '\0' on the end */ static void basic_string_char_eos(basic_string_char *this, size_t len) { static const char nullbyte = '\0'; this->size = len; MSVCP_char_traits_char_assign(basic_string_char_ptr(this)+len, &nullbyte); } /* Internal: basic_string_char_inside - checks if given pointer points inside stored string */ static MSVCP_BOOL basic_string_char_inside( basic_string_char *this, const char *ptr) { char *cstr = basic_string_char_ptr(this); return (ptr=cstr+this->size) ? FALSE : TRUE; } /* Internal: basic_string_char_tidy - initialize basic_string buffer, deallocates data */ /* Caution: new_size have to be smaller than BUF_SIZE_CHAR */ static void basic_string_char_tidy(basic_string_char *this, MSVCP_BOOL built, size_t new_size) { if(built && BUF_SIZE_CHAR<=this->res) { char *ptr = this->data.ptr; if(new_size > 0) MSVCP_char_traits_char__Copy_s(this->data.buf, BUF_SIZE_CHAR, ptr, new_size); MSVCP_allocator_char_deallocate(this->allocator, ptr, this->res+1); } this->res = BUF_SIZE_CHAR-1; basic_string_char_eos(this, new_size); } /* Internal: basic_string_char_grow - changes size of internal buffer */ static MSVCP_BOOL basic_string_char_grow( basic_string_char *this, size_t new_size, MSVCP_BOOL trim) { if(this->res < new_size) { size_t new_res = new_size; char *ptr; new_res |= 0xf; if(new_res/3 < this->res/2) new_res = this->res + this->res/2; ptr = MSVCP_allocator_char_allocate(this->allocator, new_res); if(!ptr) ptr = MSVCP_allocator_char_allocate(this->allocator, new_size+1); else new_size = new_res; if(!ptr) { ERR("Out of memory\n"); basic_string_char_tidy(this, TRUE, 0); return FALSE; } MSVCP_char_traits_char__Copy_s(ptr, new_size, basic_string_char_ptr(this), this->size); basic_string_char_tidy(this, TRUE, 0); this->data.ptr = ptr; this->res = new_size; basic_string_char_eos(this, this->size); } else if(trim && new_size < BUF_SIZE_CHAR) basic_string_char_tidy(this, TRUE, new_sizesize ? new_size : this->size); else if(new_size == 0) basic_string_char_eos(this, 0); return (new_size>0); } /* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@II@Z */ /* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_erase, 12) basic_string_char* __thiscall MSVCP_basic_string_char_erase( basic_string_char *this, size_t pos, size_t len) { TRACE("%p %lu %lu\n", this, (unsigned long)pos, (unsigned long)len); if(pos > this->size) { MSVCP__String_base_Xran(); return NULL; } if(len > this->size-pos) len = this->size-pos; if(len) { MSVCP_char_traits_char__Move_s(basic_string_char_ptr(this)+pos, this->res-pos, basic_string_char_ptr(this)+pos+len, this->size-pos-len); basic_string_char_eos(this, this->size-len); } return this; } /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@II@Z */ /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_substr, 16) basic_string_char* __thiscall MSVCP_basic_string_char_assign_substr( basic_string_char *this, const basic_string_char *assign, size_t pos, size_t len) { TRACE("%p %p %lu %lu\n", this, assign, (unsigned long)pos, (unsigned long)len); if(assign->size < pos) { MSVCP__String_base_Xran(); return NULL; } if(len > assign->size-pos) len = assign->size-pos; if(this == assign) { MSVCP_basic_string_char_erase(this, pos+len, MSVCP_basic_string_char_npos); MSVCP_basic_string_char_erase(this, 0, pos); } else if(basic_string_char_grow(this, len, FALSE)) { MSVCP_char_traits_char__Copy_s(basic_string_char_ptr(this), this->res, basic_string_char_const_ptr(assign)+pos, len); basic_string_char_eos(this, len); } return this; } /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@@Z */ /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@@Z */ /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@ABV01@@Z */ /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@AEBV01@@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign, 8) basic_string_char* __thiscall MSVCP_basic_string_char_assign( basic_string_char *this, const basic_string_char *assign) { return MSVCP_basic_string_char_assign_substr(this, assign, 0, MSVCP_basic_string_char_npos); } /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z */ /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_cstr_len, 12) basic_string_char* __thiscall MSVCP_basic_string_char_assign_cstr_len( basic_string_char *this, const char *str, size_t len) { TRACE("%p %s %lu\n", this, debugstr_a(str), (unsigned long)len); if(basic_string_char_inside(this, str)) return MSVCP_basic_string_char_assign_substr(this, this, str-basic_string_char_ptr(this), len); else if(basic_string_char_grow(this, len, FALSE)) { MSVCP_char_traits_char__Copy_s(basic_string_char_ptr(this), this->res, str, len); basic_string_char_eos(this, len); } return this; } /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD@Z */ /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD@Z */ /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z */ /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@PEBD@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_cstr, 8) basic_string_char* __thiscall MSVCP_basic_string_char_assign_cstr( basic_string_char *this, const char *str) { return MSVCP_basic_string_char_assign_cstr_len(this, str, MSVCP_char_traits_char_length(str)); } /* ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ */ /* ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEBDXZ */ /* ?data@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ */ /* ?data@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEBDXZ */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_c_str, 4) const char* __thiscall MSVCP_basic_string_char_c_str(basic_string_char *this) { TRACE("%p\n", this); return basic_string_char_const_ptr(this); } /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ */ /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor, 4) basic_string_char* __thiscall MSVCP_basic_string_char_ctor(basic_string_char *this) { TRACE("%p\n", this); basic_string_char_tidy(this, FALSE, 0); return this; } /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z */ /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV01@@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_copy_ctor, 8) basic_string_char* __thiscall MSVCP_basic_string_char_copy_ctor( basic_string_char *this, const basic_string_char *copy) { TRACE("%p %p\n", this, copy); basic_string_char_tidy(this, FALSE, 0); MSVCP_basic_string_char_assign(this, copy); return this; } /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z */ /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_cstr, 8) basic_string_char* __thiscall MSVCP_basic_string_char_ctor_cstr( basic_string_char *this, const char *str) { TRACE("%p %s\n", this, debugstr_a(str)); basic_string_char_tidy(this, FALSE, 0); MSVCP_basic_string_char_assign_cstr(this, str); return this; } /* ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ */ /* ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_dtor, 4) void __thiscall MSVCP_basic_string_char_dtor(basic_string_char *this) { TRACE("%p\n", this); basic_string_char_tidy(this, TRUE, 0); } /* ?size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ */ /* ?size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KXZ */ /* ?length@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ */ /* ?length@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KXZ */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_length, 4) size_t __thiscall MSVCP_basic_string_char_length(basic_string_char *this) { TRACE("%p\n", this); return this->size; } /* basic_string, allocator> */ /* ?npos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@2IB */ /* ?npos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@2_KB */ const size_t MSVCP_basic_string_wchar_npos = -1; /* Internal: basic_string_wchar_ptr - return pointer to stored string */ static wchar_t* basic_string_wchar_ptr(basic_string_wchar *this) { if(this->res == BUF_SIZE_WCHAR-1) return this->data.buf; return this->data.ptr; } /* Internal: basic_string_wchar_const_ptr - returns const pointer to stored string */ static const wchar_t* basic_string_wchar_const_ptr(const basic_string_wchar *this) { if(this->res == BUF_SIZE_WCHAR-1) return this->data.buf; return this->data.ptr; } /* Internal: basic_string_wchar_eos - sets string length, puts '\0' on the end */ static void basic_string_wchar_eos(basic_string_wchar *this, size_t len) { static const wchar_t nullbyte_w = '\0'; this->size = len; MSVCP_char_traits_wchar_assign(basic_string_wchar_ptr(this)+len, &nullbyte_w); } /* Internal: basic_string_char_inside - checks if given pointer points inside stored string */ static MSVCP_BOOL basic_string_wchar_inside( basic_string_wchar *this, const wchar_t *ptr) { wchar_t *cstr = basic_string_wchar_ptr(this); return (ptr=cstr+this->size) ? FALSE : TRUE; } /* Internal: basic_string_char_tidy - initialize basic_string buffer, deallocates data */ /* Caution: new_size have to be smaller than BUF_SIZE_WCHAR */ static void basic_string_wchar_tidy(basic_string_wchar *this, MSVCP_BOOL built, size_t new_size) { if(built && BUF_SIZE_WCHAR<=this->res) { wchar_t *ptr = this->data.ptr; if(new_size > 0) MSVCP_char_traits_wchar__Copy_s(this->data.buf, BUF_SIZE_WCHAR, ptr, new_size); MSVCP_allocator_wchar_deallocate(this->allocator, ptr, this->res+1); } this->res = BUF_SIZE_WCHAR-1; basic_string_wchar_eos(this, new_size); } /* Internal: basic_string_wchar_grow - changes size of internal buffer */ static MSVCP_BOOL basic_string_wchar_grow( basic_string_wchar *this, size_t new_size, MSVCP_BOOL trim) { if(this->res < new_size) { size_t new_res = new_size; wchar_t *ptr; new_res |= 0xf; if(new_res/3 < this->res/2) new_res = this->res + this->res/2; ptr = MSVCP_allocator_wchar_allocate(this->allocator, new_res); if(!ptr) ptr = MSVCP_allocator_wchar_allocate(this->allocator, new_size+1); else new_size = new_res; if(!ptr) { ERR("Out of memory\n"); basic_string_wchar_tidy(this, TRUE, 0); return FALSE; } MSVCP_char_traits_wchar__Copy_s(ptr, new_size, basic_string_wchar_ptr(this), this->size); basic_string_wchar_tidy(this, TRUE, 0); this->data.ptr = ptr; this->res = new_size; basic_string_wchar_eos(this, this->size); } else if(trim && new_size < BUF_SIZE_WCHAR) basic_string_wchar_tidy(this, TRUE, new_sizesize ? new_size : this->size); else if(new_size == 0) basic_string_wchar_eos(this, 0); return (new_size>0); } /* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@II@Z */ /* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_erase, 12) basic_string_wchar* __thiscall MSVCP_basic_string_wchar_erase( basic_string_wchar *this, size_t pos, size_t len) { TRACE("%p %lu %lu\n", this, (unsigned long)pos, (unsigned long)len); if(pos > this->size) { MSVCP__String_base_Xran(); return NULL; } if(len > this->size-pos) len = this->size-pos; if(len) { MSVCP_char_traits_wchar__Move_s(basic_string_wchar_ptr(this)+pos, this->res-pos, basic_string_wchar_ptr(this)+pos+len, this->size-pos-len); basic_string_wchar_eos(this, this->size-len); } return this; } /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@II@Z */ /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_substr, 16) basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_substr( basic_string_wchar *this, const basic_string_wchar *assign, size_t pos, size_t len) { TRACE("%p %p %lu %lu\n", this, assign, (unsigned long)pos, (unsigned long)len); if(assign->size < pos) { MSVCP__String_base_Xran(); return NULL; } if(len > assign->size-pos) len = assign->size-pos; if(this == assign) { MSVCP_basic_string_wchar_erase(this, pos+len, MSVCP_basic_string_wchar_npos); MSVCP_basic_string_wchar_erase(this, 0, pos); } else if(basic_string_wchar_grow(this, len, FALSE)) { MSVCP_char_traits_wchar__Copy_s(basic_string_wchar_ptr(this), this->res, basic_string_wchar_const_ptr(assign)+pos, len); basic_string_wchar_eos(this, len); } return this; } /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@@Z */ /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@AEBV12@@Z */ /* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@ABV01@@Z */ /* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@AEBV01@@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign, 8) basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign( basic_string_wchar *this, const basic_string_wchar *assign) { return MSVCP_basic_string_wchar_assign_substr(this, assign, 0, MSVCP_basic_string_wchar_npos); } /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_WI@Z */ /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W_K@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_cstr_len, 12) basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_cstr_len( basic_string_wchar *this, const wchar_t *str, size_t len) { TRACE("%p %s %lu\n", this, debugstr_w(str), (unsigned long)len); if(basic_string_wchar_inside(this, str)) return MSVCP_basic_string_wchar_assign_substr(this, this, str-basic_string_wchar_ptr(this), len); else if(basic_string_wchar_grow(this, len, FALSE)) { MSVCP_char_traits_wchar__Copy_s(basic_string_wchar_ptr(this), this->res, str, len); basic_string_wchar_eos(this, len); } return this; } /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_W@Z */ /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_cstr, 8) basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_cstr( basic_string_wchar *this, const wchar_t *str) { return MSVCP_basic_string_wchar_assign_cstr_len(this, str, MSVCP_char_traits_wchar_length(str)); } /* ?c_str@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPB_WXZ */ /* ?c_str@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEB_WXZ */ /* ?data@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPB_WXZ */ /* ?data@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEB_WXZ */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_c_str, 4) const wchar_t* __thiscall MSVCP_basic_string_wchar_c_str(basic_string_wchar *this) { TRACE("%p\n", this); return basic_string_wchar_const_ptr(this); } /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ */ /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@XZ */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor, 4) basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor(basic_string_wchar *this) { TRACE("%p\n", this); basic_string_wchar_tidy(this, FALSE, 0); return this; } /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV01@@Z */ /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV01@@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_copy_ctor, 8) basic_string_wchar* __thiscall MSVCP_basic_string_wchar_copy_ctor( basic_string_wchar *this, const basic_string_wchar *copy) { TRACE("%p %p\n", this, copy); basic_string_wchar_tidy(this, FALSE, 0); MSVCP_basic_string_wchar_assign(this, copy); return this; } /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_W@Z */ /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_W@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_cstr, 8) basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_cstr( basic_string_wchar *this, const wchar_t *str) { TRACE("%p %s\n", this, debugstr_w(str)); basic_string_wchar_tidy(this, FALSE, 0); MSVCP_basic_string_wchar_assign_cstr(this, str); return this; } /* ??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ */ /* ??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@XZ */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_dtor, 4) void __thiscall MSVCP_basic_string_wchar_dtor(basic_string_wchar *this) { TRACE("%p\n", this); basic_string_wchar_tidy(this, TRUE, 0); } /* ?size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ */ /* ?size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ */ /* ?length@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ */ /* ?length@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_length, 4) size_t __thiscall MSVCP_basic_string_wchar_length(basic_string_wchar *this) { TRACE("%p\n", this); return this->size; }