msvcp90: Added basic_string<char> constructor (with no arguments) implementation.

This commit is contained in:
Piotr Caban 2010-08-19 12:17:11 +02:00 committed by Alexandre Julliard
parent 99a6926f3e
commit 6c57f13a6b
3 changed files with 66 additions and 2 deletions

View File

@ -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);

View File

@ -753,10 +753,10 @@
@ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDI@Z
@ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@1@0@Z
@ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDIABV?$allocator@D@1@@Z
@ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ
@ cdecl -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ(ptr) MSVCP_basic_string_char_ctor
@ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@1@0@Z
@ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@_KD@Z
@ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ
@ cdecl -arch=win32 -i386 -norelay ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ() __thiscall_MSVCP_basic_string_char_ctor
@ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@_KDAEBV?$allocator@D@1@@Z
@ stub -arch=win32 ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV01@@Z
@ stub -arch=win64 ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV01@@Z

View File

@ -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@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;
}