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