gameux: Add interface registration routines.
[wine/hramrach.git] / dlls / msvcp90 / string.c
bloba43acfd00c0e7ed4d8eaeb095914a00962ddbca4
1 /*
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
19 #include <stdarg.h>
21 #include "msvcp90.h"
22 #include "stdio.h"
24 #include "windef.h"
25 #include "winbase.h"
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)
33 *ch = *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)
39 return *ch1 == *ch2;
42 /* ?lt@?$char_traits@D@std@@SA_NABD0@Z */
43 MSVCP_BOOL CDECL MSVCP_char_traits_lt(const char *ch1, const char *ch2)
45 return *ch1 < *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)
59 return strlen(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) {
67 if(dest && size)
68 dest[0] = '\0';
69 _invalid_parameter(NULL, NULL, NULL, 0, 0);
70 return dest;
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) {
95 if(dest && size)
96 dest[0] = '\0';
97 _invalid_parameter(NULL, NULL, NULL, 0, 0);
98 return dest;
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)
120 return (char)*i;
123 /* ?to_int_type@?$char_traits@D@std@@SAHABD@Z */
124 int CDECL MSVCP_char_traits_char_to_int_type(const char *ch)
126 return (int)*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)
132 return *i1 == *i2;
135 /* ?eof@?$char_traits@D@std@@SAHXZ */
136 int CDECL MSVCP_char_traits_char_eof(void)
138 return EOF;
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)
153 *ch = *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)
159 return *ch1 == *ch2;
162 /* ?lt@?$char_traits@_W@std@@SA_NAB_W0@Z */
163 MSVCP_BOOL CDECL MSVCP_char_traits_wchar_lt(const wchar_t *ch1,
164 const wchar_t *ch2)
166 return *ch1 < *ch2;
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) {
188 if(dest && size)
189 dest[0] = '\0';
190 _invalid_parameter(NULL, NULL, NULL, 0, 0);
191 return dest;
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)
208 unsigned int i=0;
210 for(i=0; i<range; i++)
211 if(str[i] == *c)
212 return str+i;
214 return NULL;
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) {
222 if(dest && size)
223 dest[0] = '\0';
224 _invalid_parameter(NULL, NULL, NULL, 0, 0);
225 return dest;
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)
242 unsigned int i;
244 for(i=0; i<num; i++)
245 str[i] = c;
247 return str;
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)
253 return *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)
259 return *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)
266 return *i1 == *i2;
269 /* ?eof@?$char_traits@_W@std@@SAGXZ */
270 unsigned short CDECL MSVCP_char_traits_wchar_eof(void)
272 return WEOF;
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)
287 *ch = *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)
294 return *ch1 == *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)
301 return *ch1 < *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)
308 unsigned int i;
310 for(i=0; i<count; i++)
311 if(s1[i] != s2[i])
312 return (s1[i] < s2[i] ? -1 : 1);
314 return 0;
317 /* ?length@?$char_traits@G@std@@SAIPBG@Z */
318 unsigned int CDECL MSVCP_char_traits_short_length(const unsigned short *str)
320 unsigned int len;
322 for(len=0; str[len]; len++);
324 return 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)
331 if(size<count) {
332 _invalid_parameter(NULL, NULL, NULL, 0, 0);
333 return dest;
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)
350 unsigned int i;
352 for(i=0; i<range; i++)
353 if(str[i] == *c)
354 return str+i;
356 return NULL;
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)
363 if(size<count) {
364 _invalid_parameter(NULL, NULL, NULL, 0, 0);
365 return dest;
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)
382 unsigned int i;
384 for(i=0; i<num; i++)
385 str[i] = c;
387 return str;
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)
393 return *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)
399 return *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,
404 unsigned short *i2)
406 return *i1 == *i2;
409 /* ?eof@?$char_traits@G@std@@SAGXZ */
410 unsigned short CDECL MSVCP_char_traits_short_eof(void)
412 return -1;
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);