2 * NTDLL wide-char functions
4 * Copyright 2000 Alexandre Julliard
5 * Copyright 2000 Jon Griffiths
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 #include "wine/unicode.h"
32 #include "wine/debug.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(ntdll
);
37 /*********************************************************************
40 INT __cdecl
NTDLL__wcsicmp( LPCWSTR str1
, LPCWSTR str2
)
42 return strcmpiW( str1
, str2
);
46 /*********************************************************************
49 LPWSTR __cdecl
NTDLL__wcslwr( LPWSTR str
)
51 return strlwrW( str
);
55 /*********************************************************************
58 INT __cdecl
NTDLL__wcsnicmp( LPCWSTR str1
, LPCWSTR str2
, INT n
)
60 return strncmpiW( str1
, str2
, n
);
64 /*********************************************************************
67 LPWSTR __cdecl
NTDLL__wcsupr( LPWSTR str
)
69 return struprW( str
);
73 /*********************************************************************
76 WCHAR __cdecl
NTDLL_towlower( WCHAR ch
)
82 /*********************************************************************
85 WCHAR __cdecl
NTDLL_towupper( WCHAR ch
)
91 /***********************************************************************
94 LPWSTR __cdecl
NTDLL_wcscat( LPWSTR dst
, LPCWSTR src
)
96 return strcatW( dst
, src
);
100 /*********************************************************************
103 LPWSTR __cdecl
NTDLL_wcschr( LPCWSTR str
, WCHAR ch
)
105 return strchrW( str
, ch
);
109 /*********************************************************************
112 INT __cdecl
NTDLL_wcscmp( LPCWSTR str1
, LPCWSTR str2
)
114 return strcmpW( str1
, str2
);
118 /***********************************************************************
121 LPWSTR __cdecl
NTDLL_wcscpy( LPWSTR dst
, LPCWSTR src
)
123 return strcpyW( dst
, src
);
127 /*********************************************************************
130 INT __cdecl
NTDLL_wcscspn( LPCWSTR str
, LPCWSTR reject
)
136 while (*p
&& (*p
!= *str
)) p
++;
144 /***********************************************************************
147 INT __cdecl
NTDLL_wcslen( LPCWSTR str
)
149 return strlenW( str
);
153 /*********************************************************************
156 LPWSTR __cdecl
NTDLL_wcsncat( LPWSTR s1
, LPCWSTR s2
, INT n
)
160 while (n
-- > 0) if (!(*s1
++ = *s2
++)) return ret
;
166 /*********************************************************************
169 INT __cdecl
NTDLL_wcsncmp( LPCWSTR str1
, LPCWSTR str2
, INT n
)
171 return strncmpW( str1
, str2
, n
);
175 /*********************************************************************
178 LPWSTR __cdecl
NTDLL_wcsncpy( LPWSTR s1
, LPCWSTR s2
, INT n
)
180 return strncpyW( s1
, s2
, n
);
184 /*********************************************************************
187 LPWSTR __cdecl
NTDLL_wcspbrk( LPCWSTR str
, LPCWSTR accept
)
192 for (p
= accept
; *p
; p
++) if (*p
== *str
) return (LPWSTR
)str
;
199 /*********************************************************************
202 LPWSTR __cdecl
NTDLL_wcsrchr( LPWSTR str
, WCHAR ch
)
207 if (*str
== ch
) last
= str
;
214 /*********************************************************************
217 INT __cdecl
NTDLL_wcsspn( LPCWSTR str
, LPCWSTR accept
)
223 while (*p
&& (*p
!= *str
)) p
++;
231 /*********************************************************************
234 LPWSTR __cdecl
NTDLL_wcsstr( LPCWSTR str
, LPCWSTR sub
)
236 return strstrW( str
, sub
);
240 /*********************************************************************
243 LPWSTR __cdecl
NTDLL_wcstok( LPWSTR str
, LPCWSTR delim
)
245 static LPWSTR next
= NULL
;
249 if (!(str
= next
)) return NULL
;
251 while (*str
&& NTDLL_wcschr( delim
, *str
)) str
++;
252 if (!*str
) return NULL
;
254 while (*str
&& !NTDLL_wcschr( delim
, *str
)) str
++;
255 if (*str
) *str
++ = 0;
261 /*********************************************************************
264 INT __cdecl
NTDLL_wcstombs( LPSTR dst
, LPCWSTR src
, INT n
)
270 RtlUnicodeToMultiByteSize( &len
, src
, strlenW(src
)*sizeof(WCHAR
) );
275 if (n
<= 0) return 0;
276 RtlUnicodeToMultiByteN( dst
, n
, &len
, src
, strlenW(src
)*sizeof(WCHAR
) );
277 if (len
< n
) dst
[len
] = 0;
283 /*********************************************************************
286 INT __cdecl
NTDLL_mbstowcs( LPWSTR dst
, LPCSTR src
, INT n
)
292 RtlMultiByteToUnicodeSize( &len
, src
, strlen(src
) );
296 if (n
<= 0) return 0;
297 RtlMultiByteToUnicodeN( dst
, n
*sizeof(WCHAR
), &len
, src
, strlen(src
) );
298 if (len
/ sizeof(WCHAR
) < n
) dst
[len
/ sizeof(WCHAR
)] = 0;
300 return len
/ sizeof(WCHAR
);
304 /*********************************************************************
307 long __cdecl
NTDLL_wcstol(LPCWSTR s
,LPWSTR
*end
,INT base
)
309 return strtolW( s
, end
, base
);
313 /*********************************************************************
316 unsigned long __cdecl
NTDLL_wcstoul(LPCWSTR s
,LPWSTR
*end
,INT base
)
318 return strtoulW( s
, end
, base
);
322 /*********************************************************************
325 INT __cdecl
NTDLL_iswctype( WCHAR wc
, WCHAR wct
)
327 return (get_char_typeW(wc
) & 0xfff) & wct
;
331 /*********************************************************************
334 INT __cdecl
NTDLL_iswalpha( WCHAR wc
)
336 return get_char_typeW(wc
) & C1_ALPHA
;
340 /*********************************************************************
342 * Like _ultoa, but for wide character strings.
344 LPWSTR __cdecl
_ultow(ULONG value
, LPWSTR string
, INT radix
)
352 if (radix
> 36 || radix
<= 1)
355 while (v
|| tp
== tmp
)
362 *tp
++ = i
+ 'a' - 10;
372 /*********************************************************************
374 * Like atol, but for wide character strings.
376 LONG __cdecl
NTDLL__wtol(LPWSTR string
)
378 return strtolW( string
, NULL
, 10 );
381 /*********************************************************************
384 INT __cdecl
NTDLL__wtoi(LPWSTR string
)
386 return NTDLL__wtol(string
);
389 /* INTERNAL: Wide char snprintf
390 * If you fix a bug in this function, fix it in msvcrt/wcs.c also!
392 static int __cdecl
NTDLL_vsnwprintf(WCHAR
*str
, unsigned int len
,
393 const WCHAR
*format
, va_list valist
)
395 unsigned int written
= 0;
396 const WCHAR
*iter
= format
;
397 char bufa
[256], fmtbufa
[64], *fmta
;
399 TRACE("(%d,%s)\n",len
,debugstr_w(format
));
403 while (*iter
&& *iter
!= (WCHAR
)L
'%')
405 if (written
++ >= len
)
409 if (*iter
== (WCHAR
)L
'%')
413 while (*iter
== (WCHAR
)L
'0' ||
414 *iter
== (WCHAR
)L
'+' ||
415 *iter
== (WCHAR
)L
'-' ||
416 *iter
== (WCHAR
)L
' ' ||
417 *iter
== (WCHAR
)L
'0' ||
418 *iter
== (WCHAR
)L
'*' ||
419 *iter
== (WCHAR
)L
'#')
421 if (*iter
== (WCHAR
)L
'*')
423 char *buffiter
= bufa
;
424 int fieldlen
= va_arg(valist
, int);
425 sprintf(buffiter
, "%d", fieldlen
);
427 *fmta
++ = *buffiter
++;
434 while (isdigit(*iter
))
437 if (*iter
== (WCHAR
)L
'.')
440 if (*iter
== (WCHAR
)L
'*')
442 char *buffiter
= bufa
;
443 int fieldlen
= va_arg(valist
, int);
444 sprintf(buffiter
, "%d", fieldlen
);
446 *fmta
++ = *buffiter
++;
449 while (isdigit(*iter
))
452 if (*iter
== (WCHAR
)L
'h' ||
453 *iter
== (WCHAR
)L
'l')
460 static const WCHAR none
[] = { '(', 'n', 'u', 'l', 'l', ')', 0 };
461 const WCHAR
*wstr
= va_arg(valist
, const WCHAR
*);
462 const WCHAR
*striter
= wstr
? wstr
: none
;
465 if (written
++ >= len
)
474 if (written
++ >= len
)
476 *str
++ = (WCHAR
)va_arg(valist
, int);
482 /* For non wc types, use system sprintf and append to wide char output */
483 /* FIXME: for unrecognised types, should ignore % when printing */
484 char *bufaiter
= bufa
;
485 if (*iter
== (WCHAR
)L
'p')
486 sprintf(bufaiter
, "%08lX", va_arg(valist
, long));
491 if (*iter
== (WCHAR
)L
'f')
492 sprintf(bufaiter
, fmtbufa
, va_arg(valist
, double));
494 sprintf(bufaiter
, fmtbufa
, va_arg(valist
, void *));
498 if (written
++ >= len
)
500 *str
++ = *bufaiter
++;
510 *str
++ = (WCHAR
)L
'\0';
515 /***********************************************************************
516 * _snwprintf (NTDLL.@)
518 int __cdecl
_snwprintf(WCHAR
*str
, unsigned int len
, const WCHAR
*format
, ...)
522 va_start(valist
, format
);
523 retval
= NTDLL_vsnwprintf(str
, len
, format
, valist
);
529 /***********************************************************************
532 int __cdecl
NTDLL_swprintf(WCHAR
*str
, const WCHAR
*format
, ...)
536 va_start(valist
, format
);
537 retval
= NTDLL_vsnwprintf(str
, INT_MAX
, format
, valist
);