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