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