wined3d: wined3d_device_get_transform() never fails.
[wine] / dlls / msvcp100 / string.c
1 /*
2  * Copyright 2010 Piotr Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include "config.h"
20
21 #include <stdarg.h>
22
23 #include "msvcp.h"
24 #include "stdio.h"
25 #include "assert.h"
26
27 #include "windef.h"
28 #include "winbase.h"
29 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(msvcp);
31
32 /* _String_iterator<char> and _String_const_iterator<char> class */
33 typedef struct {
34     basic_string_char *bstr;
35     const char *pos;
36 } String_iterator_char;
37 typedef String_iterator_char String_reverse_iterator_char;
38
39 typedef struct {
40     basic_string_wchar *bstr;
41     const wchar_t *pos;
42 } String_iterator_wchar;
43 typedef String_iterator_wchar String_reverse_iterator_wchar;
44
45 /* size_t_noverify structure */
46 typedef struct {
47     MSVCP_size_t val;
48 } size_t_noverify;
49
50 /* allocator class */
51 typedef struct {
52     char empty_struct;
53 } allocator;
54
55 /* char_traits<char> */
56 /* ?assign@?$char_traits@D@std@@SAXAADABD@Z */
57 /* ?assign@?$char_traits@D@std@@SAXAEADAEBD@Z */
58 static void CDECL MSVCP_char_traits_char_assign(char *ch, const char *assign)
59 {
60     *ch = *assign;
61 }
62
63 /* ?compare@?$char_traits@D@std@@SAHPBD0I@Z */
64 /* ?compare@?$char_traits@D@std@@SAHPEBD0_K@Z */
65 static int CDECL MSVCP_char_traits_char_compare(
66         const char *s1, const char *s2, MSVCP_size_t count)
67 {
68     int ret = memcmp(s1, s2, count);
69     return (ret>0 ? 1 : (ret<0 ? -1 : 0));
70 }
71
72 /* ?length@?$char_traits@D@std@@SAIPBD@Z */
73 /* ?length@?$char_traits@D@std@@SA_KPEBD@Z */
74 static MSVCP_size_t CDECL MSVCP_char_traits_char_length(const char *str)
75 {
76     return strlen(str);
77 }
78
79 /* ?_Copy_s@?$char_traits@D@std@@SAPADPADIPBDI@Z */
80 /* ?_Copy_s@?$char_traits@D@std@@SAPEADPEAD_KPEBD1@Z */
81 static char* CDECL MSVCP_char_traits_char__Copy_s(char *dest,
82         MSVCP_size_t size, const char *src, MSVCP_size_t count)
83 {
84     if(!dest || !src || size<count) {
85         if(dest && size)
86             dest[0] = '\0';
87         _invalid_parameter(NULL, NULL, NULL, 0, 0);
88         return dest;
89     }
90
91     return memcpy(dest, src, count);
92 }
93
94 /* ?find@?$char_traits@D@std@@SAPBDPBDIABD@Z */
95 /* ?find@?$char_traits@D@std@@SAPEBDPEBD_KAEBD@Z */
96 static const char * CDECL MSVCP_char_traits_char_find(
97         const char *str, MSVCP_size_t range, const char *c)
98 {
99     return memchr(str, *c, range);
100 }
101
102 /* ?_Move_s@?$char_traits@D@std@@SAPADPADIPBDI@Z */
103 /* ?_Move_s@?$char_traits@D@std@@SAPEADPEAD_KPEBD1@Z */
104 static char* CDECL MSVCP_char_traits_char__Move_s(char *dest,
105         MSVCP_size_t size, const char *src, MSVCP_size_t count)
106 {
107     if(!dest || !src || size<count) {
108         if(dest && size)
109             dest[0] = '\0';
110         _invalid_parameter(NULL, NULL, NULL, 0, 0);
111         return dest;
112     }
113
114     return memmove(dest, src, count);
115 }
116
117 /* ?assign@?$char_traits@D@std@@SAPADPADID@Z */
118 /* ?assign@?$char_traits@D@std@@SAPEADPEAD_KD@Z */
119 static char* CDECL MSVCP_char_traits_char_assignn(char *str, MSVCP_size_t num, char c)
120 {
121     return memset(str, c, num);
122 }
123
124
125 /* char_traits<wchar_t> */
126 /* ?assign@?$char_traits@_W@std@@SAXAA_WAB_W@Z */
127 /* ?assign@?$char_traits@_W@std@@SAXAEA_WAEB_W@Z */
128 static void CDECL MSVCP_char_traits_wchar_assign(wchar_t *ch,
129         const wchar_t *assign)
130 {
131     *ch = *assign;
132 }
133
134 /* ?compare@?$char_traits@_W@std@@SAHPB_W0I@Z */
135 /* ?compare@?$char_traits@_W@std@@SAHPEB_W0_K@Z */
136 static int CDECL MSVCP_char_traits_wchar_compare(const wchar_t *s1,
137         const wchar_t *s2, MSVCP_size_t count)
138 {
139     int ret = memcmp(s1, s2, count * sizeof(wchar_t));
140     return (ret>0 ? 1 : (ret<0 ? -1 : 0));
141 }
142
143 /* ?length@?$char_traits@_W@std@@SAIPB_W@Z */
144 /* ?length@?$char_traits@_W@std@@SA_KPEB_W@Z */
145 static MSVCP_size_t CDECL MSVCP_char_traits_wchar_length(const wchar_t *str)
146 {
147     return wcslen((WCHAR*)str);
148 }
149
150 /* ?_Copy_s@?$char_traits@_W@std@@SAPA_WPA_WIPB_WI@Z */
151 /* ?_Copy_s@?$char_traits@_W@std@@SAPEA_WPEA_W_KPEB_W1@Z */
152 static wchar_t* CDECL MSVCP_char_traits_wchar__Copy_s(wchar_t *dest,
153         MSVCP_size_t size, const wchar_t *src, MSVCP_size_t count)
154 {
155     if(!dest || !src || size<count) {
156         if(dest && size)
157             dest[0] = '\0';
158         _invalid_parameter(NULL, NULL, NULL, 0, 0);
159         return dest;
160     }
161
162     return memcpy(dest, src, count * sizeof(wchar_t));
163 }
164
165 /* ?find@?$char_traits@_W@std@@SAPB_WPB_WIAB_W@Z */
166 /* ?find@?$char_traits@_W@std@@SAPEB_WPEB_W_KAEB_W@Z */
167 static const wchar_t* CDECL MSVCP_char_traits_wchar_find(
168         const wchar_t *str, MSVCP_size_t range, const wchar_t *c)
169 {
170     MSVCP_size_t i=0;
171
172     for(i=0; i<range; i++)
173         if(str[i] == *c)
174             return str+i;
175
176     return NULL;
177 }
178
179 /* ?_Move_s@?$char_traits@_W@std@@SAPA_WPA_WIPB_WI@Z */
180 /* ?_Move_s@?$char_traits@_W@std@@SAPEA_WPEA_W_KPEB_W1@Z */
181 static wchar_t* CDECL MSVCP_char_traits_wchar__Move_s(wchar_t *dest,
182         MSVCP_size_t size, const wchar_t *src, MSVCP_size_t count)
183 {
184     if(!dest || !src || size<count) {
185         if(dest && size)
186             dest[0] = '\0';
187         _invalid_parameter(NULL, NULL, NULL, 0, 0);
188         return dest;
189     }
190
191     return memmove(dest, src, count * sizeof(WCHAR));
192 }
193
194 /* ?assign@?$char_traits@_W@std@@SAPA_WPA_WI_W@Z */
195 /* ?assign@?$char_traits@_W@std@@SAPEA_WPEA_W_K_W@Z */
196 static wchar_t* CDECL MSVCP_char_traits_wchar_assignn(wchar_t *str,
197         MSVCP_size_t num, wchar_t c)
198 {
199     MSVCP_size_t i;
200
201     for(i=0; i<num; i++)
202         str[i] = c;
203
204     return str;
205 }
206
207
208 /* _String_base */
209 /* ?_Xlen@_String_base@std@@SAXXZ */
210 static void  CDECL MSVCP__String_base_Xlen(void)
211 {
212     static const char msg[] = "string too long";
213
214     TRACE("\n");
215     throw_exception(EXCEPTION_LENGTH_ERROR, msg);
216 }
217
218 /* ?_Xran@_String_base@std@@SAXXZ */
219 static void CDECL MSVCP__String_base_Xran(void)
220 {
221     static const char msg[] = "invalid string position";
222
223     TRACE("\n");
224     throw_exception(EXCEPTION_OUT_OF_RANGE, msg);
225 }
226
227
228 /* basic_string<char, char_traits<char>, allocator<char>> */
229 /* ?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2IB */
230 /* ?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2_KB */
231 static const MSVCP_size_t MSVCP_basic_string_char_npos = -1;
232
233 /* ?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEPADXZ */
234 /* ?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAPEADXZ */
235 DEFINE_THISCALL_WRAPPER(basic_string_char_ptr, 4)
236 char* __thiscall basic_string_char_ptr(basic_string_char *this)
237 {
238     if(this->res == BUF_SIZE_CHAR-1)
239         return this->data.buf;
240     return this->data.ptr;
241 }
242
243 /* ?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IBEPBDXZ */
244 /* ?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEBAPEBDXZ */
245 DEFINE_THISCALL_WRAPPER(basic_string_char_const_ptr, 4)
246 const char* __thiscall basic_string_char_const_ptr(const basic_string_char *this)
247 {
248     if(this->res == BUF_SIZE_CHAR-1)
249         return this->data.buf;
250     return this->data.ptr;
251 }
252
253 /* ?_Eos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEXI@Z */
254 /* ?_Eos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAX_K@Z */
255 DEFINE_THISCALL_WRAPPER(basic_string_char_eos, 8)
256 void __thiscall basic_string_char_eos(basic_string_char *this, MSVCP_size_t len)
257 {
258     static const char nullbyte = '\0';
259
260     this->size = len;
261     MSVCP_char_traits_char_assign(basic_string_char_ptr(this)+len, &nullbyte);
262 }
263
264 /* ?_Inside@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAE_NPBD@Z */
265 /* ?_Inside@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAA_NPEBD@Z */
266 DEFINE_THISCALL_WRAPPER(basic_string_char_inside, 8)
267 MSVCP_bool __thiscall basic_string_char_inside(
268         basic_string_char *this, const char *ptr)
269 {
270     char *cstr = basic_string_char_ptr(this);
271
272     return (ptr<cstr || ptr>=cstr+this->size) ? FALSE : TRUE;
273 }
274
275 /* ?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEX_NI@Z */
276 /* ?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAX_N_K@Z */
277 DEFINE_THISCALL_WRAPPER(basic_string_char_tidy, 12)
278 void __thiscall basic_string_char_tidy(basic_string_char *this,
279         MSVCP_bool built, MSVCP_size_t new_size)
280 {
281     if(built && BUF_SIZE_CHAR<=this->res) {
282         char *ptr = this->data.ptr;
283
284         if(new_size > 0)
285             MSVCP_char_traits_char__Copy_s(this->data.buf, BUF_SIZE_CHAR, ptr, new_size);
286         MSVCP_allocator_char_deallocate(this->allocator, ptr, this->res+1);
287     }
288
289     this->res = BUF_SIZE_CHAR-1;
290     basic_string_char_eos(this, new_size);
291 }
292
293 /* Exported only from msvcp60/70 */
294 /* ?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAEX_N@Z */
295 /* ?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAX_N@Z */
296 DEFINE_THISCALL_WRAPPER(basic_string_char_tidy_built, 8)
297 void __thiscall basic_string_char_tidy_built(basic_string_char *this, MSVCP_bool built)
298 {
299     basic_string_char_tidy(this, built, 0);
300 }
301
302 /* ?_Grow@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAE_NI_N@Z */
303 /* ?_Grow@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAA_N_K_N@Z */
304 DEFINE_THISCALL_WRAPPER(basic_string_char_grow, 12)
305 MSVCP_bool __thiscall basic_string_char_grow(
306         basic_string_char *this, MSVCP_size_t new_size, MSVCP_bool trim)
307 {
308     if(this->res < new_size) {
309         MSVCP_size_t new_res = new_size, len = this->size;
310         char *ptr;
311
312         new_res |= 0xf;
313
314         if(new_res/3 < this->res/2)
315             new_res = this->res + this->res/2;
316
317         ptr = MSVCP_allocator_char_allocate(this->allocator, new_res+1);
318         if(!ptr)
319             ptr = MSVCP_allocator_char_allocate(this->allocator, new_size+1);
320         else
321             new_size = new_res;
322         if(!ptr) {
323             ERR("Out of memory\n");
324             basic_string_char_tidy(this, TRUE, 0);
325             return FALSE;
326         }
327
328         MSVCP_char_traits_char__Copy_s(ptr, new_size,
329                 basic_string_char_ptr(this), this->size);
330         basic_string_char_tidy(this, TRUE, 0);
331         this->data.ptr = ptr;
332         this->res = new_size;
333         basic_string_char_eos(this, len);
334     } else if(trim && new_size < BUF_SIZE_CHAR)
335         basic_string_char_tidy(this, TRUE,
336                 new_size<this->size ? new_size : this->size);
337     else if(new_size == 0)
338         basic_string_char_eos(this, 0);
339
340     return (new_size>0);
341 }
342
343 /* ?_Copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEXII@Z */
344 /* ?_Copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAX_K0@Z */
345 DEFINE_THISCALL_WRAPPER(basic_string_char__Copy, 12)
346 void __thiscall basic_string_char__Copy(basic_string_char *this,
347         MSVCP_size_t new_size, MSVCP_size_t copy_len)
348 {
349     TRACE("%p %lu %lu\n", this, new_size, copy_len);
350
351     if(!basic_string_char_grow(this, new_size, FALSE))
352         return;
353     basic_string_char_eos(this, copy_len);
354 }
355
356 /* ?_Pdif@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KAIV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
357 /* ?_Pdif@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KA_KV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
358 static MSVCP_size_t __cdecl MSVCP_basic_string_char_Pdif(String_iterator_char i1, String_iterator_char i2)
359 {
360     TRACE("(%p %p) (%p %p)\n", i1.bstr, i1.pos, i2.bstr, i2.pos);
361
362     if((!i1.bstr && i1.pos) || i1.bstr!=i2.bstr) {
363         _invalid_parameter(NULL, NULL, NULL, 0, 0);
364         return 0;
365     }
366
367     return !i1.pos ? 0 : i1.pos-i2.pos;
368 }
369
370 /* ?get_allocator@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$allocator@D@2@XZ */
371 /* ?get_allocator@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$allocator@D@2@XZ */
372 DEFINE_THISCALL_WRAPPER(basic_string_char_get_allocator, 8)
373 allocator* __thiscall basic_string_char_get_allocator(const basic_string_char *this, allocator *ret)
374 {
375     TRACE("%p\n", this);
376     return ret;
377 }
378
379 /* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@II@Z */
380 /* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0@Z */
381 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_erase, 12)
382 basic_string_char* __thiscall MSVCP_basic_string_char_erase(
383         basic_string_char *this, MSVCP_size_t pos, MSVCP_size_t len)
384 {
385     TRACE("%p %lu %lu\n", this, pos, len);
386
387     if(pos > this->size)
388         MSVCP__String_base_Xran();
389
390     if(len > this->size-pos)
391         len = this->size-pos;
392
393     if(len) {
394         MSVCP_char_traits_char__Move_s(basic_string_char_ptr(this)+pos,
395                 this->res-pos, basic_string_char_ptr(this)+pos+len,
396                 this->size-pos-len);
397         basic_string_char_eos(this, this->size-len);
398     }
399
400     return this;
401 }
402
403 /* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
404 /* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
405 DEFINE_THISCALL_WRAPPER(basic_string_char_erase_iter_range, 24)
406 String_iterator_char* __thiscall basic_string_char_erase_iter_range(basic_string_char *this,
407         String_iterator_char *ret, String_iterator_char beg, String_iterator_char end)
408 {
409     MSVCP_size_t off;
410
411     ret->bstr = this;
412     ret->pos = basic_string_char_ptr(this);
413     off = MSVCP_basic_string_char_Pdif(beg, *ret);
414
415     MSVCP_basic_string_char_erase(this, off, MSVCP_basic_string_char_Pdif(end, beg));
416
417     ret->bstr = this;
418     ret->pos = basic_string_char_ptr(this)+off;
419     return ret;
420 }
421
422 /* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
423 /* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
424 DEFINE_THISCALL_WRAPPER(basic_string_char_erase_iter, 16)
425 String_iterator_char* __thiscall basic_string_char_erase_iter(basic_string_char *this,
426         String_iterator_char *ret, String_iterator_char pos)
427 {
428     MSVCP_size_t off;
429
430     ret->bstr = this;
431     ret->pos = basic_string_char_ptr(this);
432     off = MSVCP_basic_string_char_Pdif(pos, *ret);
433
434     MSVCP_basic_string_char_erase(this, off, 1);
435
436     ret->bstr = this;
437     ret->pos = basic_string_char_ptr(this)+off;
438     return ret;
439 }
440
441 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@II@Z */
442 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
443 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_substr, 16)
444 basic_string_char* __thiscall MSVCP_basic_string_char_assign_substr(
445         basic_string_char *this, const basic_string_char *assign,
446         MSVCP_size_t pos, MSVCP_size_t len)
447 {
448     TRACE("%p %p %lu %lu\n", this, assign, pos, len);
449
450     if(assign->size < pos)
451         MSVCP__String_base_Xran();
452
453     if(len > assign->size-pos)
454         len = assign->size-pos;
455
456     if(this == assign) {
457         MSVCP_basic_string_char_erase(this, pos+len, MSVCP_basic_string_char_npos);
458         MSVCP_basic_string_char_erase(this, 0, pos);
459     } else if(basic_string_char_grow(this, len, FALSE)) {
460         MSVCP_char_traits_char__Copy_s(basic_string_char_ptr(this),
461                 this->res, basic_string_char_const_ptr(assign)+pos, len);
462         basic_string_char_eos(this, len);
463     }
464
465     return this;
466 }
467
468 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@@Z */
469 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@@Z */
470 /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@ABV01@@Z */
471 /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@AEBV01@@Z */
472 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign, 8)
473 basic_string_char* __thiscall MSVCP_basic_string_char_assign(
474         basic_string_char *this, const basic_string_char *assign)
475 {
476     return MSVCP_basic_string_char_assign_substr(this, assign,
477             0, MSVCP_basic_string_char_npos);
478 }
479
480 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z */
481 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z */
482 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_cstr_len, 12)
483 basic_string_char* __thiscall MSVCP_basic_string_char_assign_cstr_len(
484         basic_string_char *this, const char *str, MSVCP_size_t len)
485 {
486     TRACE("%p %s %lu\n", this, debugstr_a(str), len);
487
488     if(basic_string_char_inside(this, str))
489         return MSVCP_basic_string_char_assign_substr(this, this,
490                 str-basic_string_char_ptr(this), len);
491     else if(basic_string_char_grow(this, len, FALSE)) {
492         MSVCP_char_traits_char__Copy_s(basic_string_char_ptr(this),
493                 this->res, str, len);
494         basic_string_char_eos(this, len);
495     }
496
497     return this;
498 }
499
500 /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@D@Z */
501 /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@D@Z */
502 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_ch, 8)
503 basic_string_char* __thiscall MSVCP_basic_string_char_assign_ch(
504         basic_string_char *this, char ch)
505 {
506     return MSVCP_basic_string_char_assign_cstr_len(this, &ch, 1);
507 }
508
509 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD@Z */
510 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD@Z */
511 /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z */
512 /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@PEBD@Z */
513 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_cstr, 8)
514 basic_string_char* __thiscall MSVCP_basic_string_char_assign_cstr(
515         basic_string_char *this, const char *str)
516 {
517     return MSVCP_basic_string_char_assign_cstr_len(this, str,
518             MSVCP_char_traits_char_length(str));
519 }
520
521 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ID@Z */
522 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z */
523 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assignn, 12)
524 basic_string_char* __thiscall MSVCP_basic_string_char_assignn(
525         basic_string_char *this, MSVCP_size_t count, char ch)
526 {
527     TRACE("%p %ld %c\n", this, count, ch);
528
529     basic_string_char_grow(this, count, FALSE);
530     MSVCP_char_traits_char_assignn(basic_string_char_ptr(this), count, ch);
531     basic_string_char_eos(this, count);
532     return this;
533 }
534
535 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD0@Z */
536 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD0@Z */
537 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_ptr_ptr, 12)
538 basic_string_char* __thiscall MSVCP_basic_string_char_assign_ptr_ptr(
539         basic_string_char *this, const char *first, const char *last)
540 {
541     return MSVCP_basic_string_char_assign_cstr_len(this, first, last-first);
542 }
543
544 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
545 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
546 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_iter, 20)
547 basic_string_char* __thiscall MSVCP_basic_string_char_assign_iter(basic_string_char *this,
548         String_iterator_char beg, String_iterator_char end)
549 {
550     return MSVCP_basic_string_char_assign_ptr_ptr(this, beg.pos, end.pos);
551 }
552
553 /* ?_Chassign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEXIID@Z */
554 /* ?_Chassign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAX_K0D@Z */
555 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_Chassign, 16)
556 void __thiscall MSVCP_basic_string_char_Chassign(basic_string_char *this,
557         MSVCP_size_t off, MSVCP_size_t count, char ch)
558 {
559     TRACE("%p %lu %lu %c\n", this, off, count, ch);
560     MSVCP_char_traits_char_assignn(basic_string_char_ptr(this)+off, count, ch);
561 }
562
563 /* ?_Copy_s@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPADIII@Z */
564 /* ?_Copy_s@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEAD_K11@Z */
565 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_Copy_s, 20)
566 MSVCP_size_t __thiscall MSVCP_basic_string_char_Copy_s(const basic_string_char *this,
567         char *dest, MSVCP_size_t size, MSVCP_size_t count, MSVCP_size_t off)
568 {
569     TRACE("%p %p %lu %lu %lu\n", this, dest, size, count, off);
570
571     if(this->size < off)
572         MSVCP__String_base_Xran();
573
574     if(count > this->size-off)
575         count = this->size-off;
576
577     MSVCP_char_traits_char__Copy_s(dest, size,
578             basic_string_char_const_ptr(this)+off, count);
579     return count;
580 }
581
582 /* ?copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPADII@Z */
583 /* ?copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEAD_K1@Z */
584 DEFINE_THISCALL_WRAPPER(basic_string_char_copy, 16)
585 MSVCP_size_t __thiscall basic_string_char_copy(const basic_string_char *this,
586         char *dest, MSVCP_size_t count, MSVCP_size_t off)
587 {
588     return MSVCP_basic_string_char_Copy_s(this, dest, count, count, off);
589 }
590
591 /* ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ */
592 /* ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEBDXZ */
593 /* ?data@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ */
594 /* ?data@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEBDXZ */
595 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_c_str, 4)
596 const char* __thiscall MSVCP_basic_string_char_c_str(const basic_string_char *this)
597 {
598     TRACE("%p\n", this);
599     return basic_string_char_const_ptr(this);
600 }
601
602 /* ?capacity@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ */
603 /* ?capacity@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KXZ */
604 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_capacity, 4)
605 MSVCP_size_t __thiscall MSVCP_basic_string_char_capacity(basic_string_char *this)
606 {
607     TRACE("%p\n", this);
608     return this->res;
609 }
610
611 /* ?reserve@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXI@Z */
612 /* ?reserve@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAX_K@Z */
613 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_reserve, 8)
614 void __thiscall MSVCP_basic_string_char_reserve(basic_string_char *this, MSVCP_size_t size)
615 {
616     MSVCP_size_t len;
617
618     TRACE("%p %ld\n", this, size);
619
620     len = this->size;
621     if(len > size)
622         return;
623
624     basic_string_char_grow(this, size, FALSE);
625     basic_string_char_eos(this, len);
626 }
627
628 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ */
629 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ */
630 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor, 4)
631 basic_string_char* __thiscall MSVCP_basic_string_char_ctor(basic_string_char *this)
632 {
633     TRACE("%p\n", this);
634
635     basic_string_char_tidy(this, FALSE, 0);
636     return this;
637 }
638
639 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z */
640 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV01@@Z */
641 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_copy_ctor, 8)
642 basic_string_char* __thiscall MSVCP_basic_string_char_copy_ctor(
643     basic_string_char *this, const basic_string_char *copy)
644 {
645     TRACE("%p %p\n", this, copy);
646
647     basic_string_char_tidy(this, FALSE, 0);
648     MSVCP_basic_string_char_assign(this, copy);
649     return this;
650 }
651
652 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z */
653 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD@Z */
654 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_cstr, 8)
655 basic_string_char* __thiscall MSVCP_basic_string_char_ctor_cstr(
656         basic_string_char *this, const char *str)
657 {
658     TRACE("%p %s\n", this, debugstr_a(str));
659
660     basic_string_char_tidy(this, FALSE, 0);
661     MSVCP_basic_string_char_assign_cstr(this, str);
662     return this;
663 }
664
665 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDABV?$allocator@D@1@@Z */
666 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBDAEBV?$allocator@D@1@@Z */
667 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_cstr_alloc, 12)
668 basic_string_char* __thiscall MSVCP_basic_string_char_ctor_cstr_alloc(
669         basic_string_char *this, const char *str, const void *alloc)
670 {
671     return MSVCP_basic_string_char_ctor_cstr(this, str);
672 }
673
674 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDI@Z */
675 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD_K@Z */
676 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_cstr_len, 12)
677 basic_string_char* __thiscall MSVCP_basic_string_char_ctor_cstr_len(
678         basic_string_char *this, const char *str, MSVCP_size_t len)
679 {
680     TRACE("%p %s %ld\n", this, debugstr_a(str), len);
681
682     basic_string_char_tidy(this, FALSE, 0);
683     MSVCP_basic_string_char_assign_cstr_len(this, str, len);
684     return this;
685 }
686
687 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDIABV?$allocator@D@1@@Z */
688 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD_KAEBV?$allocator@D@1@@Z */
689 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_cstr_len_alloc, 16)
690 basic_string_char* __thiscall MSVCP_basic_string_char_ctor_cstr_len_alloc(
691         basic_string_char *this, const char *str, MSVCP_size_t len, const void *alloc)
692 {
693     return MSVCP_basic_string_char_ctor_cstr_len(this, str, len);
694 }
695
696 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@II@Z */
697 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV01@_K1@Z */
698 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_substr, 16)
699 basic_string_char* __thiscall MSVCP_basic_string_char_ctor_substr(
700         basic_string_char *this, const basic_string_char *assign,
701         MSVCP_size_t pos, MSVCP_size_t len)
702 {
703     TRACE("%p %p %lu %lu\n", this, assign, pos, len);
704
705     basic_string_char_tidy(this, FALSE, 0);
706     MSVCP_basic_string_char_assign_substr(this, assign, pos, len);
707     return this;
708 }
709
710 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@IIABV?$allocator@D@1@@Z */
711 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV01@_K1AEBV?$allocator@D@1@@Z */
712 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_substr_alloc, 20)
713 basic_string_char* __thiscall MSVCP_basic_string_char_ctor_substr_alloc(
714         basic_string_char *this, const basic_string_char *assign,
715         MSVCP_size_t pos, MSVCP_size_t len, const void *alloc)
716 {
717     return MSVCP_basic_string_char_ctor_substr(this, assign, pos, len);
718 }
719
720 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$allocator@D@1@@Z */
721 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$allocator@D@1@@Z */
722 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_alloc, 8)
723 basic_string_char* __thiscall MSVCP_basic_string_char_ctor_alloc(
724         basic_string_char *this, const void *alloc)
725 {
726     TRACE("%p %p\n", this, alloc);
727
728     basic_string_char_tidy(this, FALSE, 0);
729     return this;
730 }
731
732 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ID@Z */
733 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@_KD@Z */
734 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_ch, 12)
735 basic_string_char* __thiscall MSVCP_basic_string_char_ctor_ch(basic_string_char *this,
736         MSVCP_size_t count, char ch)
737 {
738     TRACE("%p %ld %c\n", this, count, ch);
739
740     basic_string_char_tidy(this, FALSE, 0);
741     MSVCP_basic_string_char_assignn(this, count, ch);
742     return this;
743 }
744
745 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@IDABV?$allocator@D@1@@Z */
746 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@_KDAEBV?$allocator@D@1@@Z */
747 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_ch_alloc, 16)
748 basic_string_char* __thiscall MSVCP_basic_string_char_ctor_ch_alloc(basic_string_char *this,
749         MSVCP_size_t count, char ch, const void *alloc)
750 {
751     return MSVCP_basic_string_char_ctor_ch(this, count, ch);
752 }
753
754 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD0@Z */
755 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD0@Z */
756 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_ptr_ptr, 12)
757 basic_string_char* __thiscall MSVCP_basic_string_char_ctor_ptr_ptr(basic_string_char *this,
758         const char *first, const char *last)
759 {
760     return MSVCP_basic_string_char_ctor_cstr_len(this, first, last-first);
761 }
762
763 /* ??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 */
764 /* ??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 */
765 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_iter, 20)
766 basic_string_char* __thiscall MSVCP_basic_string_char_ctor_iter(basic_string_char *this,
767         String_iterator_char beg, String_iterator_char end)
768 {
769     return MSVCP_basic_string_char_ctor_cstr_len(this, beg.pos, end.pos-beg.pos);
770 }
771
772 /* ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ */
773 /* ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ */
774 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_dtor, 4)
775 void __thiscall MSVCP_basic_string_char_dtor(basic_string_char *this)
776 {
777     TRACE("%p\n", this);
778     basic_string_char_tidy(this, TRUE, 0);
779 }
780
781 /* ?size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ */
782 /* ?size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KXZ */
783 /* ?length@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ */
784 /* ?length@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KXZ */
785 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_length, 4)
786 MSVCP_size_t __thiscall MSVCP_basic_string_char_length(const basic_string_char *this)
787 {
788     TRACE("%p\n", this);
789     return this->size;
790 }
791
792 /* ?max_size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ */
793 /* ?max_size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KXZ */
794 DEFINE_THISCALL_WRAPPER(basic_string_char_max_size, 4)
795 MSVCP_size_t __thiscall basic_string_char_max_size(const basic_string_char *this)
796 {
797     TRACE("%p\n", this);
798     return MSVCP_allocator_char_max_size(this->allocator)-1;
799 }
800
801 /* ?empty@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE_NXZ */
802 /* ?empty@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_NXZ */
803 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_empty, 4)
804 MSVCP_bool __thiscall MSVCP_basic_string_char_empty(basic_string_char *this)
805 {
806     TRACE("%p\n", this);
807     return this->size == 0;
808 }
809
810 /* ?swap@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXAAV12@@Z */
811 /* ?swap@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXAEAV12@@Z */
812 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_swap, 8)
813 void __thiscall MSVCP_basic_string_char_swap(basic_string_char *this, basic_string_char *str)
814 {
815     if(this != str) {
816         char tmp[sizeof(this->data)];
817         const MSVCP_size_t size = this->size;
818         const MSVCP_size_t res = this->res;
819
820         memcpy(tmp, this->data.buf, sizeof(this->data));
821         memcpy(this->data.buf, str->data.buf, sizeof(this->data));
822         memcpy(str->data.buf, tmp, sizeof(this->data));
823
824         this->size = str->size;
825         this->res = str->res;
826
827         str->size = size;
828         str->res = res;
829     }
830 }
831
832 /* ?substr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV12@II@Z */
833 /* ?substr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV12@_K0@Z */
834 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_substr, 16)
835 basic_string_char* __thiscall MSVCP_basic_string_char_substr(basic_string_char *this,
836         basic_string_char *ret, MSVCP_size_t off, MSVCP_size_t len)
837 {
838     TRACE("%p %lu %lu\n", this, off, len);
839
840     MSVCP_basic_string_char_ctor_substr(ret, this, off, len);
841     return ret;
842 }
843
844 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@II@Z */
845 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
846 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_substr, 16)
847 basic_string_char* __thiscall MSVCP_basic_string_char_append_substr(basic_string_char *this,
848         const basic_string_char *append, MSVCP_size_t offset, MSVCP_size_t count)
849 {
850     TRACE("%p %p %lu %lu\n", this, append, offset, count);
851
852     if(append->size < offset)
853         MSVCP__String_base_Xran();
854
855     if(count > append->size-offset)
856         count = append->size-offset;
857
858     if(MSVCP_basic_string_char_npos-this->size<=count || this->size+count<this->size)
859         MSVCP__String_base_Xlen();
860
861     if(basic_string_char_grow(this, this->size+count, FALSE)) {
862         MSVCP_char_traits_char__Copy_s(basic_string_char_ptr(this)+this->size,
863                 this->res-this->size, basic_string_char_const_ptr(append)+offset, count);
864         basic_string_char_eos(this, this->size+count);
865     }
866
867     return this;
868 }
869
870 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@@Z */
871 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@@Z */
872 /* ??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@ABV01@@Z */
873 /* ??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@AEBV01@@Z */
874 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append, 8)
875 basic_string_char* __thiscall MSVCP_basic_string_char_append(
876         basic_string_char *this, const basic_string_char *append)
877 {
878     return MSVCP_basic_string_char_append_substr(this, append,
879             0, MSVCP_basic_string_char_npos);
880 }
881
882 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z */
883 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z */
884 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_cstr_len, 12)
885 basic_string_char* __thiscall MSVCP_basic_string_char_append_cstr_len(
886         basic_string_char *this, const char *append, MSVCP_size_t count)
887 {
888     TRACE("%p %s %lu\n", this, debugstr_a(append), count);
889
890     if(basic_string_char_inside(this, append))
891         return MSVCP_basic_string_char_append_substr(this, this,
892                 append-basic_string_char_ptr(this), count);
893
894     if(MSVCP_basic_string_char_npos-this->size<=count || this->size+count<this->size)
895         MSVCP__String_base_Xlen();
896
897     if(basic_string_char_grow(this, this->size+count, FALSE)) {
898         MSVCP_char_traits_char__Copy_s(basic_string_char_ptr(this)+this->size,
899                 this->res-this->size, append, count);
900         basic_string_char_eos(this, this->size+count);
901     }
902
903     return this;
904 }
905
906 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD@Z */
907 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD@Z */
908 /* ??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z */
909 /* ??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@PEBD@Z */
910 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_cstr, 8)
911 basic_string_char* __thiscall MSVCP_basic_string_char_append_cstr(
912         basic_string_char *this, const char *append)
913 {
914     return MSVCP_basic_string_char_append_cstr_len(this, append,
915             MSVCP_char_traits_char_length(append));
916 }
917
918 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD0@Z */
919 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD0@Z */
920 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_beg_end, 12)
921 basic_string_char* __thiscall MSVCP_basic_string_char_append_beg_end(
922         basic_string_char *this, const char *beg, const char *end)
923 {
924     return MSVCP_basic_string_char_append_cstr_len(this, beg, end-beg);
925 }
926
927 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
928 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
929 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_iter, 20)
930 basic_string_char* __thiscall MSVCP_basic_string_char_append_iter(
931         basic_string_char *this, String_iterator_char beg, String_iterator_char end)
932 {
933     return MSVCP_basic_string_char_append_cstr_len(this, beg.pos, end.pos-beg.pos);
934 }
935
936 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ID@Z */
937 /* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z */
938 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_len_ch, 12)
939 basic_string_char* __thiscall MSVCP_basic_string_char_append_len_ch(
940         basic_string_char *this, MSVCP_size_t count, char ch)
941 {
942     TRACE("%p %lu %c\n", this, count, ch);
943
944     if(MSVCP_basic_string_char_npos-this->size <= count)
945         MSVCP__String_base_Xlen();
946
947     if(basic_string_char_grow(this, this->size+count, FALSE)) {
948         MSVCP_char_traits_char_assignn(basic_string_char_ptr(this)+this->size, count, ch);
949         basic_string_char_eos(this, this->size+count);
950     }
951
952     return this;
953 }
954
955 /* ??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@D@Z */
956 /* ??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@D@Z */
957 /* ?push_back@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXD@Z */
958 /* ?push_back@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXD@Z */
959 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_ch, 8)
960 basic_string_char* __thiscall MSVCP_basic_string_char_append_ch(
961         basic_string_char *this, char ch)
962 {
963     return MSVCP_basic_string_char_append_len_ch(this, 1, ch);
964 }
965
966 /* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHIIPBDI@Z */
967 /* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAH_K0PEBD0@Z */
968 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_compare_substr_cstr_len, 20)
969 int __thiscall MSVCP_basic_string_char_compare_substr_cstr_len(
970             const basic_string_char *this, MSVCP_size_t pos, MSVCP_size_t num,
971             const char *str, MSVCP_size_t count)
972 {
973     int ans;
974
975     TRACE("%p %lu %lu %s %lu\n", this, pos, num, debugstr_a(str), count);
976
977     if(this->size < pos)
978         MSVCP__String_base_Xran();
979
980     if(num > this->size-pos)
981         num = this->size-pos;
982
983     ans = MSVCP_char_traits_char_compare(basic_string_char_const_ptr(this)+pos,
984             str, num>count ? count : num);
985     if(ans)
986         return ans;
987
988     if(num > count)
989         ans = 1;
990     else if(num < count)
991         ans = -1;
992     return ans;
993 }
994
995 /* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHIIPBD@Z */
996 /* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAH_K0PEBD@Z */
997 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_compare_substr_cstr, 16)
998 int __thiscall MSVCP_basic_string_char_compare_substr_cstr(const basic_string_char *this,
999         MSVCP_size_t pos, MSVCP_size_t num, const char *str)
1000 {
1001     return MSVCP_basic_string_char_compare_substr_cstr_len(this, pos, num,
1002             str, MSVCP_char_traits_char_length(str));
1003 }
1004
1005 /* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHPBD@Z */
1006 /* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAHPEBD@Z */
1007 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_compare_cstr, 8)
1008 int __thiscall MSVCP_basic_string_char_compare_cstr(
1009         const basic_string_char *this, const char *str)
1010 {
1011     return MSVCP_basic_string_char_compare_substr_cstr_len(this, 0, this->size,
1012             str, MSVCP_char_traits_char_length(str));
1013 }
1014
1015 /* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHIIABV12@II@Z */
1016 /* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAH_K0AEBV12@00@Z */
1017 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_compare_substr_substr, 24)
1018 int __thiscall MSVCP_basic_string_char_compare_substr_substr(
1019         const basic_string_char *this, MSVCP_size_t pos, MSVCP_size_t num,
1020         const basic_string_char *compare, MSVCP_size_t off, MSVCP_size_t count)
1021 {
1022     TRACE("%p %lu %lu %p %lu %lu\n", this, pos, num, compare, off, count);
1023
1024     if(compare->size < off)
1025         MSVCP__String_base_Xran();
1026
1027     if(count > compare->size-off)
1028         count = compare->size-off;
1029
1030     return MSVCP_basic_string_char_compare_substr_cstr_len(this, pos, num,
1031             basic_string_char_const_ptr(compare)+off, count);
1032 }
1033
1034 /* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHIIABV12@@Z */
1035 /* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAH_K0AEBV12@@Z */
1036 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_compare_substr, 16)
1037 int __thiscall MSVCP_basic_string_char_compare_substr(
1038         const basic_string_char *this, MSVCP_size_t pos, MSVCP_size_t num,
1039         const basic_string_char *compare)
1040 {
1041     return MSVCP_basic_string_char_compare_substr_cstr_len(this, pos, num,
1042             basic_string_char_const_ptr(compare), compare->size);
1043 }
1044
1045 /* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHABV12@@Z */
1046 /* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAHAEBV12@@Z */
1047 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_compare, 8)
1048 int __thiscall MSVCP_basic_string_char_compare(
1049         const basic_string_char *this, const basic_string_char *compare)
1050 {
1051     return MSVCP_basic_string_char_compare_substr_cstr_len(this, 0, this->size,
1052             basic_string_char_const_ptr(compare), compare->size);
1053 }
1054
1055 /* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */
1056 /* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */
1057 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_cstr_substr, 16)
1058 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_cstr_substr(
1059         const basic_string_char *this, const char *find, MSVCP_size_t pos, MSVCP_size_t len)
1060 {
1061     const char *p, *end;
1062
1063     TRACE("%p %s %lu %lu\n", this, debugstr_a(find), pos, len);
1064
1065     if(len==0 && pos<=this->size)
1066         return pos;
1067
1068     end = basic_string_char_const_ptr(this)+this->size-len+1;
1069     for(p=basic_string_char_const_ptr(this)+pos; p<end; p++) {
1070         p = MSVCP_char_traits_char_find(p, end-p, find);
1071         if(!p)
1072             break;
1073
1074         if(!MSVCP_char_traits_char_compare(p, find, len))
1075             return p-basic_string_char_const_ptr(this);
1076     }
1077
1078     return MSVCP_basic_string_char_npos;
1079 }
1080
1081 /* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */
1082 /* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */
1083 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_cstr_off, 12)
1084 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_cstr_off(
1085         const basic_string_char *this, const char *find, MSVCP_size_t pos)
1086 {
1087     return MSVCP_basic_string_char_find_cstr_substr(this, find, pos,
1088             MSVCP_char_traits_char_length(find));
1089 }
1090
1091 /* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */
1092 /* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */
1093 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_off, 12)
1094 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_off(
1095         const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off)
1096 {
1097     return MSVCP_basic_string_char_find_cstr_substr(this,
1098             basic_string_char_const_ptr(find), off, find->size);
1099 }
1100
1101 /* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */
1102 /* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */
1103 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_ch, 12)
1104 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_ch(
1105         const basic_string_char *this, char ch, MSVCP_size_t pos)
1106 {
1107     return MSVCP_basic_string_char_find_cstr_substr(this, &ch, pos, 1);
1108 }
1109
1110 /* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */
1111 /* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */
1112 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_rfind_cstr_substr, 16)
1113 MSVCP_size_t __thiscall MSVCP_basic_string_char_rfind_cstr_substr(
1114         const basic_string_char *this, const char *find, MSVCP_size_t pos, MSVCP_size_t len)
1115 {
1116     const char *p, *end;
1117
1118     TRACE("%p %s %lu %lu\n", this, debugstr_a(find), pos, len);
1119
1120     if(len==0)
1121         return pos<this->size ? pos : this->size;
1122
1123     if(len > this->size)
1124         return MSVCP_basic_string_char_npos;
1125
1126     if(pos > this->size-len+1)
1127         pos = this->size-len+1;
1128     end = basic_string_char_const_ptr(this);
1129     for(p=end+pos; p>=end; p--) {
1130         if(*p==*find && !MSVCP_char_traits_char_compare(p, find, len))
1131             return p-basic_string_char_const_ptr(this);
1132     }
1133
1134     return MSVCP_basic_string_char_npos;
1135 }
1136
1137 /* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */
1138 /* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */
1139 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_rfind_cstr_off, 12)
1140 MSVCP_size_t __thiscall MSVCP_basic_string_char_rfind_cstr_off(
1141         const basic_string_char *this, const char *find, MSVCP_size_t pos)
1142 {
1143     return MSVCP_basic_string_char_rfind_cstr_substr(this, find, pos,
1144             MSVCP_char_traits_char_length(find));
1145 }
1146
1147 /* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */
1148 /* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */
1149 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_rfind_off, 12)
1150 MSVCP_size_t __thiscall MSVCP_basic_string_char_rfind_off(
1151         const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off)
1152 {
1153     return MSVCP_basic_string_char_rfind_cstr_substr(this,
1154             basic_string_char_const_ptr(find), off, find->size);
1155 }
1156
1157 /* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */
1158 /* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */
1159 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_rfind_ch, 12)
1160 MSVCP_size_t __thiscall MSVCP_basic_string_char_rfind_ch(
1161         const basic_string_char *this, char ch, MSVCP_size_t pos)
1162 {
1163     return MSVCP_basic_string_char_rfind_cstr_substr(this, &ch, pos, 1);
1164 }
1165
1166 /* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */
1167 /* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */
1168 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_of_cstr_substr, 16)
1169 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_of_cstr_substr(
1170         const basic_string_char *this, const char *find, MSVCP_size_t off, MSVCP_size_t len)
1171 {
1172     const char *p, *end;
1173
1174     TRACE("%p %p %lu %lu\n", this, find, off, len);
1175
1176     if(len>0 && off<this->size) {
1177         end = basic_string_char_const_ptr(this)+this->size;
1178         for(p=basic_string_char_const_ptr(this)+off; p<end; p++)
1179             if(MSVCP_char_traits_char_find(find, len, p))
1180                 return p-basic_string_char_const_ptr(this);
1181     }
1182
1183     return MSVCP_basic_string_char_npos;
1184 }
1185
1186 /* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */
1187 /* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */
1188 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_of, 12)
1189 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_of(
1190         const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off)
1191 {
1192     return MSVCP_basic_string_char_find_first_of_cstr_substr(this,
1193             basic_string_char_const_ptr(find), off, find->size);
1194 }
1195
1196 /* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */
1197 /* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */
1198 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_of_cstr, 12)
1199 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_of_cstr(
1200         const basic_string_char *this, const char *find, MSVCP_size_t off)
1201 {
1202     return MSVCP_basic_string_char_find_first_of_cstr_substr(
1203             this, find, off, MSVCP_char_traits_char_length(find));
1204 }
1205
1206 /* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */
1207 /* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */
1208 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_of_ch, 12)
1209 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_of_ch(
1210         const basic_string_char *this, char ch, MSVCP_size_t off)
1211 {
1212     return MSVCP_basic_string_char_find_first_of_cstr_substr(this, &ch, off, 1);
1213 }
1214
1215 /* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */
1216 /* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */
1217 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_not_of_cstr_substr, 16)
1218 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_not_of_cstr_substr(
1219         const basic_string_char *this, const char *find, MSVCP_size_t off, MSVCP_size_t len)
1220 {
1221     const char *p, *end;
1222
1223     TRACE("%p %p %lu %lu\n", this, find, off, len);
1224
1225     if(off<this->size) {
1226         end = basic_string_char_const_ptr(this)+this->size;
1227         for(p=basic_string_char_const_ptr(this)+off; p<end; p++)
1228             if(!MSVCP_char_traits_char_find(find, len, p))
1229                 return p-basic_string_char_const_ptr(this);
1230     }
1231
1232     return MSVCP_basic_string_char_npos;
1233 }
1234
1235 /* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */
1236 /* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */
1237 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_not_of, 12)
1238 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_not_of(
1239         const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off)
1240 {
1241     return MSVCP_basic_string_char_find_first_not_of_cstr_substr(this,
1242             basic_string_char_const_ptr(find), off, find->size);
1243 }
1244
1245 /* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */
1246 /* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */
1247 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_not_of_cstr, 12)
1248 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_not_of_cstr(
1249         const basic_string_char *this, const char *find, MSVCP_size_t off)
1250 {
1251     return MSVCP_basic_string_char_find_first_not_of_cstr_substr(
1252             this, find, off, MSVCP_char_traits_char_length(find));
1253 }
1254
1255 /* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */
1256 /* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */
1257 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_not_of_ch, 12)
1258 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_not_of_ch(
1259         const basic_string_char *this, char ch, MSVCP_size_t off)
1260 {
1261     return MSVCP_basic_string_char_find_first_not_of_cstr_substr(this, &ch, off, 1);
1262 }
1263
1264 /* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */
1265 /* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */
1266 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_of_cstr_substr, 16)
1267 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_of_cstr_substr(
1268         const basic_string_char *this, const char *find, MSVCP_size_t off, MSVCP_size_t len)
1269 {
1270     const char *p, *beg;
1271
1272     TRACE("%p %p %lu %lu\n", this, find, off, len);
1273
1274     if(len>0 && this->size>0) {
1275         if(off >= this->size)
1276             off = this->size-1;
1277
1278         beg = basic_string_char_const_ptr(this);
1279         for(p=beg+off; p>=beg; p--)
1280             if(MSVCP_char_traits_char_find(find, len, p))
1281                 return p-beg;
1282     }
1283
1284     return MSVCP_basic_string_char_npos;
1285 }
1286
1287 /* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */
1288 /* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */
1289 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_of, 12)
1290 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_of(
1291         const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off)
1292 {
1293     return MSVCP_basic_string_char_find_last_of_cstr_substr(this,
1294             basic_string_char_const_ptr(find), off, find->size);
1295 }
1296
1297 /* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */
1298 /* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */
1299 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_of_cstr, 12)
1300 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_of_cstr(
1301         const basic_string_char *this, const char *find, MSVCP_size_t off)
1302 {
1303     return MSVCP_basic_string_char_find_last_of_cstr_substr(
1304             this, find, off, MSVCP_char_traits_char_length(find));
1305 }
1306
1307 /* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */
1308 /* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */
1309 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_of_ch, 12)
1310 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_of_ch(
1311         const basic_string_char *this, char ch, MSVCP_size_t off)
1312 {
1313     return MSVCP_basic_string_char_find_last_of_cstr_substr(this, &ch, off, 1);
1314 }
1315
1316 /* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */
1317 /* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */
1318 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_not_of_cstr_substr, 16)
1319 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_not_of_cstr_substr(
1320         const basic_string_char *this, const char *find, MSVCP_size_t off, MSVCP_size_t len)
1321 {
1322     const char *p, *beg;
1323
1324     TRACE("%p %p %lu %lu\n", this, find, off, len);
1325
1326     if(len>0 && this->size>0) {
1327         if(off >= this->size)
1328             off = this->size-1;
1329
1330         beg = basic_string_char_const_ptr(this);
1331         for(p=beg+off; p>=beg; p--)
1332             if(!MSVCP_char_traits_char_find(find, len, p))
1333                 return p-beg;
1334     }
1335
1336     return MSVCP_basic_string_char_npos;
1337 }
1338
1339 /* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */
1340 /* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */
1341 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_not_of, 12)
1342 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_not_of(
1343         const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off)
1344 {
1345     return MSVCP_basic_string_char_find_last_not_of_cstr_substr(this,
1346             basic_string_char_const_ptr(find), off, find->size);
1347 }
1348
1349 /* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */
1350 /* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */
1351 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_not_of_cstr, 12)
1352 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_not_of_cstr(
1353         const basic_string_char *this, const char *find, MSVCP_size_t off)
1354 {
1355     return MSVCP_basic_string_char_find_last_not_of_cstr_substr(
1356             this, find, off, MSVCP_char_traits_char_length(find));
1357 }
1358
1359 /* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */
1360 /* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */
1361 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_not_of_ch, 12)
1362 MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_not_of_ch(
1363         const basic_string_char *this, char ch, MSVCP_size_t off)
1364 {
1365     return MSVCP_basic_string_char_find_last_not_of_cstr_substr(this, &ch, off, 1);
1366 }
1367
1368 /* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAADI@Z */
1369 /* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAD_K@Z */
1370 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_operator_at, 8)
1371 char* __thiscall MSVCP_basic_string_char_operator_at(
1372         basic_string_char *this, MSVCP_size_t pos)
1373 {
1374     TRACE("%p %lu\n", this, pos);
1375
1376     assert(this->size >= pos);
1377     return basic_string_char_ptr(this)+pos;
1378 }
1379
1380 /* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEABDI@Z */
1381 /* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAAEBD_K@Z */
1382 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_const_operator_at, 8)
1383 const char* __thiscall MSVCP_basic_string_char_const_operator_at(
1384         const basic_string_char *this, MSVCP_size_t pos)
1385 {
1386     TRACE("%p %lu\n", this, pos);
1387
1388     assert(this->size >= pos);
1389     return basic_string_char_const_ptr(this)+pos;
1390 }
1391
1392 /* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAADU_Size_type_nosscl@01@@Z */
1393 /* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEADU_Size_type_nosscl@01@@Z */
1394 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_operator_at_noverify, 8)
1395 char* __thiscall MSVCP_basic_string_char_operator_at_noverify(
1396         basic_string_char *this, size_t_noverify pos)
1397 {
1398     TRACE("%p %lu\n", this, pos.val);
1399     return basic_string_char_ptr(this)+pos.val;
1400 }
1401
1402 /* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEABDU_Size_type_nosscl@01@@Z */
1403 /* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAAEBDU_Size_type_nosscl@01@@Z */
1404 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_operator_const_at_noverify, 8)
1405 const char* __thiscall MSVCP_basic_string_char_operator_const_at_noverify(
1406         const basic_string_char *this, size_t_noverify pos)
1407 {
1408     TRACE("%p %lu\n", this, pos.val);
1409     return basic_string_char_const_ptr(this)+pos.val;
1410 }
1411
1412 /* ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAADI@Z */
1413 /* ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAD_K@Z */
1414 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_at, 8)
1415 char* __thiscall MSVCP_basic_string_char_at(
1416         basic_string_char *this, MSVCP_size_t pos)
1417 {
1418     TRACE("%p %lu\n", this, pos);
1419
1420     if(this->size <= pos)
1421         MSVCP__String_base_Xran();
1422
1423     return basic_string_char_ptr(this)+pos;
1424 }
1425
1426 /* ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEABDI@Z */
1427 /* ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAAEBD_K@Z */
1428 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_const_at, 8)
1429 const char* __thiscall MSVCP_basic_string_char_const_at(
1430         const basic_string_char *this, MSVCP_size_t pos)
1431 {
1432     TRACE("%p %lu\n", this, pos);
1433
1434     if(this->size <= pos)
1435         MSVCP__String_base_Xran();
1436
1437     return basic_string_char_const_ptr(this)+pos;
1438 }
1439
1440 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IIPBDI@Z */
1441 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0PEBD0@Z */
1442 DEFINE_THISCALL_WRAPPER(basic_string_char_replace_cstr_len, 20)
1443 basic_string_char* __thiscall basic_string_char_replace_cstr_len(basic_string_char *this,
1444         MSVCP_size_t off, MSVCP_size_t len, const char *str, MSVCP_size_t str_len)
1445 {
1446     MSVCP_size_t inside_pos = -1;
1447     char *ptr = basic_string_char_ptr(this);
1448
1449     TRACE("%p %ld %ld %p %ld\n", this, off, len, str, str_len);
1450
1451     if(this->size < off)
1452         MSVCP__String_base_Xran();
1453
1454     if(len > this->size-off)
1455         len = this->size-off;
1456
1457     if(MSVCP_basic_string_char_npos-str_len <= this->size-len)
1458         MSVCP__String_base_Xlen();
1459
1460     if(basic_string_char_inside(this, str))
1461         inside_pos = str-ptr;
1462
1463     if(len < str_len) {
1464         basic_string_char_grow(this, this->size-len+str_len, FALSE);
1465         ptr = basic_string_char_ptr(this);
1466     }
1467
1468     if(inside_pos == -1) {
1469         memmove(ptr+off+str_len, ptr+off+len, (this->size-off-len)*sizeof(char));
1470         memcpy(ptr+off, str, str_len*sizeof(char));
1471     } else if(len >= str_len) {
1472         memmove(ptr+off, ptr+inside_pos, str_len*sizeof(char));
1473         memmove(ptr+off+str_len, ptr+off+len, (this->size-off-len)*sizeof(char));
1474     } else {
1475         MSVCP_size_t size;
1476
1477         memmove(ptr+off+str_len, ptr+off+len, (this->size-off-len)*sizeof(char));
1478
1479         if(inside_pos < off+len) {
1480             size = off+len-inside_pos;
1481             if(size > str_len)
1482                 size = str_len;
1483             memmove(ptr+off, ptr+inside_pos, size*sizeof(char));
1484         } else {
1485             size = 0;
1486         }
1487
1488         if(str_len > size)
1489             memmove(ptr+off+size, ptr+off+str_len, (str_len-size)*sizeof(char));
1490     }
1491
1492     basic_string_char_eos(this, this->size-len+str_len);
1493     return this;
1494 }
1495
1496 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IIPBD@Z */
1497 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0PEBD@Z */
1498 DEFINE_THISCALL_WRAPPER(basic_string_char_replace_cstr, 16)
1499 basic_string_char* __thiscall basic_string_char_replace_cstr(basic_string_char *this,
1500         MSVCP_size_t off, MSVCP_size_t len, const char *str)
1501 {
1502     return basic_string_char_replace_cstr_len(this, off, len, str,
1503             MSVCP_char_traits_char_length(str));
1504 }
1505
1506 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IIABV12@II@Z */
1507 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0AEBV12@00@Z */
1508 DEFINE_THISCALL_WRAPPER(basic_string_char_replace_substr, 24)
1509 basic_string_char* __thiscall basic_string_char_replace_substr(basic_string_char *this, MSVCP_size_t off,
1510         MSVCP_size_t len, const basic_string_char *str, MSVCP_size_t str_off, MSVCP_size_t str_len)
1511 {
1512     if(str->size < str_off)
1513         MSVCP__String_base_Xran();
1514
1515     if(str_len > str->size-str_off)
1516         str_len = str->size-str_off;
1517
1518     return basic_string_char_replace_cstr_len(this, off, len,
1519             basic_string_char_const_ptr(str)+str_off, str_len);
1520 }
1521
1522 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IIABV12@@Z */
1523 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0AEBV12@@Z */
1524 DEFINE_THISCALL_WRAPPER(basic_string_char_replace, 16)
1525 basic_string_char* __thiscall basic_string_char_replace(basic_string_char *this,
1526         MSVCP_size_t off, MSVCP_size_t len, const basic_string_char *str)
1527 {
1528     return basic_string_char_replace_cstr_len(this, off, len,
1529             basic_string_char_const_ptr(str), str->size);
1530 }
1531
1532 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IIID@Z */
1533 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K00D@Z */
1534 DEFINE_THISCALL_WRAPPER(basic_string_char_replace_ch, 20)
1535 basic_string_char* __thiscall basic_string_char_replace_ch(basic_string_char *this,
1536         MSVCP_size_t off, MSVCP_size_t len, MSVCP_size_t count, char ch)
1537 {
1538     char *ptr = basic_string_char_ptr(this);
1539
1540     TRACE("%p %ld %ld %ld %c\n", this, off, len, count, ch);
1541
1542     if(this->size < off)
1543         MSVCP__String_base_Xran();
1544
1545     if(len > this->size-off)
1546         len = this->size-off;
1547
1548     if(MSVCP_basic_string_char_npos-count <= this->size-len)
1549         MSVCP__String_base_Xlen();
1550
1551     if(len < count) {
1552         basic_string_char_grow(this, this->size-len+count, FALSE);
1553         ptr = basic_string_char_ptr(this);
1554     }
1555
1556     memmove(ptr+off+count, ptr+off+len, (this->size-off-len)*sizeof(char));
1557     MSVCP_char_traits_char_assignn(ptr+off, count, ch);
1558     basic_string_char_eos(this, this->size-len+count);
1559
1560     return this;
1561 }
1562
1563 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@000@Z */
1564 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@000@Z */
1565 DEFINE_THISCALL_WRAPPER(basic_string_char_replace_iter_iter, 36)
1566 basic_string_char* __thiscall basic_string_char_replace_iter_iter(basic_string_char *this,
1567         String_iterator_char beg, String_iterator_char end,
1568         String_iterator_char res_beg, String_iterator_char res_end)
1569 {
1570     String_iterator_char begin = { this, basic_string_char_ptr(this) };
1571     return basic_string_char_replace_cstr_len(this,
1572             MSVCP_basic_string_char_Pdif(beg, begin), MSVCP_basic_string_char_Pdif(end, beg),
1573             res_beg.pos, MSVCP_basic_string_char_Pdif(res_end, res_beg));
1574 }
1575
1576 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0ABV12@@Z */
1577 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0AEBV12@@Z */
1578 DEFINE_THISCALL_WRAPPER(basic_string_char_replace_iter_bstr, 24)
1579 basic_string_char* __thiscall basic_string_char_replace_iter_bstr(basic_string_char *this,
1580         String_iterator_char beg, String_iterator_char end, const basic_string_char *str)
1581 {
1582     String_iterator_char begin = { this, basic_string_char_ptr(this) };
1583     return basic_string_char_replace(this, MSVCP_basic_string_char_Pdif(beg, begin),
1584             MSVCP_basic_string_char_Pdif(end, beg), str);
1585 }
1586
1587 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0ID@Z */
1588 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0_KD@Z */
1589 DEFINE_THISCALL_WRAPPER(basic_string_char_replace_iter_ch, 28)
1590 basic_string_char* __thiscall basic_string_char_replace_iter_ch(basic_string_char *this,
1591         String_iterator_char beg, String_iterator_char end, MSVCP_size_t count, char ch)
1592 {
1593     String_iterator_char begin = { this, basic_string_char_ptr(this) };
1594     return basic_string_char_replace_ch(this, MSVCP_basic_string_char_Pdif(beg, begin),
1595             MSVCP_basic_string_char_Pdif(end, beg), count, ch);
1596 }
1597
1598 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0PBD1@Z */
1599 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0PEBD1@Z */
1600 DEFINE_THISCALL_WRAPPER(basic_string_char_replace_iter_ptr_ptr, 28)
1601 basic_string_char* __thiscall basic_string_char_replace_iter_ptr_ptr(basic_string_char *this,
1602         String_iterator_char beg, String_iterator_char end,
1603         const char *res_beg, const char *res_end)
1604 {
1605     String_iterator_char begin = { this, basic_string_char_ptr(this) };
1606     return basic_string_char_replace_cstr_len(this, MSVCP_basic_string_char_Pdif(beg, begin),
1607             MSVCP_basic_string_char_Pdif(end, beg), res_beg, res_end-res_beg);
1608 }
1609
1610 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0PBD@Z */
1611 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0PEBD@Z */
1612 DEFINE_THISCALL_WRAPPER(basic_string_char_replace_iter_cstr, 24)
1613 basic_string_char* __thiscall basic_string_char_replace_iter_cstr(basic_string_char *this,
1614         String_iterator_char beg, String_iterator_char end, const char *str)
1615 {
1616     String_iterator_char begin = { this, basic_string_char_ptr(this) };
1617     return basic_string_char_replace_cstr(this, MSVCP_basic_string_char_Pdif(beg, begin),
1618             MSVCP_basic_string_char_Pdif(end, beg), str);
1619 }
1620
1621 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0PBDI@Z */
1622 /* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0PEBD_K@Z */
1623 DEFINE_THISCALL_WRAPPER(basic_string_char_replace_iter_cstr_len, 28)
1624 basic_string_char* __thiscall basic_string_char_replace_iter_cstr_len(basic_string_char *this,
1625         String_iterator_char beg, String_iterator_char end, const char *str, MSVCP_size_t len)
1626 {
1627     String_iterator_char begin = { this, basic_string_char_ptr(this) };
1628     return basic_string_char_replace_cstr_len(this, MSVCP_basic_string_char_Pdif(beg, begin),
1629             MSVCP_basic_string_char_Pdif(end, beg), str, len);
1630 }
1631
1632 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IABV12@@Z */
1633 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KAEBV12@@Z */
1634 DEFINE_THISCALL_WRAPPER(basic_string_char_insert, 12)
1635 basic_string_char* __thiscall basic_string_char_insert(basic_string_char *this,
1636         MSVCP_size_t off, const basic_string_char *str)
1637 {
1638     return basic_string_char_replace(this, off, 0, str);
1639 }
1640
1641 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IABV12@II@Z */
1642 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KAEBV12@00@Z */
1643 DEFINE_THISCALL_WRAPPER(basic_string_char_insert_substr, 20)
1644 basic_string_char* __thiscall basic_string_char_insert_substr(
1645         basic_string_char *this, MSVCP_size_t off, const basic_string_char *str,
1646         MSVCP_size_t str_off, MSVCP_size_t str_count)
1647 {
1648     return basic_string_char_replace_substr(this, off, 0, str, str_off, str_count);
1649 }
1650
1651 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IPBD@Z */
1652 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KPEBD@Z */
1653 DEFINE_THISCALL_WRAPPER(basic_string_char_insert_cstr, 12)
1654 basic_string_char* __thiscall basic_string_char_insert_cstr(
1655         basic_string_char *this, MSVCP_size_t off, const char *str)
1656 {
1657     return basic_string_char_replace_cstr(this, off, 0, str);
1658 }
1659
1660 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IPBDI@Z */
1661 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KPEBD0@Z */
1662 DEFINE_THISCALL_WRAPPER(basic_string_char_insert_cstr_len, 16)
1663 basic_string_char* __thiscall basic_string_char_insert_cstr_len(basic_string_char *this,
1664         MSVCP_size_t off, const char *str, MSVCP_size_t str_len)
1665 {
1666     return basic_string_char_replace_cstr_len(this, off, 0, str, str_len);
1667 }
1668
1669 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IID@Z */
1670 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0D@Z */
1671 DEFINE_THISCALL_WRAPPER(basic_string_char_insert_chn, 16)
1672 basic_string_char* __thiscall basic_string_char_insert_chn(basic_string_char *this,
1673         MSVCP_size_t off, MSVCP_size_t count, char ch)
1674 {
1675     return basic_string_char_replace_ch(this, off, 0, count, ch);
1676 }
1677
1678 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@ID@Z */
1679 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@_KD@Z */
1680 DEFINE_THISCALL_WRAPPER(basic_string_char_insert_iter_chn, 20)
1681 void __thiscall basic_string_char_insert_iter_chn(basic_string_char *this,
1682         String_iterator_char where, MSVCP_size_t count, char ch)
1683 {
1684     String_iterator_char iter = { this, basic_string_char_ptr(this) };
1685     MSVCP_size_t off = MSVCP_basic_string_char_Pdif(where, iter);
1686
1687     basic_string_char_insert_chn(this, off, count, ch);
1688 }
1689
1690 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@D@Z */
1691 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@D@Z */
1692 DEFINE_THISCALL_WRAPPER(basic_string_char_insert_iter_ch, 20)
1693 String_iterator_char* __thiscall basic_string_char_insert_iter_ch(basic_string_char *this,
1694         String_iterator_char *ret, String_iterator_char where, char ch)
1695 {
1696     MSVCP_size_t off;
1697
1698     ret->bstr = this;
1699     ret->pos = basic_string_char_ptr(this);
1700     off = MSVCP_basic_string_char_Pdif(where, *ret);
1701
1702     basic_string_char_insert_chn(this, off, 1, ch);
1703     ret->pos = basic_string_char_ptr(this)+off;
1704     return ret;
1705 }
1706
1707 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
1708 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
1709 DEFINE_THISCALL_WRAPPER(basic_string_char_insert_iter_null, 16)
1710 String_iterator_char* __thiscall basic_string_char_insert_iter_null(basic_string_char *this,
1711         String_iterator_char *ret, String_iterator_char where)
1712 {
1713     return basic_string_char_insert_iter_ch(this, ret, where, 0);
1714 }
1715
1716 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@00@Z */
1717 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@00@Z */
1718 DEFINE_THISCALL_WRAPPER(basic_string_char_insert_iter_beg_end, 28)
1719 void __thiscall basic_string_char_insert_iter_beg_end(basic_string_char *this,
1720         String_iterator_char where, String_iterator_char beg, String_iterator_char end)
1721 {
1722     basic_string_char_replace_iter_iter(this, where, where, beg, end);
1723 }
1724
1725 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD1@Z */
1726 /* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD1@Z */
1727 DEFINE_THISCALL_WRAPPER(basic_string_char_insert_iter_ptr_ptr, 20)
1728 void __thiscall basic_string_char_insert_iter_ptr_ptr(basic_string_char *this,
1729         String_iterator_char where, const char *beg, const char *end)
1730 {
1731     basic_string_char_replace_iter_ptr_ptr(this, where, where, beg, end);
1732 }
1733
1734 /* ?resize@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXID@Z */
1735 /* ?resize@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAX_KD@Z */
1736 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_resize_ch, 12)
1737 void __thiscall MSVCP_basic_string_char_resize_ch(
1738         basic_string_char *this, MSVCP_size_t size, char ch)
1739 {
1740     TRACE("%p %lu %c\n", this, size, ch);
1741
1742     if(size <= this->size)
1743         MSVCP_basic_string_char_erase(this, size, this->size);
1744     else
1745         MSVCP_basic_string_char_append_len_ch(this, size-this->size, ch);
1746 }
1747
1748 /* ?resize@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXI@Z */
1749 /* ?resize@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAX_K@Z */
1750 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_resize, 8)
1751 void __thiscall MSVCP_basic_string_char_resize(
1752         basic_string_char *this, MSVCP_size_t size)
1753 {
1754     MSVCP_basic_string_char_resize_ch(this, size, '\0');
1755 }
1756
1757 /* ?clear@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
1758 /* ?clear@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
1759 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_clear, 4)
1760 void __thiscall MSVCP_basic_string_char_clear(basic_string_char *this)
1761 {
1762     basic_string_char_eos(this, 0);
1763 }
1764
1765 /* ?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
1766 /* ?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
1767 /* ?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
1768 /* ?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
1769 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_begin, 8)
1770 String_iterator_char* __thiscall MSVCP_basic_string_char_begin(
1771         basic_string_char *this, String_iterator_char *ret)
1772 {
1773     TRACE("%p\n", this);
1774
1775     ret->bstr = this;
1776     ret->pos = basic_string_char_const_ptr(this);
1777     return ret;
1778 }
1779
1780 /* ?end@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
1781 /* ?end@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
1782 /* ?end@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
1783 /* ?end@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
1784 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_end, 8)
1785 String_iterator_char* __thiscall MSVCP_basic_string_char_end(
1786         basic_string_char *this, String_iterator_char *ret)
1787 {
1788     TRACE("%p\n", this);
1789
1790     ret->bstr = this;
1791     ret->pos = basic_string_char_const_ptr(this)+this->size;
1792     return ret;
1793 }
1794
1795 /* ?rbegin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$reverse_iterator@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
1796 /* ?rbegin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$reverse_iterator@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
1797 /* ?rbegin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$reverse_iterator@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
1798 /* ?rbegin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$reverse_iterator@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
1799 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_rbegin, 8)
1800 String_reverse_iterator_char* __thiscall MSVCP_basic_string_char_rbegin(
1801         basic_string_char *this, String_reverse_iterator_char *ret)
1802 {
1803     TRACE("%p\n", this);
1804
1805     ret->bstr = this;
1806     ret->pos = basic_string_char_const_ptr(this)+this->size;
1807     return ret;
1808 }
1809
1810 /* ?rend@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$reverse_iterator@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
1811 /* ?rend@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$reverse_iterator@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
1812 /* ?rend@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$reverse_iterator@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
1813 /* ?rend@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$reverse_iterator@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
1814 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_rend, 8)
1815 String_reverse_iterator_char* __thiscall MSVCP_basic_string_char_rend(
1816         basic_string_char *this, String_reverse_iterator_char *ret)
1817 {
1818     TRACE("%p\n", this);
1819
1820     ret->bstr = this;
1821     ret->pos = basic_string_char_const_ptr(this);
1822     return ret;
1823 }
1824
1825 /* basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t>> */
1826 /* basic_string<unsigned short, char_traits<unsigned short>, allocator<unsigned short>> */
1827 /* ?npos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@2IB */
1828 /* ?npos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@2_KB */
1829 /* ?npos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@2IB */
1830 /* ?npos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@2_KB */
1831 const MSVCP_size_t MSVCP_basic_string_wchar_npos = -1;
1832
1833 /* ?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEPA_WXZ */
1834 /* ?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAPEA_WXZ */
1835 /* ?_Myptr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEPAGXZ */
1836 /* ?_Myptr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAPEAGXZ */
1837 DEFINE_THISCALL_WRAPPER(basic_string_wchar_ptr, 4)
1838 wchar_t* __thiscall basic_string_wchar_ptr(basic_string_wchar *this)
1839 {
1840     if(this->res == BUF_SIZE_WCHAR-1)
1841         return this->data.buf;
1842     return this->data.ptr;
1843 }
1844
1845 /* ?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IBEPB_WXZ */
1846 /* ?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEBAPEB_WXZ */
1847 /* ?_Myptr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IBEPBGXZ */
1848 /* ?_Myptr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEBAPEBGXZ */
1849 DEFINE_THISCALL_WRAPPER(basic_string_wchar_const_ptr, 4)
1850 const wchar_t* __thiscall basic_string_wchar_const_ptr(const basic_string_wchar *this)
1851 {
1852     if(this->res == BUF_SIZE_WCHAR-1)
1853         return this->data.buf;
1854     return this->data.ptr;
1855 }
1856
1857 /* ?_Eos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEXI@Z */
1858 /* ?_Eos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAX_K@Z */
1859 /* ?_Eos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEXI@Z */
1860 /* ?_Eos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAX_K@Z */
1861 DEFINE_THISCALL_WRAPPER(basic_string_wchar_eos, 8)
1862 void __thiscall basic_string_wchar_eos(basic_string_wchar *this, MSVCP_size_t len)
1863 {
1864     static const wchar_t nullbyte_w = '\0';
1865
1866     this->size = len;
1867     MSVCP_char_traits_wchar_assign(basic_string_wchar_ptr(this)+len, &nullbyte_w);
1868 }
1869
1870 /* ?_Inside@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAE_NPB_W@Z */
1871 /* ?_Inside@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAA_NPEB_W@Z */
1872 /* ?_Inside@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAE_NPBG@Z */
1873 /* ?_Inside@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAA_NPEBG@Z */
1874 DEFINE_THISCALL_WRAPPER(basic_string_wchar_inside, 8)
1875 MSVCP_bool __thiscall basic_string_wchar_inside(
1876         basic_string_wchar *this, const wchar_t *ptr)
1877 {
1878     wchar_t *cstr = basic_string_wchar_ptr(this);
1879
1880     return (ptr<cstr || ptr>=cstr+this->size) ? FALSE : TRUE;
1881 }
1882
1883 /* ?_Tidy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEX_NI@Z */
1884 /* ?_Tidy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAX_N_K@Z */
1885 /* ?_Tidy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEX_NI@Z */
1886 /* ?_Tidy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAX_N_K@Z */
1887 DEFINE_THISCALL_WRAPPER(basic_string_wchar_tidy, 12)
1888 void __thiscall basic_string_wchar_tidy(basic_string_wchar *this,
1889         MSVCP_bool built, MSVCP_size_t new_size)
1890 {
1891     if(built && BUF_SIZE_WCHAR<=this->res) {
1892         wchar_t *ptr = this->data.ptr;
1893
1894         if(new_size > 0)
1895             MSVCP_char_traits_wchar__Copy_s(this->data.buf, BUF_SIZE_WCHAR, ptr, new_size);
1896         MSVCP_allocator_wchar_deallocate(this->allocator, ptr, this->res+1);
1897     }
1898
1899     this->res = BUF_SIZE_WCHAR-1;
1900     basic_string_wchar_eos(this, new_size);
1901 }
1902
1903 /* ?_Grow@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAE_NI_N@Z */
1904 /* ?_Grow@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAA_N_K_N@Z */
1905 /* ?_Grow@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAE_NI_N@Z */
1906 /* ?_Grow@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAA_N_K_N@Z */
1907 DEFINE_THISCALL_WRAPPER(basic_string_wchar_grow, 12)
1908 MSVCP_bool __thiscall basic_string_wchar_grow(
1909         basic_string_wchar *this, MSVCP_size_t new_size, MSVCP_bool trim)
1910 {
1911     if(this->res < new_size) {
1912         MSVCP_size_t new_res = new_size, len = this->size;
1913         wchar_t *ptr;
1914
1915         new_res |= 0xf;
1916
1917         if(new_res/3 < this->res/2)
1918             new_res = this->res + this->res/2;
1919
1920         ptr = MSVCP_allocator_wchar_allocate(this->allocator, new_res+1);
1921         if(!ptr)
1922             ptr = MSVCP_allocator_wchar_allocate(this->allocator, new_size+1);
1923         else
1924             new_size = new_res;
1925         if(!ptr) {
1926             ERR("Out of memory\n");
1927             basic_string_wchar_tidy(this, TRUE, 0);
1928             return FALSE;
1929         }
1930
1931         MSVCP_char_traits_wchar__Copy_s(ptr, new_size,
1932                 basic_string_wchar_ptr(this), this->size);
1933         basic_string_wchar_tidy(this, TRUE, 0);
1934         this->data.ptr = ptr;
1935         this->res = new_size;
1936         basic_string_wchar_eos(this, len);
1937     } else if(trim && new_size < BUF_SIZE_WCHAR)
1938         basic_string_wchar_tidy(this, TRUE,
1939                 new_size<this->size ? new_size : this->size);
1940     else if(new_size == 0)
1941         basic_string_wchar_eos(this, 0);
1942
1943     return (new_size>0);
1944 }
1945
1946 /* ?_Copy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEXII@Z */
1947 /* ?_Copy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAX_K0@Z */
1948 /* ?_Copy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEXII@Z */
1949 /* ?_Copy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAX_K0@Z */
1950 DEFINE_THISCALL_WRAPPER(basic_string_wchar__Copy, 12)
1951 void __thiscall basic_string_wchar__Copy(basic_string_wchar *this,
1952         MSVCP_size_t new_size, MSVCP_size_t copy_len)
1953 {
1954     TRACE("%p %lu %lu\n", this, new_size, copy_len);
1955
1956     if(!basic_string_wchar_grow(this, new_size, FALSE))
1957         return;
1958     basic_string_wchar_eos(this, copy_len);
1959 }
1960
1961 /* ?_Pdif@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@KAIV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
1962 /* ?_Pdif@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@KA_KV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
1963 /* ?_Pdif@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@KAIV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
1964 /* ?_Pdif@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@KA_KV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
1965 static MSVCP_size_t __cdecl MSVCP_basic_string_wchar_Pdif(String_iterator_wchar i1, String_iterator_wchar i2)
1966 {
1967     TRACE("(%p %p) (%p %p)\n", i1.bstr, i1.pos, i2.bstr, i2.pos);
1968
1969     if((!i1.bstr && i1.pos) || i1.bstr!=i2.bstr) {
1970         _invalid_parameter(NULL, NULL, NULL, 0, 0);
1971         return 0;
1972     }
1973
1974     return !i1.pos ? 0 : i1.pos-i2.pos;
1975 }
1976
1977 /* ?get_allocator@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$allocator@_W@2@XZ */
1978 /* ?get_allocator@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$allocator@_W@2@XZ */
1979 /* ?get_allocator@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$allocator@G@2@XZ */
1980 /* ?get_allocator@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$allocator@G@2@XZ */
1981 DEFINE_THISCALL_WRAPPER(basic_string_wchar_get_allocator, 8)
1982 allocator* __thiscall basic_string_wchar_get_allocator(const basic_string_wchar *this, allocator *ret)
1983 {
1984     TRACE("%p\n", this);
1985     return ret;
1986 }
1987
1988 /* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@II@Z */
1989 /* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0@Z */
1990 /* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@II@Z */
1991 /* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0@Z */
1992 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_erase, 12)
1993 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_erase(
1994             basic_string_wchar *this, MSVCP_size_t pos, MSVCP_size_t len)
1995 {
1996     TRACE("%p %lu %lu\n", this, pos, len);
1997
1998     if(pos > this->size)
1999         MSVCP__String_base_Xran();
2000
2001     if(len > this->size-pos)
2002         len = this->size-pos;
2003
2004     if(len) {
2005         MSVCP_char_traits_wchar__Move_s(basic_string_wchar_ptr(this)+pos,
2006                 this->res-pos, basic_string_wchar_ptr(this)+pos+len,
2007                 this->size-pos-len);
2008         basic_string_wchar_eos(this, this->size-len);
2009     }
2010
2011     return this;
2012 }
2013
2014 /* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
2015 /* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
2016 /* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
2017 /* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
2018 DEFINE_THISCALL_WRAPPER(basic_string_wchar_erase_iter_range, 24)
2019 String_iterator_wchar* __thiscall basic_string_wchar_erase_iter_range(basic_string_wchar *this,
2020         String_iterator_wchar *ret, String_iterator_wchar beg, String_iterator_wchar end)
2021 {
2022     MSVCP_size_t off;
2023
2024     ret->bstr = this;
2025     ret->pos = basic_string_wchar_ptr(this);
2026     off = MSVCP_basic_string_wchar_Pdif(beg, *ret);
2027
2028     MSVCP_basic_string_wchar_erase(this, off, MSVCP_basic_string_wchar_Pdif(end, beg));
2029
2030     ret->bstr = this;
2031     ret->pos = basic_string_wchar_ptr(this)+off;
2032     return ret;
2033 }
2034
2035 /* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
2036 /* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
2037 /* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
2038 /* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
2039 DEFINE_THISCALL_WRAPPER(basic_string_wchar_erase_iter, 16)
2040 String_iterator_wchar* __thiscall basic_string_wchar_erase_iter(basic_string_wchar *this,
2041         String_iterator_wchar *ret, String_iterator_wchar pos)
2042 {
2043     MSVCP_size_t off;
2044
2045     ret->bstr = this;
2046     ret->pos = basic_string_wchar_ptr(this);
2047     off = MSVCP_basic_string_wchar_Pdif(pos, *ret);
2048
2049     MSVCP_basic_string_wchar_erase(this, off, 1);
2050
2051     ret->bstr = this;
2052     ret->pos = basic_string_wchar_ptr(this)+off;
2053     return ret;
2054 }
2055
2056 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@II@Z */
2057 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
2058 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@ABV12@II@Z */
2059 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
2060 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_substr, 16)
2061 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_substr(
2062             basic_string_wchar *this, const basic_string_wchar *assign,
2063             MSVCP_size_t pos, MSVCP_size_t len)
2064 {
2065     TRACE("%p %p %lu %lu\n", this, assign, pos, len);
2066
2067     if(assign->size < pos)
2068         MSVCP__String_base_Xran();
2069
2070     if(len > assign->size-pos)
2071         len = assign->size-pos;
2072
2073     if(this == assign) {
2074         MSVCP_basic_string_wchar_erase(this, pos+len, MSVCP_basic_string_wchar_npos);
2075         MSVCP_basic_string_wchar_erase(this, 0, pos);
2076     } else if(basic_string_wchar_grow(this, len, FALSE)) {
2077         MSVCP_char_traits_wchar__Copy_s(basic_string_wchar_ptr(this),
2078                 this->res, basic_string_wchar_const_ptr(assign)+pos, len);
2079         basic_string_wchar_eos(this, len);
2080     }
2081
2082     return this;
2083 }
2084
2085 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@@Z */
2086 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@AEBV12@@Z */
2087 /* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@ABV01@@Z */
2088 /* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@AEBV01@@Z */
2089 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@ABV12@@Z */
2090 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@AEBV12@@Z */
2091 /* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@ABV01@@Z */
2092 /* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@AEBV01@@Z */
2093 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign, 8)
2094 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign(
2095             basic_string_wchar *this, const basic_string_wchar *assign)
2096 {
2097     return MSVCP_basic_string_wchar_assign_substr(this, assign,
2098             0, MSVCP_basic_string_wchar_npos);
2099 }
2100
2101 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_WI@Z */
2102 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W_K@Z */
2103 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBGI@Z */
2104 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG_K@Z */
2105 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_cstr_len, 12)
2106 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_cstr_len(
2107             basic_string_wchar *this, const wchar_t *str, MSVCP_size_t len)
2108 {
2109     TRACE("%p %s %lu\n", this, debugstr_w(str), len);
2110
2111     if(basic_string_wchar_inside(this, str))
2112         return MSVCP_basic_string_wchar_assign_substr(this, this,
2113                 str-basic_string_wchar_ptr(this), len);
2114     else if(basic_string_wchar_grow(this, len, FALSE)) {
2115         MSVCP_char_traits_wchar__Copy_s(basic_string_wchar_ptr(this),
2116                 this->res, str, len);
2117         basic_string_wchar_eos(this, len);
2118     }
2119
2120     return this;
2121 }
2122
2123 /* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@_W@Z */
2124 /* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@_W@Z */
2125 /* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@G@Z */
2126 /* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@G@Z */
2127 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_ch, 8)
2128 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_ch(
2129         basic_string_wchar *this, wchar_t ch)
2130 {
2131     return MSVCP_basic_string_wchar_assign_cstr_len(this, &ch, 1);
2132 }
2133
2134 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_W@Z */
2135 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W@Z */
2136 /* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@PB_W@Z */
2137 /* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@PEB_W@Z */
2138 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBG@Z */
2139 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG@Z */
2140 /* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@PBG@Z */
2141 /* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@PEBG@Z */
2142 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_cstr, 8)
2143 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_cstr(
2144             basic_string_wchar *this, const wchar_t *str)
2145 {
2146     return MSVCP_basic_string_wchar_assign_cstr_len(this, str,
2147             MSVCP_char_traits_wchar_length(str));
2148 }
2149
2150 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@I_W@Z */
2151 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K_W@Z */
2152 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IG@Z */
2153 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_KG@Z */
2154 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assignn, 12)
2155 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assignn(
2156         basic_string_wchar *this, MSVCP_size_t count, wchar_t ch)
2157 {
2158     TRACE("%p %ld %c\n", this, count, ch);
2159
2160     basic_string_wchar_grow(this, count, FALSE);
2161     MSVCP_char_traits_wchar_assignn(basic_string_wchar_ptr(this), count, ch);
2162     basic_string_wchar_eos(this, count);
2163     return this;
2164 }
2165
2166 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_W0@Z */
2167 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W0@Z */
2168 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBG0@Z */
2169 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG0@Z */
2170 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_ptr_ptr, 12)
2171 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_ptr_ptr(
2172         basic_string_wchar *this, const wchar_t *first, const wchar_t *last)
2173 {
2174     return MSVCP_basic_string_wchar_assign_cstr_len(this, first, last-first);
2175 }
2176
2177 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
2178 /* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
2179 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
2180 /* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
2181 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_iter, 20)
2182 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_iter(basic_string_wchar *this,
2183         String_iterator_wchar beg, String_iterator_wchar end)
2184 {
2185     return MSVCP_basic_string_wchar_assign_ptr_ptr(this, beg.pos, end.pos);
2186 }
2187
2188 /* ?_Chassign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEXII_W@Z */
2189 /* ?_Chassign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAX_K0_W@Z */
2190 /* ?_Chassign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEXIIG@Z */
2191 /* ?_Chassign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAX_K0G@Z */
2192 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_Chassign, 16)
2193 void __thiscall MSVCP_basic_string_wchar_Chassign(basic_string_wchar *this,
2194         MSVCP_size_t off, MSVCP_size_t count, wchar_t ch)
2195 {
2196     TRACE("%p %lu %lu %c\n", this, off, count, ch);
2197     MSVCP_char_traits_wchar_assignn(basic_string_wchar_ptr(this)+off, count, ch);
2198 }
2199
2200 /* ?_Copy_s@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPA_WIII@Z */
2201 /* ?_Copy_s@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEA_W_K11@Z */
2202 /* ?_Copy_s@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPAGIII@Z */
2203 /* ?_Copy_s@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEAG_K11@Z */
2204 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_Copy_s, 20)
2205 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_Copy_s(const basic_string_wchar *this,
2206         wchar_t *dest, MSVCP_size_t size, MSVCP_size_t count, MSVCP_size_t off)
2207 {
2208     TRACE("%p %p %lu %lu %lu\n", this, dest, size, count, off);
2209
2210     if(this->size < off)
2211         MSVCP__String_base_Xran();
2212
2213     if(count > this->size-off)
2214         count = this->size-off;
2215
2216     MSVCP_char_traits_wchar__Copy_s(dest, size,
2217             basic_string_wchar_const_ptr(this)+off, count);
2218     return count;
2219 }
2220
2221 /* ?copy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPA_WII@Z */
2222 /* ?copy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEA_W_K1@Z */
2223 /* ?copy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPAGII@Z */
2224 /* ?copy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEAG_K1@Z */
2225 DEFINE_THISCALL_WRAPPER(basic_string_wchar_copy, 16)
2226 MSVCP_size_t __thiscall basic_string_wchar_copy(const basic_string_wchar *this,
2227         wchar_t *dest, MSVCP_size_t count, MSVCP_size_t off)
2228 {
2229     return MSVCP_basic_string_wchar_Copy_s(this, dest, count, count, off);
2230 }
2231
2232 /* ?c_str@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPB_WXZ */
2233 /* ?c_str@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEB_WXZ */
2234 /* ?data@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPB_WXZ */
2235 /* ?data@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEB_WXZ */
2236 /* ?c_str@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPBGXZ */
2237 /* ?c_str@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEBGXZ */
2238 /* ?data@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPBGXZ */
2239 /* ?data@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEBGXZ */
2240 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_c_str, 4)
2241 const wchar_t* __thiscall MSVCP_basic_string_wchar_c_str(const basic_string_wchar *this)
2242 {
2243     TRACE("%p\n", this);
2244     return basic_string_wchar_const_ptr(this);
2245 }
2246
2247 /* ?capacity@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ */
2248 /* ?capacity@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ */
2249 /* ?capacity@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIXZ */
2250 /* ?capacity@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KXZ */
2251 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_capacity, 4)
2252 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_capacity(basic_string_wchar *this)
2253 {
2254     TRACE("%p\n", this);
2255     return this->res;
2256 }
2257
2258 /* ?reserve@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXI@Z */
2259 /* ?reserve@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAX_K@Z */
2260 /* ?reserve@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXI@Z */
2261 /* ?reserve@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAX_K@Z */
2262 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_reserve, 8)
2263 void __thiscall MSVCP_basic_string_wchar_reserve(basic_string_wchar *this, MSVCP_size_t size)
2264 {
2265     MSVCP_size_t len;
2266
2267     TRACE("%p %ld\n", this, size);
2268
2269     len = this->size;
2270     if(len > size)
2271         return;
2272
2273     basic_string_wchar_grow(this, size, FALSE);
2274     basic_string_wchar_eos(this, len);
2275 }
2276
2277 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ */
2278 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@XZ */
2279 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@XZ */
2280 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@XZ */
2281 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor, 4)
2282 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor(basic_string_wchar *this)
2283 {
2284     TRACE("%p\n", this);
2285
2286     basic_string_wchar_tidy(this, FALSE, 0);
2287     return this;
2288 }
2289
2290 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV01@@Z */
2291 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV01@@Z */
2292 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV01@@Z */
2293 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV01@@Z */
2294 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_copy_ctor, 8)
2295 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_copy_ctor(
2296             basic_string_wchar *this, const basic_string_wchar *copy)
2297 {
2298     TRACE("%p %p\n", this, copy);
2299
2300     basic_string_wchar_tidy(this, FALSE, 0);
2301     MSVCP_basic_string_wchar_assign(this, copy);
2302     return this;
2303 }
2304
2305 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_W@Z */
2306 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_W@Z */
2307 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@PBG@Z */
2308 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@PEBG@Z */
2309 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_cstr, 8)
2310 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_cstr(
2311             basic_string_wchar *this, const wchar_t *str)
2312 {
2313     TRACE("%p %s\n", this, debugstr_w(str));
2314
2315     basic_string_wchar_tidy(this, FALSE, 0);
2316     MSVCP_basic_string_wchar_assign_cstr(this, str);
2317     return this;
2318 }
2319
2320 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_WABV?$allocator@_W@1@@Z */
2321 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_WAEBV?$allocator@_W@1@@Z */
2322 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@PBGABV?$allocator@G@1@@Z */
2323 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@PEBGAEBV?$allocator@G@1@@Z */
2324 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_cstr_alloc, 12)
2325 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_cstr_alloc(
2326         basic_string_wchar *this, const wchar_t *str, const void *alloc)
2327 {
2328     return MSVCP_basic_string_wchar_ctor_cstr(this, str);
2329 }
2330
2331 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_WI@Z */
2332 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_W_K@Z */
2333 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@PBGI@Z */
2334 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@PEBG_K@Z */
2335 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_cstr_len, 12)
2336 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_cstr_len(
2337         basic_string_wchar *this, const wchar_t *str, MSVCP_size_t len)
2338 {
2339     TRACE("%p %s %ld\n", this, debugstr_w(str), len);
2340
2341     basic_string_wchar_tidy(this, FALSE, 0);
2342     MSVCP_basic_string_wchar_assign_cstr_len(this, str, len);
2343     return this;
2344 }
2345
2346 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_WIABV?$allocator@_W@1@@Z */
2347 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_W_KAEBV?$allocator@_W@1@@Z */
2348 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@PBGIABV?$allocator@G@1@@Z */
2349 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@PEBG_KAEBV?$allocator@G@1@@Z */
2350 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_cstr_len_alloc, 16)
2351 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_cstr_len_alloc(
2352         basic_string_wchar *this, const wchar_t *str, MSVCP_size_t len, const void *alloc)
2353 {
2354     return MSVCP_basic_string_wchar_ctor_cstr_len(this, str, len);
2355 }
2356
2357 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV01@II@Z */
2358 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV01@_K1@Z */
2359 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV01@II@Z */
2360 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV01@_K1@Z */
2361 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_substr, 16)
2362 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_substr(
2363         basic_string_wchar *this, const basic_string_wchar *assign,
2364         MSVCP_size_t pos, MSVCP_size_t len)
2365 {
2366     TRACE("%p %p %lu %lu\n", this, assign, pos, len);
2367
2368     basic_string_wchar_tidy(this, FALSE, 0);
2369     MSVCP_basic_string_wchar_assign_substr(this, assign, pos, len);
2370     return this;
2371 }
2372
2373 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV01@IIABV?$allocator@_W@1@@Z */
2374 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV01@_K1AEBV?$allocator@_W@1@@Z */
2375 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV01@IIABV?$allocator@G@1@@Z */
2376 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV01@_K1AEBV?$allocator@G@1@@Z */
2377 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_substr_alloc, 20)
2378 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_substr_alloc(
2379         basic_string_wchar *this, const basic_string_wchar *assign,
2380         MSVCP_size_t pos, MSVCP_size_t len, const void *alloc)
2381 {
2382     return MSVCP_basic_string_wchar_ctor_substr(this, assign, pos, len);
2383 }
2384
2385 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$allocator@_W@1@@Z */
2386 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$allocator@_W@1@@Z */
2387 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV?$allocator@G@1@@Z */
2388 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV?$allocator@G@1@@Z */
2389 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_alloc, 8)
2390 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_alloc(
2391         basic_string_wchar *this, const void *alloc)
2392 {
2393     TRACE("%p %p\n", this, alloc);
2394
2395     basic_string_wchar_tidy(this, FALSE, 0);
2396     return this;
2397 }
2398
2399 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@I_W@Z */
2400 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@_K_W@Z */
2401 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@IG@Z */
2402 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@_KG@Z */
2403 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_ch, 12)
2404 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_ch(basic_string_wchar *this,
2405         MSVCP_size_t count, wchar_t ch)
2406 {
2407     TRACE("%p %ld %c\n", this, count, ch);
2408
2409     basic_string_wchar_tidy(this, FALSE, 0);
2410     MSVCP_basic_string_wchar_assignn(this, count, ch);
2411     return this;
2412 }
2413
2414 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@I_WABV?$allocator@_W@1@@Z */
2415 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@_K_WAEBV?$allocator@_W@1@@Z */
2416 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@IGABV?$allocator@G@1@@Z */
2417 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@_KGAEBV?$allocator@G@1@@Z */
2418 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_ch_alloc, 16)
2419 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_ch_alloc(basic_string_wchar *this,
2420         MSVCP_size_t count, wchar_t ch, const void *alloc)
2421 {
2422     return MSVCP_basic_string_wchar_ctor_ch(this, count, ch);
2423 }
2424
2425 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_W0@Z */
2426 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_W0@Z */
2427 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@PBG0@Z */
2428 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@PEBG0@Z */
2429 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_ptr_ptr, 12)
2430 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_ptr_ptr(basic_string_wchar *this,
2431         const wchar_t *first, const wchar_t *last)
2432 {
2433     return MSVCP_basic_string_wchar_ctor_cstr_len(this, first, last-first);
2434 }
2435
2436 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@0@Z */
2437 /* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@0@Z */
2438 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@1@0@Z */
2439 /* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@1@0@Z */
2440 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_iter, 20)
2441 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_iter(basic_string_wchar *this,
2442         String_iterator_wchar beg, String_iterator_wchar end)
2443 {
2444     return MSVCP_basic_string_wchar_ctor_cstr_len(this, beg.pos, end.pos-beg.pos);
2445 }
2446
2447 /* ??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ */
2448 /* ??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@XZ */
2449 /* ??1?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@XZ */
2450 /* ??1?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@XZ */
2451 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_dtor, 4)
2452 void __thiscall MSVCP_basic_string_wchar_dtor(basic_string_wchar *this)
2453 {
2454     TRACE("%p\n", this);
2455     basic_string_wchar_tidy(this, TRUE, 0);
2456 }
2457
2458 /* ?size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ */
2459 /* ?size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ */
2460 /* ?length@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ */
2461 /* ?length@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ */
2462 /* ?size@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIXZ */
2463 /* ?size@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KXZ */
2464 /* ?length@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIXZ */
2465 /* ?length@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KXZ */
2466 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_length, 4)
2467 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_length(const basic_string_wchar *this)
2468 {
2469     TRACE("%p\n", this);
2470     return this->size;
2471 }
2472
2473 /* ?max_size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ */
2474 /* ?max_size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ */
2475 /* ?max_size@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIXZ */
2476 /* ?max_size@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KXZ */
2477 DEFINE_THISCALL_WRAPPER(basic_string_wchar_max_size, 4)
2478 MSVCP_size_t __thiscall basic_string_wchar_max_size(const basic_string_wchar *this)
2479 {
2480     TRACE("%p\n", this);
2481     return MSVCP_allocator_wchar_max_size(this->allocator)-1;
2482 }
2483
2484 /* ?empty@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE_NXZ */
2485 /* ?empty@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_NXZ */
2486 /* ?empty@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE_NXZ */
2487 /* ?empty@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_NXZ */
2488 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_empty, 4)
2489 MSVCP_bool __thiscall MSVCP_basic_string_wchar_empty(basic_string_wchar *this)
2490 {
2491     TRACE("%p\n", this);
2492     return this->size == 0;
2493 }
2494
2495 /* ?swap@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXAAV12@@Z */
2496 /* ?swap@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXAEAV12@@Z */
2497 /* ?swap@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXAAV12@@Z */
2498 /* ?swap@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXAEAV12@@Z */
2499 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_swap, 8)
2500 void __thiscall MSVCP_basic_string_wchar_swap(basic_string_wchar *this, basic_string_wchar *str)
2501 {
2502     if(this != str) {
2503         char tmp[sizeof(this->data)];
2504         const MSVCP_size_t size = this->size;
2505         const MSVCP_size_t res = this->res;
2506
2507         memcpy(tmp, this->data.buf, sizeof(this->data));
2508         memcpy(this->data.buf, str->data.buf, sizeof(this->data));
2509         memcpy(str->data.buf, tmp, sizeof(this->data));
2510
2511         this->size = str->size;
2512         this->res = str->res;
2513
2514         str->size = size;
2515         str->res = res;
2516     }
2517 }
2518
2519 /* ?substr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV12@II@Z */
2520 /* ?substr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV12@_K0@Z */
2521 /* ?substr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV12@II@Z */
2522 /* ?substr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV12@_K0@Z */
2523 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_substr, 16)
2524 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_substr(basic_string_wchar *this,
2525         basic_string_wchar *ret, MSVCP_size_t off, MSVCP_size_t len)
2526 {
2527     TRACE("%p %lu %lu\n", this, off, len);
2528
2529     MSVCP_basic_string_wchar_ctor_substr(ret, this, off, len);
2530     return ret;
2531 }
2532
2533 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@II@Z */
2534 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
2535 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@ABV12@II@Z */
2536 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
2537 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_substr, 16)
2538 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_substr(basic_string_wchar *this,
2539         const basic_string_wchar *append, MSVCP_size_t offset, MSVCP_size_t count)
2540 {
2541     TRACE("%p %p %lu %lu\n", this, append, offset, count);
2542
2543     if(append->size < offset)
2544         MSVCP__String_base_Xran();
2545
2546     if(count > append->size-offset)
2547         count = append->size-offset;
2548
2549     if(MSVCP_basic_string_wchar_npos-this->size<=count || this->size+count<this->size)
2550         MSVCP__String_base_Xlen();
2551
2552     if(basic_string_wchar_grow(this, this->size+count, FALSE)) {
2553         MSVCP_char_traits_wchar__Copy_s(basic_string_wchar_ptr(this)+this->size,
2554                 this->res-this->size, basic_string_wchar_const_ptr(append)+offset, count);
2555         basic_string_wchar_eos(this, this->size+count);
2556     }
2557
2558     return this;
2559 }
2560
2561 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@@Z */
2562 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@AEBV12@@Z */
2563 /* ??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@ABV01@@Z */
2564 /* ??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@AEBV01@@Z */
2565 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@ABV12@@Z */
2566 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@AEBV12@@Z */
2567 /* ??Y?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@ABV01@@Z */
2568 /* ??Y?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@AEBV01@@Z */
2569 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append, 8)
2570 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append(
2571             basic_string_wchar *this, const basic_string_wchar *append)
2572 {
2573     return MSVCP_basic_string_wchar_append_substr(this, append,
2574             0, MSVCP_basic_string_wchar_npos);
2575 }
2576
2577 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_WI@Z */
2578 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W_K@Z */
2579 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBGI@Z */
2580 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG_K@Z */
2581 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_cstr_len, 12)
2582 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_cstr_len(
2583         basic_string_wchar *this, const wchar_t *append, MSVCP_size_t count)
2584 {
2585     TRACE("%p %s %lu\n", this, debugstr_w(append), count);
2586
2587     if(basic_string_wchar_inside(this, append))
2588         return MSVCP_basic_string_wchar_append_substr(this, this,
2589                 append-basic_string_wchar_ptr(this), count);
2590
2591     if(MSVCP_basic_string_wchar_npos-this->size<=count || this->size+count<this->size)
2592         MSVCP__String_base_Xlen();
2593
2594     if(basic_string_wchar_grow(this, this->size+count, FALSE)) {
2595         MSVCP_char_traits_wchar__Copy_s(basic_string_wchar_ptr(this)+this->size,
2596                 this->res-this->size, append, count);
2597         basic_string_wchar_eos(this, this->size+count);
2598     }
2599
2600     return this;
2601 }
2602
2603 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_W@Z */
2604 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W@Z */
2605 /* ??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@PB_W@Z */
2606 /* ??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@PEB_W@Z */
2607 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBG@Z */
2608 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG@Z */
2609 /* ??Y?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@PBG@Z */
2610 /* ??Y?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@PEBG@Z */
2611 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_cstr, 8)
2612 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_cstr(
2613         basic_string_wchar *this, const wchar_t *append)
2614 {
2615     return MSVCP_basic_string_wchar_append_cstr_len(this, append,
2616             MSVCP_char_traits_wchar_length(append));
2617 }
2618
2619 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_W0@Z */
2620 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W0@Z */
2621 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBG0@Z */
2622 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG0@Z */
2623 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_beg_end, 12)
2624 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_beg_end(
2625         basic_string_wchar *this, const wchar_t *beg, const wchar_t *end)
2626 {
2627     return MSVCP_basic_string_wchar_append_cstr_len(this, beg, end-beg);
2628 }
2629
2630 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
2631 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
2632 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
2633 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
2634 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_iter, 20)
2635 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_iter(
2636         basic_string_wchar *this, String_iterator_wchar beg, String_iterator_wchar end)
2637 {
2638     return MSVCP_basic_string_wchar_append_cstr_len(this, beg.pos, end.pos-beg.pos);
2639 }
2640
2641 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@I_W@Z */
2642 /* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K_W@Z */
2643 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IG@Z */
2644 /* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_KG@Z */
2645 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_len_ch, 12)
2646 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_len_ch(
2647         basic_string_wchar *this, MSVCP_size_t count, wchar_t ch)
2648 {
2649     TRACE("%p %lu %c\n", this, count, ch);
2650
2651     if(MSVCP_basic_string_wchar_npos-this->size <= count)
2652         MSVCP__String_base_Xlen();
2653
2654     if(basic_string_wchar_grow(this, this->size+count, FALSE)) {
2655         MSVCP_char_traits_wchar_assignn(basic_string_wchar_ptr(this)+this->size, count, ch);
2656         basic_string_wchar_eos(this, this->size+count);
2657     }
2658
2659     return this;
2660 }
2661
2662 /* ??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@_W@Z */
2663 /* ??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@_W@Z */
2664 /* ?push_back@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEX_W@Z */
2665 /* ?push_back@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAX_W@Z */
2666 /* ??Y?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@G@Z */
2667 /* ??Y?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@G@Z */
2668 /* ?push_back@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXG@Z */
2669 /* ?push_back@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXG@Z */
2670 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_ch, 8)
2671 basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_ch(
2672         basic_string_wchar *this, wchar_t ch)
2673 {
2674     return MSVCP_basic_string_wchar_append_len_ch(this, 1, ch);
2675 }
2676
2677 /* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHIIPB_WI@Z */
2678 /* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAH_K0PEB_W0@Z */
2679 /* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEHIIPBGI@Z */
2680 /* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAH_K0PEBG0@Z */
2681 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_compare_substr_cstr_len, 20)
2682 int __thiscall MSVCP_basic_string_wchar_compare_substr_cstr_len(
2683         const basic_string_wchar *this, MSVCP_size_t pos, MSVCP_size_t num,
2684         const wchar_t *str, MSVCP_size_t count)
2685 {
2686     int ans;
2687
2688     TRACE("%p %lu %lu %s %lu\n", this, pos, num, debugstr_w(str), count);
2689
2690     if(this->size < pos)
2691         MSVCP__String_base_Xran();
2692
2693     if(num > this->size-pos)
2694         num = this->size-pos;
2695
2696     ans = MSVCP_char_traits_wchar_compare(basic_string_wchar_const_ptr(this)+pos,
2697             str, num>count ? count : num);
2698     if(ans)
2699         return ans;
2700
2701     if(num > count)
2702         ans = 1;
2703     else if(num < count)
2704         ans = -1;
2705     return ans;
2706 }
2707
2708 /* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHIIPB_W@Z */
2709 /* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAH_K0PEB_W@Z */
2710 /* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEHIIPBG@Z */
2711 /* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAH_K0PEBG@Z */
2712 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_compare_substr_cstr, 16)
2713 int __thiscall MSVCP_basic_string_wchar_compare_substr_cstr(const basic_string_wchar *this,
2714         MSVCP_size_t pos, MSVCP_size_t num, const wchar_t *str)
2715 {
2716     return MSVCP_basic_string_wchar_compare_substr_cstr_len(this, pos, num,
2717             str, MSVCP_char_traits_wchar_length(str));
2718 }
2719
2720 /* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHPB_W@Z */
2721 /* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAHPEB_W@Z */
2722 /* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEHPBG@Z */
2723 /* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAHPEBG@Z */
2724 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_compare_cstr, 8)
2725 int __thiscall MSVCP_basic_string_wchar_compare_cstr(
2726         const basic_string_wchar *this, const wchar_t *str)
2727 {
2728     return MSVCP_basic_string_wchar_compare_substr_cstr_len(this, 0, this->size,
2729             str, MSVCP_char_traits_wchar_length(str));
2730 }
2731
2732 /* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHIIABV12@II@Z */
2733 /* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAH_K0AEBV12@00@Z */
2734 /* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEHIIABV12@II@Z */
2735 /* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAH_K0AEBV12@00@Z */
2736 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_compare_substr_substr, 24)
2737 int __thiscall MSVCP_basic_string_wchar_compare_substr_substr(
2738         const basic_string_wchar *this, MSVCP_size_t pos, MSVCP_size_t num,
2739         const basic_string_wchar *compare, MSVCP_size_t off, MSVCP_size_t count)
2740 {
2741     TRACE("%p %lu %lu %p %lu %lu\n", this, pos, num, compare, off, count);
2742
2743     if(compare->size < off)
2744         MSVCP__String_base_Xran();
2745
2746     if(count > compare->size-off)
2747         count = compare->size-off;
2748
2749     return MSVCP_basic_string_wchar_compare_substr_cstr_len(this, pos, num,
2750             basic_string_wchar_const_ptr(compare)+off, count);
2751 }
2752
2753 /* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHIIABV12@@Z */
2754 /* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAH_K0AEBV12@@Z */
2755 /* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEHIIABV12@@Z */
2756 /* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAH_K0AEBV12@@Z */
2757 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_compare_substr, 16)
2758 int __thiscall MSVCP_basic_string_wchar_compare_substr(
2759         const basic_string_wchar *this, MSVCP_size_t pos, MSVCP_size_t num,
2760         const basic_string_wchar *compare)
2761 {
2762     return MSVCP_basic_string_wchar_compare_substr_cstr_len(this, pos, num,
2763             basic_string_wchar_const_ptr(compare), compare->size);
2764 }
2765
2766 /* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHABV12@@Z */
2767 /* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAHAEBV12@@Z */
2768 /* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEHABV12@@Z */
2769 /* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAHAEBV12@@Z */
2770 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_compare, 8)
2771 int __thiscall MSVCP_basic_string_wchar_compare(
2772         const basic_string_wchar *this, const basic_string_wchar *compare)
2773 {
2774     return MSVCP_basic_string_wchar_compare_substr_cstr_len(this, 0, this->size,
2775             basic_string_wchar_const_ptr(compare), compare->size);
2776 }
2777
2778 /* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */
2779 /* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */
2780 /* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z */
2781 /* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z */
2782 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_cstr_substr, 16)
2783 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_cstr_substr(
2784         const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t pos, MSVCP_size_t len)
2785 {
2786     const wchar_t *p, *end;
2787
2788     TRACE("%p %s %lu %lu\n", this, debugstr_w(find), pos, len);
2789
2790     if(len==0 && pos<=this->size)
2791         return pos;
2792
2793     end = basic_string_wchar_const_ptr(this)+this->size-len+1;
2794     for(p=basic_string_wchar_const_ptr(this)+pos; p<end; p++) {
2795         p = MSVCP_char_traits_wchar_find(p, end-p, find);
2796         if(!p)
2797             break;
2798
2799         if(!MSVCP_char_traits_wchar_compare(p, find, len))
2800             return p-basic_string_wchar_const_ptr(this);
2801     }
2802
2803     return MSVCP_basic_string_wchar_npos;
2804 }
2805
2806 /* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */
2807 /* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */
2808 /* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGI@Z */
2809 /* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z */
2810 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_cstr_off, 12)
2811 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_cstr_off(
2812         const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t pos)
2813 {
2814     return MSVCP_basic_string_wchar_find_cstr_substr(this, find, pos,
2815             MSVCP_char_traits_wchar_length(find));
2816 }
2817
2818 /* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */
2819 /* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */
2820 /* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z */
2821 /* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z */
2822 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_off, 12)
2823 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_off(
2824         const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off)
2825 {
2826     return MSVCP_basic_string_wchar_find_cstr_substr(this,
2827             basic_string_wchar_const_ptr(find), off, find->size);
2828 }
2829
2830 /* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */
2831 /* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */
2832 /* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z */
2833 /* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KG_K@Z */
2834 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_ch, 12)
2835 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_ch(
2836         const basic_string_wchar *this, wchar_t ch, MSVCP_size_t pos)
2837 {
2838     return MSVCP_basic_string_wchar_find_cstr_substr(this, &ch, pos, 1);
2839 }
2840
2841 /* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */
2842 /* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */
2843 /* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z */
2844 /* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z */
2845 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_rfind_cstr_substr, 16)
2846 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_rfind_cstr_substr(
2847         const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t pos, MSVCP_size_t len)
2848 {
2849     const wchar_t *p, *end;
2850
2851     TRACE("%p %s %lu %lu\n", this, debugstr_w(find), pos, len);
2852
2853     if(len==0)
2854         return pos<this->size ? pos : this->size;
2855
2856     if(len > this->size)
2857         return MSVCP_basic_string_wchar_npos;
2858
2859     if(pos > this->size-len+1)
2860         pos = this->size-len+1;
2861     end = basic_string_wchar_const_ptr(this);
2862     for(p=end+pos; p>=end; p--) {
2863         if(*p==*find && !MSVCP_char_traits_wchar_compare(p, find, len))
2864             return p-basic_string_wchar_const_ptr(this);
2865     }
2866
2867     return MSVCP_basic_string_wchar_npos;
2868 }
2869
2870 /* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */
2871 /* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */
2872 /* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGI@Z */
2873 /* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z */
2874 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_rfind_cstr_off, 12)
2875 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_rfind_cstr_off(
2876         const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t pos)
2877 {
2878     return MSVCP_basic_string_wchar_rfind_cstr_substr(this, find, pos,
2879             MSVCP_char_traits_wchar_length(find));
2880 }
2881
2882 /* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */
2883 /* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */
2884 /* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z */
2885 /* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z */
2886 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_rfind_off, 12)
2887 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_rfind_off(
2888         const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off)
2889 {
2890     return MSVCP_basic_string_wchar_rfind_cstr_substr(this,
2891             basic_string_wchar_const_ptr(find), off, find->size);
2892 }
2893
2894 /* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */
2895 /* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */
2896 /* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z */
2897 /* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KG_K@Z */
2898 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_rfind_ch, 12)
2899 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_rfind_ch(
2900         const basic_string_wchar *this, wchar_t ch, MSVCP_size_t pos)
2901 {
2902     return MSVCP_basic_string_wchar_rfind_cstr_substr(this, &ch, pos, 1);
2903 }
2904
2905 /* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */
2906 /* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */
2907 /* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z */
2908 /* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z */
2909 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_of_cstr_substr, 16)
2910 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_of_cstr_substr(
2911         const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off, MSVCP_size_t len)
2912 {
2913     const wchar_t *p, *end;
2914
2915     TRACE("%p %p %lu %lu\n", this, find, off, len);
2916
2917     if(len>0 && off<this->size) {
2918         end = basic_string_wchar_const_ptr(this)+this->size;
2919         for(p=basic_string_wchar_const_ptr(this)+off; p<end; p++)
2920             if(MSVCP_char_traits_wchar_find(find, len, p))
2921                 return p-basic_string_wchar_const_ptr(this);
2922     }
2923
2924     return MSVCP_basic_string_wchar_npos;
2925 }
2926
2927 /* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */
2928 /* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */
2929 /* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z */
2930 /* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z */
2931 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_of, 12)
2932 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_of(
2933         const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off)
2934 {
2935     return MSVCP_basic_string_wchar_find_first_of_cstr_substr(this,
2936             basic_string_wchar_const_ptr(find), off, find->size);
2937 }
2938
2939 /* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */
2940 /* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */
2941 /* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGI@Z */
2942 /* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z */
2943 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_of_cstr, 12)
2944 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_of_cstr(
2945         const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off)
2946 {
2947     return MSVCP_basic_string_wchar_find_first_of_cstr_substr(
2948             this, find, off, MSVCP_char_traits_wchar_length(find));
2949 }
2950
2951 /* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */
2952 /* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */
2953 /* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z */
2954 /* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KG_K@Z */
2955 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_of_ch, 12)
2956 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_of_ch(
2957         const basic_string_wchar *this, wchar_t ch, MSVCP_size_t off)
2958 {
2959     return MSVCP_basic_string_wchar_find_first_of_cstr_substr(this, &ch, off, 1);
2960 }
2961
2962 /* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */
2963 /* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */
2964 /* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z */
2965 /* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z */
2966 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_not_of_cstr_substr, 16)
2967 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_not_of_cstr_substr(
2968         const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off, MSVCP_size_t len)
2969 {
2970     const wchar_t *p, *end;
2971
2972     TRACE("%p %p %lu %lu\n", this, find, off, len);
2973
2974     if(off<this->size) {
2975         end = basic_string_wchar_const_ptr(this)+this->size;
2976         for(p=basic_string_wchar_const_ptr(this)+off; p<end; p++)
2977             if(!MSVCP_char_traits_wchar_find(find, len, p))
2978                 return p-basic_string_wchar_const_ptr(this);
2979     }
2980
2981     return MSVCP_basic_string_wchar_npos;
2982 }
2983
2984 /* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */
2985 /* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */
2986 /* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z */
2987 /* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z */
2988 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_not_of, 12)
2989 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_not_of(
2990         const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off)
2991 {
2992     return MSVCP_basic_string_wchar_find_first_not_of_cstr_substr(this,
2993             basic_string_wchar_const_ptr(find), off, find->size);
2994 }
2995
2996 /* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */
2997 /* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */
2998 /* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGI@Z */
2999 /* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z */
3000 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_not_of_cstr, 12)
3001 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_not_of_cstr(
3002         const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off)
3003 {
3004     return MSVCP_basic_string_wchar_find_first_not_of_cstr_substr(
3005             this, find, off, MSVCP_char_traits_wchar_length(find));
3006 }
3007
3008 /* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */
3009 /* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */
3010 /* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z */
3011 /* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KG_K@Z */
3012 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_not_of_ch, 12)
3013 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_not_of_ch(
3014         const basic_string_wchar *this, wchar_t ch, MSVCP_size_t off)
3015 {
3016     return MSVCP_basic_string_wchar_find_first_not_of_cstr_substr(this, &ch, off, 1);
3017 }
3018
3019 /* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */
3020 /* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */
3021 /* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z */
3022 /* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z */
3023 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_of_cstr_substr, 16)
3024 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_of_cstr_substr(
3025         const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off, MSVCP_size_t len)
3026 {
3027     const wchar_t *p, *beg;
3028
3029     TRACE("%p %p %lu %lu\n", this, find, off, len);
3030
3031
3032     if(len>0 && this->size>0) {
3033         if(off >= this->size)
3034             off = this->size-1;
3035
3036         beg = basic_string_wchar_const_ptr(this);
3037         for(p=beg+off; p>=beg; p--)
3038             if(MSVCP_char_traits_wchar_find(find, len, p))
3039                 return p-beg;
3040     }
3041
3042     return MSVCP_basic_string_wchar_npos;
3043 }
3044
3045 /* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */
3046 /* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */
3047 /* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z */
3048 /* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z */
3049 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_of, 12)
3050 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_of(
3051         const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off)
3052 {
3053     return MSVCP_basic_string_wchar_find_last_of_cstr_substr(this,
3054             basic_string_wchar_const_ptr(find), off, find->size);
3055 }
3056
3057 /* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */
3058 /* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */
3059 /* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGI@Z */
3060 /* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z */
3061 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_of_cstr, 12)
3062 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_of_cstr(
3063         const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off)
3064 {
3065     return MSVCP_basic_string_wchar_find_last_of_cstr_substr(
3066             this, find, off, MSVCP_char_traits_wchar_length(find));
3067 }
3068
3069 /* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */
3070 /* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */
3071 /* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z */
3072 /* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KG_K@Z */
3073 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_of_ch, 12)
3074 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_of_ch(
3075         const basic_string_wchar *this, wchar_t ch, MSVCP_size_t off)
3076 {
3077     return MSVCP_basic_string_wchar_find_last_of_cstr_substr(this, &ch, off, 1);
3078 }
3079
3080 /* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */
3081 /* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */
3082 /* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z */
3083 /* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z */
3084 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_not_of_cstr_substr, 16)
3085 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_not_of_cstr_substr(
3086         const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off, MSVCP_size_t len)
3087 {
3088     const wchar_t *p, *beg;
3089
3090     TRACE("%p %p %lu %lu\n", this, find, off, len);
3091
3092     if(len>0 && this->size>0) {
3093         if(off >= this->size)
3094             off = this->size-1;
3095
3096         beg = basic_string_wchar_const_ptr(this);
3097         for(p=beg+off; p>=beg; p--)
3098             if(!MSVCP_char_traits_wchar_find(find, len, p))
3099                 return p-beg;
3100     }
3101
3102     return MSVCP_basic_string_wchar_npos;
3103 }
3104
3105 /* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */
3106 /* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */
3107 /* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z */
3108 /* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z */
3109 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_not_of, 12)
3110 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_not_of(
3111         const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off)
3112 {
3113     return MSVCP_basic_string_wchar_find_last_not_of_cstr_substr(this,
3114             basic_string_wchar_const_ptr(find), off, find->size);
3115 }
3116
3117 /* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */
3118 /* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */
3119 /* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGI@Z */
3120 /* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z */
3121 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_not_of_cstr, 12)
3122 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_not_of_cstr(
3123         const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off)
3124 {
3125     return MSVCP_basic_string_wchar_find_last_not_of_cstr_substr(
3126             this, find, off, MSVCP_char_traits_wchar_length(find));
3127 }
3128
3129 /* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */
3130 /* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */
3131 /* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z */
3132 /* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KG_K@Z */
3133 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_not_of_ch, 12)
3134 MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_not_of_ch(
3135         const basic_string_wchar *this, wchar_t ch, MSVCP_size_t off)
3136 {
3137     return MSVCP_basic_string_wchar_find_last_not_of_cstr_substr(this, &ch, off, 1);
3138 }
3139
3140 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IIPB_WI@Z */
3141 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0PEB_W0@Z */
3142 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IIPBGI@Z */
3143 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0PEBG0@Z */
3144 DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_cstr_len, 20)
3145 basic_string_wchar* __thiscall basic_string_wchar_replace_cstr_len(basic_string_wchar *this,
3146         MSVCP_size_t off, MSVCP_size_t len, const wchar_t *str, MSVCP_size_t str_len)
3147 {
3148     MSVCP_size_t inside_pos = -1;
3149     wchar_t *ptr = basic_string_wchar_ptr(this);
3150
3151     TRACE("%p %ld %ld %p %ld\n", this, off, len, str, str_len);
3152
3153     if(this->size < off)
3154         MSVCP__String_base_Xran();
3155
3156     if(len > this->size-off)
3157         len = this->size-off;
3158
3159     if(MSVCP_basic_string_wchar_npos-str_len <= this->size-len)
3160         MSVCP__String_base_Xlen();
3161
3162     if(basic_string_wchar_inside(this, str))
3163         inside_pos = str-ptr;
3164
3165     if(len < str_len) {
3166         basic_string_wchar_grow(this, this->size-len+str_len, FALSE);
3167         ptr = basic_string_wchar_ptr(this);
3168     }
3169
3170     if(inside_pos == -1) {
3171         memmove(ptr+off+str_len, ptr+off+len, (this->size-off-len)*sizeof(wchar_t));
3172         memcpy(ptr+off, str, str_len*sizeof(wchar_t));
3173     } else if(len >= str_len) {
3174         memmove(ptr+off, ptr+inside_pos, str_len*sizeof(wchar_t));
3175         memmove(ptr+off+str_len, ptr+off+len, (this->size-off-len)*sizeof(wchar_t));
3176     } else {
3177         MSVCP_size_t size;
3178
3179         memmove(ptr+off+str_len, ptr+off+len, (this->size-off-len)*sizeof(wchar_t));
3180
3181         if(inside_pos < off+len) {
3182             size = off+len-inside_pos;
3183             if(size > str_len)
3184                 size = str_len;
3185             memmove(ptr+off, ptr+inside_pos, size*sizeof(wchar_t));
3186         } else {
3187             size = 0;
3188         }
3189
3190         if(str_len > size)
3191             memmove(ptr+off+size, ptr+off+str_len, (str_len-size)*sizeof(wchar_t));
3192     }
3193
3194     basic_string_wchar_eos(this, this->size-len+str_len);
3195     return this;
3196 }
3197
3198 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IIPB_W@Z */
3199 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0PEB_W@Z */
3200 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IIPBG@Z */
3201 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0PEBG@Z */
3202 DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_cstr, 16)
3203 basic_string_wchar* __thiscall basic_string_wchar_replace_cstr(basic_string_wchar *this,
3204         MSVCP_size_t off, MSVCP_size_t len, const wchar_t *str)
3205 {
3206     return basic_string_wchar_replace_cstr_len(this, off, len, str,
3207             MSVCP_char_traits_wchar_length(str));
3208 }
3209
3210 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IIABV12@II@Z */
3211 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0AEBV12@00@Z */
3212 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IIABV12@II@Z */
3213 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0AEBV12@00@Z */
3214 DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_substr, 24)
3215 basic_string_wchar* __thiscall basic_string_wchar_replace_substr(basic_string_wchar *this, MSVCP_size_t off,
3216         MSVCP_size_t len, const basic_string_wchar *str, MSVCP_size_t str_off, MSVCP_size_t str_len)
3217 {
3218     if(str->size < str_off)
3219         MSVCP__String_base_Xran();
3220
3221     if(str_len > str->size-str_off)
3222         str_len = str->size-str_off;
3223
3224     return basic_string_wchar_replace_cstr_len(this, off, len,
3225             basic_string_wchar_const_ptr(str)+str_off, str_len);
3226 }
3227
3228 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IIABV12@@Z */
3229 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0AEBV12@@Z */
3230 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IIABV12@@Z */
3231 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0AEBV12@@Z */
3232 DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace, 16)
3233 basic_string_wchar* __thiscall basic_string_wchar_replace(basic_string_wchar *this,
3234         MSVCP_size_t off, MSVCP_size_t len, const basic_string_wchar *str)
3235 {
3236     return basic_string_wchar_replace_cstr_len(this, off, len,
3237             basic_string_wchar_const_ptr(str), str->size);
3238 }
3239
3240 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@III_W@Z */
3241 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K00_W@Z */
3242 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IIIG@Z */
3243 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K00G@Z */
3244 DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_ch, 20)
3245 basic_string_wchar* __thiscall basic_string_wchar_replace_ch(basic_string_wchar *this,
3246         MSVCP_size_t off, MSVCP_size_t len, MSVCP_size_t count, wchar_t ch)
3247 {
3248     wchar_t *ptr = basic_string_wchar_ptr(this);
3249
3250     TRACE("%p %ld %ld %ld %c\n", this, off, len, count, ch);
3251
3252     if(this->size < off)
3253         MSVCP__String_base_Xran();
3254
3255     if(len > this->size-off)
3256         len = this->size-off;
3257
3258     if(MSVCP_basic_string_wchar_npos-count <= this->size-len)
3259         MSVCP__String_base_Xlen();
3260
3261     if(len < count) {
3262         basic_string_wchar_grow(this, this->size-len+count, FALSE);
3263         ptr = basic_string_wchar_ptr(this);
3264     }
3265
3266     memmove(ptr+off+count, ptr+off+len, (this->size-off-len)*sizeof(wchar_t));
3267     MSVCP_char_traits_wchar_assignn(ptr+off, count, ch);
3268     basic_string_wchar_eos(this, this->size-len+count);
3269
3270     return this;
3271 }
3272
3273 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@000@Z */
3274 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@000@Z */
3275 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@000@Z */
3276 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@000@Z */
3277 DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_iter_iter, 36)
3278 basic_string_wchar* __thiscall basic_string_wchar_replace_iter_iter(basic_string_wchar *this,
3279         String_iterator_wchar beg, String_iterator_wchar end,
3280                 String_iterator_wchar res_beg, String_iterator_wchar res_end)
3281 {
3282     String_iterator_wchar begin = { this, basic_string_wchar_ptr(this) };
3283     return basic_string_wchar_replace_cstr_len(this,
3284             MSVCP_basic_string_wchar_Pdif(beg, begin), MSVCP_basic_string_wchar_Pdif(end, beg),
3285             res_beg.pos, MSVCP_basic_string_wchar_Pdif(res_end, res_beg));
3286 }
3287
3288 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0ABV12@@Z */
3289 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0AEBV12@@Z */
3290 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0ABV12@@Z */
3291 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0AEBV12@@Z */
3292 DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_iter_bstr, 24)
3293 basic_string_wchar* __thiscall basic_string_wchar_replace_iter_bstr(basic_string_wchar *this,
3294         String_iterator_wchar beg, String_iterator_wchar end, const basic_string_wchar *str)
3295 {
3296     String_iterator_wchar begin = { this, basic_string_wchar_ptr(this) };
3297     return basic_string_wchar_replace(this, MSVCP_basic_string_wchar_Pdif(beg, begin),
3298             MSVCP_basic_string_wchar_Pdif(end, beg), str);
3299 }
3300
3301 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0I_W@Z */
3302 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0_K_W@Z */
3303 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0IG@Z */
3304 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0_KG@Z */
3305 DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_iter_ch, 28)
3306 basic_string_wchar* __thiscall basic_string_wchar_replace_iter_ch(basic_string_wchar *this,
3307         String_iterator_wchar beg, String_iterator_wchar end, MSVCP_size_t count, wchar_t ch)
3308 {
3309     String_iterator_wchar begin = { this, basic_string_wchar_ptr(this) };
3310     return basic_string_wchar_replace_ch(this, MSVCP_basic_string_wchar_Pdif(beg, begin),
3311             MSVCP_basic_string_wchar_Pdif(end, beg), count, ch);
3312 }
3313
3314 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0PB_W1@Z */
3315 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0PEB_W1@Z */
3316 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0PBG1@Z */
3317 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0PEBG1@Z */
3318 DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_iter_ptr_ptr, 28)
3319 basic_string_wchar* __thiscall basic_string_wchar_replace_iter_ptr_ptr(basic_string_wchar *this,
3320         String_iterator_wchar beg, String_iterator_wchar end,
3321         const wchar_t *res_beg, const wchar_t *res_end)
3322 {
3323     String_iterator_wchar begin = { this, basic_string_wchar_ptr(this) };
3324     return basic_string_wchar_replace_cstr_len(this, MSVCP_basic_string_wchar_Pdif(beg, begin),
3325             MSVCP_basic_string_wchar_Pdif(end, beg), res_beg, res_end-res_beg);
3326 }
3327
3328 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0PB_W@Z */
3329 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0PEB_W@Z */
3330 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0PBG@Z */
3331 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0PEBG@Z */
3332 DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_iter_cstr, 24)
3333 basic_string_wchar* __thiscall basic_string_wchar_replace_iter_cstr(basic_string_wchar *this,
3334         String_iterator_wchar beg, String_iterator_wchar end, const wchar_t *str)
3335 {
3336     String_iterator_wchar begin = { this, basic_string_wchar_ptr(this) };
3337     return basic_string_wchar_replace_cstr(this, MSVCP_basic_string_wchar_Pdif(beg, begin),
3338             MSVCP_basic_string_wchar_Pdif(end, beg), str);
3339 }
3340
3341 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0PB_WI@Z */
3342 /* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0PEB_W_K@Z */
3343 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0PBGI@Z */
3344 /* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0PEBG_K@Z */
3345 DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_iter_cstr_len, 28)
3346 basic_string_wchar* __thiscall basic_string_wchar_replace_iter_cstr_len(basic_string_wchar *this,
3347         String_iterator_wchar beg, String_iterator_wchar end, const wchar_t *str, MSVCP_size_t len)
3348 {
3349     String_iterator_wchar begin = { this, basic_string_wchar_ptr(this) };
3350     return basic_string_wchar_replace_cstr_len(this, MSVCP_basic_string_wchar_Pdif(beg, begin),
3351             MSVCP_basic_string_wchar_Pdif(end, beg), str, len);
3352 }
3353
3354 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IABV12@@Z */
3355 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_KAEBV12@@Z */
3356 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IABV12@@Z */
3357 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_KAEBV12@@Z */
3358 DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert, 12)
3359 basic_string_wchar* __thiscall basic_string_wchar_insert(basic_string_wchar *this,
3360         MSVCP_size_t off, const basic_string_wchar *str)
3361 {
3362     return basic_string_wchar_replace(this, off, 0, str);
3363 }
3364
3365 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IABV12@II@Z */
3366 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_KAEBV12@00@Z */
3367 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IABV12@II@Z */
3368 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_KAEBV12@00@Z */
3369 DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_substr, 20)
3370 basic_string_wchar* __thiscall basic_string_wchar_insert_substr(
3371         basic_string_wchar *this, MSVCP_size_t off, const basic_string_wchar *str,
3372         MSVCP_size_t str_off, MSVCP_size_t str_count)
3373 {
3374     return basic_string_wchar_replace_substr(this, off, 0, str, str_off, str_count);
3375 }
3376
3377 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IPB_W@Z */
3378 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_KPEB_W@Z */
3379 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IPBG@Z */
3380 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_KPEBG@Z */
3381 DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_cstr, 12)
3382 basic_string_wchar* __thiscall basic_string_wchar_insert_cstr(
3383         basic_string_wchar *this, MSVCP_size_t off, const wchar_t *str)
3384 {
3385     return basic_string_wchar_replace_cstr(this, off, 0, str);
3386 }
3387
3388 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IPB_WI@Z */
3389 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_KPEB_W0@Z */
3390 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IPBGI@Z */
3391 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_KPEBG0@Z */
3392 DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_cstr_len, 16)
3393 basic_string_wchar* __thiscall basic_string_wchar_insert_cstr_len(basic_string_wchar *this,
3394         MSVCP_size_t off, const wchar_t *str, MSVCP_size_t str_len)
3395 {
3396     return basic_string_wchar_replace_cstr_len(this, off, 0, str, str_len);
3397 }
3398
3399 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@II_W@Z */
3400 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0_W@Z */
3401 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IIG@Z */
3402 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0G@Z */
3403 DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_chn, 16)
3404 basic_string_wchar* __thiscall basic_string_wchar_insert_chn(basic_string_wchar *this,
3405         MSVCP_size_t off, MSVCP_size_t count, wchar_t ch)
3406 {
3407     return basic_string_wchar_replace_ch(this, off, 0, count, ch);
3408 }
3409
3410 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@I_W@Z */
3411 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@_K_W@Z */
3412 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@IG@Z */
3413 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@_KG@Z */
3414 DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_iter_chn, 20)
3415 void __thiscall basic_string_wchar_insert_iter_chn(basic_string_wchar *this,
3416         String_iterator_wchar where, MSVCP_size_t count, wchar_t ch)
3417 {
3418     String_iterator_wchar iter = { this, basic_string_wchar_ptr(this) };
3419     MSVCP_size_t off = MSVCP_basic_string_wchar_Pdif(where, iter);
3420
3421     basic_string_wchar_insert_chn(this, off, count, ch);
3422 }
3423
3424 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@_W@Z */
3425 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@_W@Z */
3426 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@G@Z */
3427 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@G@Z */
3428 DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_iter_ch, 20)
3429 String_iterator_wchar* __thiscall basic_string_wchar_insert_iter_ch(basic_string_wchar *this,
3430         String_iterator_wchar *ret, String_iterator_wchar where, wchar_t ch)
3431 {
3432     MSVCP_size_t off;
3433
3434     ret->bstr = this;
3435     ret->pos = basic_string_wchar_ptr(this);
3436     off = MSVCP_basic_string_wchar_Pdif(where, *ret);
3437
3438     basic_string_wchar_insert_chn(this, off, 1, ch);
3439     ret->pos = basic_string_wchar_ptr(this)+off;
3440     return ret;
3441 }
3442
3443 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
3444 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
3445 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
3446 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
3447 DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_iter_null, 16)
3448 String_iterator_wchar* __thiscall basic_string_wchar_insert_iter_null(basic_string_wchar *this,
3449         String_iterator_wchar *ret, String_iterator_wchar where)
3450 {
3451     return basic_string_wchar_insert_iter_ch(this, ret, where, 0);
3452 }
3453
3454 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@00@Z */
3455 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@00@Z */
3456 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@00@Z */
3457 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@00@Z */
3458 DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_iter_beg_end, 28)
3459 void __thiscall basic_string_wchar_insert_iter_beg_end(basic_string_wchar *this,
3460         String_iterator_wchar where, String_iterator_wchar beg, String_iterator_wchar end)
3461 {
3462     basic_string_wchar_replace_iter_iter(this, where, where, beg, end);
3463 }
3464
3465 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W1@Z */
3466 /* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W1@Z */
3467 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG1@Z */
3468 /* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG1@Z */
3469 DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_iter_ptr_ptr, 20)
3470 void __thiscall basic_string_wchar_insert_iter_ptr_ptr(basic_string_wchar *this,
3471         String_iterator_wchar where, const wchar_t *beg, const wchar_t *end)
3472 {
3473     basic_string_wchar_replace_iter_ptr_ptr(this, where, where, beg, end);
3474 }
3475
3476 /* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAA_WI@Z */
3477 /* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEA_W_K@Z */
3478 /* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAGI@Z */
3479 /* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAG_K@Z */
3480 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_operator_at, 8)
3481 wchar_t* __thiscall MSVCP_basic_string_wchar_operator_at(
3482         basic_string_wchar *this, MSVCP_size_t pos)
3483 {
3484     TRACE("%p %lu\n", this, pos);
3485
3486     assert(this->size >= pos);
3487     return basic_string_wchar_ptr(this)+pos;
3488 }
3489
3490 /* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEAB_WI@Z */
3491 /* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAAEB_W_K@Z */
3492 /* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEABGI@Z */
3493 /* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAAEBG_K@Z */
3494 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_const_operator_at, 8)
3495 const wchar_t* __thiscall MSVCP_basic_string_wchar_const_operator_at(
3496         const basic_string_wchar *this, MSVCP_size_t pos)
3497 {
3498     TRACE("%p %lu\n", this, pos);
3499
3500     assert(this->size >= pos);
3501     return basic_string_wchar_const_ptr(this)+pos;
3502 }
3503
3504 /* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAA_WU_Size_type_nosscl@01@@Z */
3505 /* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEA_WU_Size_type_nosscl@01@@Z */
3506 /* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAGU_Size_type_nosscl@01@@Z */
3507 /* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAGU_Size_type_nosscl@01@@Z */
3508 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_operator_at_noverify, 8)
3509 wchar_t* __thiscall MSVCP_basic_string_wchar_operator_at_noverify(
3510         basic_string_wchar *this, size_t_noverify pos)
3511 {
3512     TRACE("%p %lu\n", this, pos.val);
3513     return basic_string_wchar_ptr(this)+pos.val;
3514 }
3515
3516 /* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEAB_WU_Size_type_nosscl@01@@Z */
3517 /* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAAEB_WU_Size_type_nosscl@01@@Z */
3518 /* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEABGU_Size_type_nosscl@01@@Z */
3519 /* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAAEBGU_Size_type_nosscl@01@@Z */
3520 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_operator_const_at_noverify, 8)
3521 const wchar_t* __thiscall MSVCP_basic_string_wchar_operator_const_at_noverify(
3522         const basic_string_wchar *this, size_t_noverify pos)
3523 {
3524     TRACE("%p %lu\n", this, pos.val);
3525     return basic_string_wchar_const_ptr(this)+pos.val;
3526 }
3527
3528 /* ?at@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAA_WI@Z */
3529 /* ?at@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEA_W_K@Z */
3530 /* ?at@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAGI@Z */
3531 /* ?at@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAG_K@Z */
3532 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_at, 8)
3533 wchar_t* __thiscall MSVCP_basic_string_wchar_at(
3534         basic_string_wchar *this, MSVCP_size_t pos)
3535 {
3536     TRACE("%p %lu\n", this, pos);
3537
3538     if(this->size <= pos)
3539         MSVCP__String_base_Xran();
3540
3541     return basic_string_wchar_ptr(this)+pos;
3542 }
3543
3544 /* ?at@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEAB_WI@Z */
3545 /* ?at@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAAEB_W_K@Z */
3546 /* ?at@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEABGI@Z */
3547 /* ?at@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAAEBG_K@Z */
3548 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_const_at, 8)
3549 const wchar_t* __thiscall MSVCP_basic_string_wchar_const_at(
3550         const basic_string_wchar *this, MSVCP_size_t pos)
3551 {
3552     TRACE("%p %lu\n", this, pos);
3553
3554     if(this->size <= pos)
3555         MSVCP__String_base_Xran();
3556
3557     return basic_string_wchar_const_ptr(this)+pos;
3558 }
3559
3560 /* ?resize@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXI_W@Z */
3561 /* ?resize@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAX_K_W@Z */
3562 /* ?resize@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXIG@Z */
3563 /* ?resize@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAX_KG@Z */
3564 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_resize_ch, 12)
3565 void __thiscall MSVCP_basic_string_wchar_resize_ch(
3566         basic_string_wchar *this, MSVCP_size_t size, wchar_t ch)
3567 {
3568     TRACE("%p %lu %c\n", this, size, ch);
3569
3570     if(size <= this->size)
3571         MSVCP_basic_string_wchar_erase(this, size, this->size);
3572     else
3573         MSVCP_basic_string_wchar_append_len_ch(this, size-this->size, ch);
3574 }
3575
3576 /* ?resize@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXI@Z */
3577 /* ?resize@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAX_K@Z */
3578 /* ?resize@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXI@Z */
3579 /* ?resize@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAX_K@Z */
3580 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_resize, 8)
3581 void __thiscall MSVCP_basic_string_wchar_resize(
3582         basic_string_wchar *this, MSVCP_size_t size)
3583 {
3584     MSVCP_basic_string_wchar_resize_ch(this, size, '\0');
3585 }
3586
3587 /* ?clear@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */
3588 /* ?clear@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXXZ */
3589 /* ?clear@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
3590 /* ?clear@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
3591 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_clear, 4)
3592 void __thiscall MSVCP_basic_string_wchar_clear(basic_string_wchar *this)
3593 {
3594     basic_string_wchar_eos(this, 0);
3595 }
3596
3597 /* ?begin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3598 /* ?begin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3599 /* ?begin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3600 /* ?begin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3601 /* ?begin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3602 /* ?begin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3603 /* ?begin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3604 /* ?begin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3605 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_begin, 8)
3606 String_iterator_wchar* __thiscall MSVCP_basic_string_wchar_begin(
3607         basic_string_wchar *this, String_iterator_wchar *ret)
3608 {
3609     TRACE("%p\n", this);
3610
3611     ret->bstr = this;
3612     ret->pos = basic_string_wchar_const_ptr(this);
3613     return ret;
3614 }
3615
3616 /* ?end@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3617 /* ?end@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3618 /* ?end@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3619 /* ?end@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3620 /* ?end@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3621 /* ?end@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3622 /* ?end@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3623 /* ?end@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3624 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_end, 8)
3625 String_iterator_wchar* __thiscall MSVCP_basic_string_wchar_end(
3626         basic_string_wchar *this, String_iterator_wchar *ret)
3627 {
3628     TRACE("%p\n", this);
3629
3630     ret->bstr = this;
3631     ret->pos = basic_string_wchar_const_ptr(this)+this->size;
3632     return ret;
3633 }
3634
3635 /* ?rbegin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$reverse_iterator@V?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
3636 /* ?rbegin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$reverse_iterator@V?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
3637 /* ?rbegin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$reverse_iterator@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
3638 /* ?rbegin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$reverse_iterator@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
3639 /* ?rbegin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$reverse_iterator@V?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
3640 /* ?rbegin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$reverse_iterator@V?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
3641 /* ?rbegin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$reverse_iterator@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
3642 /* ?rbegin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$reverse_iterator@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
3643 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_rbegin, 8)
3644 String_reverse_iterator_wchar* __thiscall MSVCP_basic_string_wchar_rbegin(
3645         basic_string_wchar *this, String_reverse_iterator_wchar *ret)
3646 {
3647     TRACE("%p\n", this);
3648
3649     ret->bstr = this;
3650     ret->pos = basic_string_wchar_const_ptr(this)+this->size;
3651     return ret;
3652 }
3653
3654 /* ?rend@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$reverse_iterator@V?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
3655 /* ?rend@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$reverse_iterator@V?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
3656 /* ?rend@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$reverse_iterator@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
3657 /* ?rend@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$reverse_iterator@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
3658 /* ?rend@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$reverse_iterator@V?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
3659 /* ?rend@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$reverse_iterator@V?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
3660 /* ?rend@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$reverse_iterator@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
3661 /* ?rend@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$reverse_iterator@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
3662 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_rend, 8)
3663 String_reverse_iterator_wchar* __thiscall MSVCP_basic_string_wchar_rend(
3664         basic_string_wchar *this, String_reverse_iterator_wchar *ret)
3665 {
3666     TRACE("%p\n", this);
3667
3668     ret->bstr = this;
3669     ret->pos = basic_string_wchar_const_ptr(this);
3670     return ret;
3671 }
3672
3673 /* _String_val class */
3674 /* ??_F?$_String_val@DV?$allocator@D@std@@@std@@QAEXXZ */
3675 /* ??_F?$_String_val@DV?$allocator@D@std@@@std@@QEAAXXZ */
3676 /* ??_F?$_String_val@GV?$allocator@G@std@@@std@@QAEXXZ */
3677 /* ??_F?$_String_val@GV?$allocator@G@std@@@std@@QEAAXXZ */
3678 /* ??_F?$_String_val@_WV?$allocator@_W@std@@@std@@QAEXXZ */
3679 /* ??_F?$_String_val@_WV?$allocator@_W@std@@@std@@QEAAXXZ */
3680 DEFINE_THISCALL_WRAPPER(_String_val_ctor, 4)
3681 void* __thiscall _String_val_ctor(void *this)
3682 {
3683     TRACE("%p\n", this);
3684     return this;
3685 }
3686
3687 /* ??0?$_String_val@DV?$allocator@D@std@@@std@@IAE@V?$allocator@D@1@@Z */
3688 /* ??0?$_String_val@DV?$allocator@D@std@@@std@@IEAA@V?$allocator@D@1@@Z */
3689 /* ??0?$_String_val@GV?$allocator@G@std@@@std@@IAE@V?$allocator@G@1@@Z */
3690 /* ??0?$_String_val@GV?$allocator@G@std@@@std@@IEAA@V?$allocator@G@1@@Z */
3691 /* ??0?$_String_val@_WV?$allocator@_W@std@@@std@@IAE@V?$allocator@_W@1@@Z */
3692 /* ??0?$_String_val@_WV?$allocator@_W@std@@@std@@IEAA@V?$allocator@_W@1@@Z */
3693 /* ??0?$_String_val@DV?$allocator@D@std@@@std@@QAE@ABV01@@Z */
3694 /* ??0?$_String_val@DV?$allocator@D@std@@@std@@QEAA@AEBV01@@Z */
3695 /* ??0?$_String_val@GV?$allocator@G@std@@@std@@QAE@ABV01@@Z */
3696 /* ??0?$_String_val@GV?$allocator@G@std@@@std@@QEAA@AEBV01@@Z */
3697 /* ??0?$_String_val@_WV?$allocator@_W@std@@@std@@QAE@ABV01@@Z */
3698 /* ??0?$_String_val@_WV?$allocator@_W@std@@@std@@QEAA@AEBV01@@Z */
3699 /* ??4?$_String_val@DV?$allocator@D@std@@@std@@QAEAAV01@ABV01@@Z */
3700 /* ??4?$_String_val@DV?$allocator@D@std@@@std@@QEAAAEAV01@AEBV01@@Z */
3701 /* ??4?$_String_val@GV?$allocator@G@std@@@std@@QAEAAV01@ABV01@@Z */
3702 /* ??4?$_String_val@GV?$allocator@G@std@@@std@@QEAAAEAV01@AEBV01@@Z */
3703 /* ??4?$_String_val@_WV?$allocator@_W@std@@@std@@QAEAAV01@ABV01@@Z */
3704 /* ??4?$_String_val@_WV?$allocator@_W@std@@@std@@QEAAAEAV01@AEBV01@@Z */
3705 /* ??4?$_String_val@DV?$allocator@D@std@@@std@@QAEAAV01@ABV01@@Z */
3706 DEFINE_THISCALL_WRAPPER(_String_val_null_ctor, 8)
3707 void* __thiscall _String_val_null_ctor(void *this, const void *misc)
3708 {
3709     TRACE("%p %p\n", this, misc);
3710     return this;
3711 }