Piotr Caban : msvcp90: Added basic_string<char> constructor ( with no arguments) implementation.
Alexandre Julliard
julliard at winehq.org
Thu Aug 19 11:44:09 CDT 2010
Module: wine
Branch: master
Commit: 6c57f13a6b16ee220cb02087c7527d9edba607c3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6c57f13a6b16ee220cb02087c7527d9edba607c3
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Aug 19 12:17:11 2010 +0200
msvcp90: Added basic_string<char> constructor (with no arguments) implementation.
---
dlls/msvcp90/msvcp90.h | 15 +++++++++++++
dlls/msvcp90/msvcp90.spec | 4 +-
dlls/msvcp90/string.c | 49 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 66 insertions(+), 2 deletions(-)
diff --git a/dlls/msvcp90/msvcp90.h b/dlls/msvcp90/msvcp90.h
index 8d588ef..89d549b 100644
--- a/dlls/msvcp90/msvcp90.h
+++ b/dlls/msvcp90/msvcp90.h
@@ -109,3 +109,18 @@ typedef struct _rtti_object_locator
const type_info *type_descriptor;
const rtti_object_hierarchy *type_hierarchy;
} rtti_object_locator;
+
+/* basic_string<char, char_traits<char>, allocator<char>> */
+#define BUF_SIZE_CHAR 16
+typedef struct _basic_string_char
+{
+ void *allocator;
+ union _data {
+ char buf[BUF_SIZE_CHAR];
+ char *ptr;
+ } data;
+ size_t size;
+ size_t res;
+} basic_string_char;
+
+void __stdcall MSVCP_allocator_char_deallocate(void*, char*, size_t);
diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec
index 0542b63..2d6b312 100644
--- a/dlls/msvcp90/msvcp90.spec
+++ b/dlls/msvcp90/msvcp90.spec
@@ -753,10 +753,10 @@
@ stub -arch=win32 ??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at PBDI@Z
@ stub -arch=win64 ??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEAA at V?$_String_const_iterator at DU?$char_traits at D@std@@V?$allocator at D@2@@1 at 0@Z
@ stub -arch=win32 ??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at PBDIABV?$allocator at D@1@@Z
-@ stub -arch=win64 ??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEAA at XZ
+@ cdecl -arch=win64 ??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEAA at XZ(ptr) MSVCP_basic_string_char_ctor
@ stub -arch=win32 ??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at V?$_String_const_iterator at DU?$char_traits at D@std@@V?$allocator at D@2@@1 at 0@Z
@ stub -arch=win64 ??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEAA at _KD@Z
-@ stub -arch=win32 ??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at XZ
+@ cdecl -arch=win32 -i386 -norelay ??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at XZ() __thiscall_MSVCP_basic_string_char_ctor
@ stub -arch=win64 ??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEAA at _KDAEBV?$allocator at D@1@@Z
@ stub -arch=win32 ??0?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QAE at ABV01@@Z
@ stub -arch=win64 ??0?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEAA at AEBV01@@Z
diff --git a/dlls/msvcp90/string.c b/dlls/msvcp90/string.c
index 8b7c320..ddf8f88 100644
--- a/dlls/msvcp90/string.c
+++ b/dlls/msvcp90/string.c
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "config.h"
+
#include <stdarg.h>
#include "msvcp90.h"
@@ -462,3 +464,50 @@ unsigned short CDECL MSVCP_char_traits_short_not_eof(const unsigned short *in)
{
return (*in==(unsigned short)-1 ? 0 : *in);
}
+
+
+/* basic_string<char, char_traits<char>, allocator<char>> */
+/* 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 at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at XZ */
+/* ??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEAA at 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;
+}
More information about the wine-cvs
mailing list