2 * Copyright 2010 Piotr Caban for CodeWeavers
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.
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.
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
26 #include "wine/debug.h"
27 WINE_DEFAULT_DEBUG_CHANNEL(msvcp90
);
29 /* char_traits<char> */
30 /* ?assign@?$char_traits@D@std@@SAXAADABD@Z */
31 void CDECL
MSVCP_char_traits_char_assign(char *ch
, const char *assign
)
36 /* ?eq@?$char_traits@D@std@@SA_NABD0@Z */
37 MSVCP_BOOL CDECL
MSVCP_char_traits_char_eq(const char *ch1
, const char *ch2
)
42 /* ?lt@?$char_traits@D@std@@SA_NABD0@Z */
43 MSVCP_BOOL CDECL
MSVCP_char_traits_lt(const char *ch1
, const char *ch2
)
48 /*?compare@?$char_traits@D@std@@SAHPBD0I@Z */
49 int CDECL
MSVCP_char_traits_char_compare(
50 const char *s1
, const char *s2
, unsigned int count
)
52 int ret
= memcmp(s1
, s2
, count
);
53 return (ret
>0 ? 1 : (ret
<0 ? -1 : 0));
56 /* ?length@?$char_traits@D@std@@SAIPBD@Z */
57 int CDECL
MSVCP_char_traits_char_length(const char *str
)
62 /* ?_Copy_s@?$char_traits@D@std@@SAPADPADIPBDI@Z */
63 char* CDECL
MSVCP_char_traits_char__Copy_s(char *dest
,
64 unsigned int size
, const char *src
, unsigned int count
)
66 if(!dest
|| !src
|| size
<count
) {
69 _invalid_parameter(NULL
, NULL
, NULL
, 0, 0);
73 return memcpy(dest
, src
, count
);
76 /* ?copy@?$char_traits@D@std@@SAPADPADPBDI@Z */
77 char* CDECL
MSVCP_char_traits_char_copy(
78 char *dest
, const char *src
, unsigned int count
)
80 return MSVCP_char_traits_char__Copy_s(dest
, count
, src
, count
);
83 /* ?find@?$char_traits@D@std@@SAPBDPBDIABD@Z */
84 const char * CDECL
MSVCP_char_traits_char_find(
85 const char *str
, unsigned int range
, const char *c
)
87 return memchr(str
, *c
, range
);
90 /* ?_Move_s@?$char_traits@D@std@@SAPADPADIPBDI@Z */
91 char* CDECL
MSVCP_char_traits_char__Move_s(char *dest
,
92 unsigned int size
, const char *src
, unsigned int count
)
94 if(!dest
|| !src
|| size
<count
) {
97 _invalid_parameter(NULL
, NULL
, NULL
, 0, 0);
101 return memmove(dest
, src
, count
);
104 /* ?move@?$char_traits@D@std@@SAPADPADPBDI@Z */
105 char* CDECL
MSVCP_char_traits_char_move(
106 char *dest
, const char *src
, unsigned int count
)
108 return MSVCP_char_traits_char__Move_s(dest
, count
, src
, count
);
111 /* ?assign@?$char_traits@D@std@@SAPADPADID@Z */
112 char* CDECL
MSVCP_char_traits_char_assignn(char *str
, unsigned int num
, char c
)
114 return memset(str
, c
, num
);
117 /* ?to_char_type@?$char_traits@D@std@@SADABH@Z */
118 char CDECL
MSVCP_char_traits_char_to_char_type(const int *i
)
123 /* ?to_int_type@?$char_traits@D@std@@SAHABD@Z */
124 int CDECL
MSVCP_char_traits_char_to_int_type(const char *ch
)
129 /* ?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z */
130 MSVCP_BOOL CDECL
MSVCP_char_traits_char_eq_int_type(const int *i1
, const int *i2
)
135 /* ?eof@?$char_traits@D@std@@SAHXZ */
136 int CDECL
MSVCP_char_traits_char_eof(void)
141 /* ?not_eof@?$char_traits@D@std@@SAHABH@Z */
142 int CDECL
MSVCP_char_traits_char_not_eof(int *in
)
144 return (*in
==EOF
? !EOF
: *in
);
148 /* char_traits<wchar_t> */
149 /* ?assign@?$char_traits@_W@std@@SAXAA_WAB_W@Z */
150 void CDECL
MSVCP_char_traits_wchar_assign(wchar_t *ch
,
151 const wchar_t *assign
)
156 /* ?eq@?$char_traits@_W@std@@SA_NAB_W0@Z */
157 MSVCP_BOOL CDECL
MSVCP_char_traits_wchar_eq(wchar_t *ch1
, wchar_t *ch2
)
162 /* ?lt@?$char_traits@_W@std@@SA_NAB_W0@Z */
163 MSVCP_BOOL CDECL
MSVCP_char_traits_wchar_lt(const wchar_t *ch1
,
169 /* ?compare@?$char_traits@_W@std@@SAHPB_W0I@Z */
170 int CDECL
MSVCP_char_traits_wchar_compare(const wchar_t *s1
,
171 const wchar_t *s2
, unsigned int count
)
173 int ret
= memcmp(s1
, s2
, sizeof(wchar_t[count
]));
174 return (ret
>0 ? 1 : (ret
<0 ? -1 : 0));
177 /* ?length@?$char_traits@_W@std@@SAIPB_W@Z */
178 int CDECL
MSVCP_char_traits_wchar_length(const wchar_t *str
)
180 return wcslen((WCHAR
*)str
);
183 /* ?_Copy_s@?$char_traits@_W@std@@SAPA_WPA_WIPB_WI@Z */
184 wchar_t* CDECL
MSVCP_char_traits_wchar__Copy_s(wchar_t *dest
,
185 unsigned int size
, const wchar_t *src
, unsigned int count
)
187 if(!dest
|| !src
|| size
<count
) {
190 _invalid_parameter(NULL
, NULL
, NULL
, 0, 0);
194 return memcpy(dest
, src
, sizeof(wchar_t[count
]));
197 /* ?copy@?$char_traits@_W@std@@SAPA_WPA_WPB_WI@Z */
198 wchar_t* CDECL
MSVCP_char_traits_wchar_copy(wchar_t *dest
,
199 const wchar_t *src
, unsigned int count
)
201 return MSVCP_char_traits_wchar__Copy_s(dest
, count
, src
, count
);
204 /* ?find@?$char_traits@_W@std@@SAPB_WPB_WIAB_W@Z */
205 const wchar_t* CDECL
MSVCP_char_traits_wchar_find(
206 const wchar_t *str
, unsigned int range
, const wchar_t *c
)
210 for(i
=0; i
<range
; i
++)
217 /* ?_Move_s@?$char_traits@_W@std@@SAPA_WPA_WIPB_WI@Z */
218 wchar_t* CDECL
MSVCP_char_traits_wchar__Move_s(wchar_t *dest
,
219 unsigned int size
, const wchar_t *src
, unsigned int count
)
221 if(!dest
|| !src
|| size
<count
) {
224 _invalid_parameter(NULL
, NULL
, NULL
, 0, 0);
228 return memmove(dest
, src
, sizeof(WCHAR
[count
]));
231 /* ?move@?$char_traits@_W@std@@SAPA_WPA_WPB_WI@Z */
232 wchar_t* CDECL
MSVCP_char_traits_wchar_move(wchar_t *dest
,
233 const wchar_t *src
, unsigned int count
)
235 return MSVCP_char_traits_wchar__Move_s(dest
, count
, src
, count
);
238 /* ?assign@?$char_traits@_W@std@@SAPA_WPA_WI_W@Z */
239 wchar_t* CDECL
MSVCP_char_traits_wchar_assignn(wchar_t *str
,
240 unsigned int num
, wchar_t c
)
250 /* ?to_char_type@?$char_traits@_W@std@@SA_WABG@Z */
251 wchar_t CDECL
MSVCP_char_traits_wchar_to_char_type(const unsigned short *i
)
256 /* ?to_int_type@?$char_traits@_W@std@@SAGAB_W@Z */
257 unsigned short CDECL
MSVCP_char_traits_wchar_to_int_type(const wchar_t *ch
)
262 /* ?eq_int_type@?$char_traits@_W@std@@SA_NABG0@Z */
263 MSVCP_BOOL CDECL
MSVCP_char_traits_wchar_eq_int_tpe(const unsigned short *i1
,
264 const unsigned short *i2
)
269 /* ?eof@?$char_traits@_W@std@@SAGXZ */
270 unsigned short CDECL
MSVCP_char_traits_wchar_eof(void)
275 /* ?not_eof@?$char_traits@_W@std@@SAGABG@Z */
276 unsigned short CDECL
MSVCP_char_traits_wchar_not_eof(const unsigned short *in
)
278 return (*in
==WEOF
? !WEOF
: *in
);
282 /* char_traits<unsigned short> */
283 /* ?assign@?$char_traits@G@std@@SAXAAGABG@Z */
284 void CDECL
MSVCP_char_traits_short_assign(unsigned short *ch
,
285 const unsigned short *assign
)
290 /* ?eq@?$char_traits@G@std@@SA_NABG0@Z */
291 MSVCP_BOOL CDECL
MSVCP_char_traits_short_eq(const unsigned short *ch1
,
292 const unsigned short *ch2
)
297 /* ?lt@?$char_traits@G@std@@SA_NABG0@Z */
298 MSVCP_BOOL CDECL
MSVCP_char_traits_short_lt(const unsigned short *ch1
,
299 const unsigned short *ch2
)
304 /* ?compare@?$char_traits@G@std@@SAHPBG0I@Z */
305 int CDECL
MSVCP_char_traits_short_compare(const unsigned short *s1
,
306 const unsigned short *s2
, unsigned int count
)
310 for(i
=0; i
<count
; i
++)
312 return (s1
[i
] < s2
[i
] ? -1 : 1);
317 /* ?length@?$char_traits@G@std@@SAIPBG@Z */
318 unsigned int CDECL
MSVCP_char_traits_short_length(const unsigned short *str
)
322 for(len
=0; str
[len
]; len
++);
327 /* ?_Copy_s@?$char_traits@G@std@@SAPAGPAGIPBGI@Z */
328 unsigned short * CDECL
MSVCP_char_traits_short__Copy_s(unsigned short *dest
,
329 unsigned int size
, const unsigned short *src
, unsigned int count
)
332 _invalid_parameter(NULL
, NULL
, NULL
, 0, 0);
336 return memcpy(dest
, src
, sizeof(unsigned short[count
]));
339 /* ?copy@?$char_traits@G@std@@SAPAGPAGPBGI@Z */
340 unsigned short* CDECL
MSVCP_char_traits_short_copy(unsigned short *dest
,
341 const unsigned short *src
, unsigned int count
)
343 return MSVCP_char_traits_short__Copy_s(dest
, count
, src
, count
);
346 /* ?find@?$char_traits@G@std@@SAPBGPBGIABG@Z */
347 const unsigned short* CDECL
MSVCP_char_traits_short_find(
348 const unsigned short *str
, unsigned int range
, const unsigned short *c
)
352 for(i
=0; i
<range
; i
++)
359 /* ?_Move_s@?$char_traits@G@std@@SAPAGPAGIPBGI@Z */
360 unsigned short* CDECL
MSVCP_char_traits_short__Move_s(unsigned short *dest
,
361 unsigned int size
, const unsigned short *src
, unsigned int count
)
364 _invalid_parameter(NULL
, NULL
, NULL
, 0, 0);
368 return memmove(dest
, src
, sizeof(unsigned short[count
]));
371 /* ?move@?$char_traits@G@std@@SAPAGPAGPBGI@Z */
372 unsigned short* CDECL
MSVCP_char_traits_short_move(unsigned short *dest
,
373 const unsigned short *src
, unsigned int count
)
375 return MSVCP_char_traits_short__Move_s(dest
, count
, src
, count
);
378 /* ?assign@?$char_traits@G@std@@SAPAGPAGIG@Z */
379 unsigned short* CDECL
MSVCP_char_traits_short_assignn(unsigned short *str
,
380 unsigned int num
, unsigned short c
)
390 /* ?to_char_type@?$char_traits@G@std@@SAGABG@Z */
391 unsigned short CDECL
MSVCP_char_traits_short_to_char_type(const unsigned short *i
)
396 /* ?to_int_type@?$char_traits@G@std@@SAGABG@Z */
397 unsigned short CDECL
MSVCP_char_traits_short_to_int_type(const unsigned short *ch
)
402 /* ?eq_int_type@?$char_traits@G@std@@SA_NABG0@Z */
403 MSVCP_BOOL CDECL
MSVCP_char_traits_short_eq_int_type(unsigned short *i1
,
409 /* ?eof@?$char_traits@G@std@@SAGXZ */
410 unsigned short CDECL
MSVCP_char_traits_short_eof(void)
415 /* ?not_eof@?$char_traits@G@std@@SAGABG@Z */
416 unsigned short CDECL
MSVCP_char_traits_short_not_eof(const unsigned short *in
)
418 return (*in
==(unsigned short)-1 ? 0 : *in
);