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