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