/* * 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> */ /* 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_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_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, int 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); } /* ??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* __stdcall MSVCP_basic_string_char_ctor(basic_string_char *this) { TRACE("%p\n", this); basic_string_char_tidy(this, FALSE, 0); return this; }