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