2 * msvcrt.dll wide-char functions
4 * Copyright 1999 Alexandre Julliard
5 * Copyright 2000 Jon Griffiths
11 #include "wine/unicode.h"
13 DEFAULT_DEBUG_CHANNEL(msvcrt);
16 /* INTERNAL: MSVCRT_malloc() based wstrndup */
17 LPWSTR MSVCRT__wstrndup(LPCWSTR buf, unsigned int size)
20 unsigned int len = strlenW(buf), max_len;
22 max_len = size <= len? size : len + 1;
24 ret = MSVCRT_malloc(max_len * sizeof (WCHAR));
27 memcpy(ret,buf,max_len * sizeof (WCHAR));
33 /*********************************************************************
36 LPWSTR __cdecl MSVCRT__wcsdup( LPCWSTR str )
41 int size = (strlenW(str) + 1) * sizeof(WCHAR);
42 ret = MSVCRT_malloc( size );
43 if (ret) memcpy( ret, str, size );
48 /*********************************************************************
49 * _wcsicoll (MSVCRT.@)
51 INT __cdecl MSVCRT__wcsicoll( LPCWSTR str1, LPCWSTR str2 )
53 /* FIXME: handle collates */
54 return strcmpiW( str1, str2 );
57 /*********************************************************************
60 LPWSTR __cdecl MSVCRT__wcsnset( LPWSTR str, WCHAR c, INT n )
63 while ((n-- > 0) && *str) *str++ = c;
67 /*********************************************************************
70 LPWSTR __cdecl MSVCRT__wcsrev( LPWSTR str )
73 LPWSTR end = str + strlenW(str) - 1;
83 /*********************************************************************
86 LPWSTR __cdecl MSVCRT__wcsset( LPWSTR str, WCHAR c )
89 while (*str) *str++ = c;
93 /*********************************************************************
94 * _vsnwprintf (MSVCRT.@)
96 int __cdecl MSVCRT__vsnwprintf(WCHAR *str, unsigned int len,
97 const WCHAR *format, va_list valist)
99 /* If you fix a bug in this function, fix it in ntdll/wcstring.c also! */
100 unsigned int written = 0;
101 const WCHAR *iter = format;
102 char bufa[256], fmtbufa[64], *fmta;
104 TRACE("(%d,%s)\n",len,debugstr_w(format));
108 while (*iter && *iter != (WCHAR)L'%')
110 if (written++ >= len)
114 if (*iter == (WCHAR)L'%')
118 while (*iter == (WCHAR)L'0' ||
119 *iter == (WCHAR)L'+' ||
120 *iter == (WCHAR)L'-' ||
121 *iter == (WCHAR)L' ' ||
122 *iter == (WCHAR)L'0' ||
123 *iter == (WCHAR)L'*' ||
124 *iter == (WCHAR)L'#')
126 if (*iter == (WCHAR)L'*')
128 char *buffiter = bufa;
129 int fieldlen = va_arg(valist, int);
130 sprintf(buffiter, "%d", fieldlen);
132 *fmta++ = *buffiter++;
139 while (isdigit(*iter))
142 if (*iter == (WCHAR)L'.')
145 if (*iter == (WCHAR)L'*')
147 char *buffiter = bufa;
148 int fieldlen = va_arg(valist, int);
149 sprintf(buffiter, "%d", fieldlen);
151 *fmta++ = *buffiter++;
154 while (isdigit(*iter))
157 if (*iter == (WCHAR)L'h' ||
158 *iter == (WCHAR)L'l')
168 static const WCHAR none[] = { '(', 'n', 'u', 'l', 'l', ')', 0 };
169 const WCHAR *wstr = va_arg(valist, const WCHAR *);
170 const WCHAR *striter = wstr ? wstr : none;
173 if (written++ >= len)
182 if (written++ >= len)
184 *str++ = (WCHAR)va_arg(valist, int);
190 /* For non wc types, use system sprintf and append to wide char output */
191 /* FIXME: for unrecognised types, should ignore % when printing */
192 char *bufaiter = bufa;
193 if (*iter == (WCHAR)L'p')
194 sprintf(bufaiter, "%08lX", va_arg(valist, long));
199 sprintf(bufaiter, fmtbufa, va_arg(valist, void *));
203 if (written++ >= len)
205 *str++ = *bufaiter++;
215 *str++ = (WCHAR)L'\0';
219 /*********************************************************************
220 * vswprintf (MSVCRT.@)
222 int __cdecl MSVCRT_vswprintf( LPWSTR str, LPCWSTR format, va_list args )
224 return MSVCRT__vsnwprintf( str, INT_MAX, format, args );
227 /*********************************************************************
230 DWORD __cdecl MSVCRT_wcscoll( LPCWSTR str1, LPCWSTR str2 )
232 /* FIXME: handle collates */
233 return strcmpW( str1, str2 );
236 /*********************************************************************
239 LPWSTR __cdecl MSVCRT_wcspbrk( LPCWSTR str, LPCWSTR accept )
244 for (p = accept; *p; p++) if (*p == *str) return (LPWSTR)str;
250 /*********************************************************************
253 INT __cdecl MSVCRT_wctomb( char *dst, WCHAR ch )
255 return WideCharToMultiByte( CP_ACP, 0, &ch, 1, dst, 6, NULL, NULL );
258 /*********************************************************************
259 * iswalnum (MSVCRT.@)
261 INT __cdecl MSVCRT_iswalnum( WCHAR wc )
263 return get_char_typeW(wc) & (C1_ALPHA|C1_DIGIT|C1_LOWER|C1_UPPER);
266 /*********************************************************************
267 * iswalpha (MSVCRT.@)
269 INT __cdecl MSVCRT_iswalpha( WCHAR wc )
271 return get_char_typeW(wc) & (C1_ALPHA|C1_LOWER|C1_UPPER);
274 /*********************************************************************
275 * iswcntrl (MSVCRT.@)
277 INT __cdecl MSVCRT_iswcntrl( WCHAR wc )
279 return get_char_typeW(wc) & C1_CNTRL;
282 /*********************************************************************
283 * iswdigit (MSVCRT.@)
285 INT __cdecl MSVCRT_iswdigit( WCHAR wc )
287 return get_char_typeW(wc) & C1_DIGIT;
290 /*********************************************************************
291 * iswgraph (MSVCRT.@)
293 INT __cdecl MSVCRT_iswgraph( WCHAR wc )
295 return get_char_typeW(wc) & (C1_ALPHA|C1_PUNCT|C1_DIGIT|C1_LOWER|C1_UPPER);
298 /*********************************************************************
299 * iswlower (MSVCRT.@)
301 INT __cdecl MSVCRT_iswlower( WCHAR wc )
303 return get_char_typeW(wc) & C1_LOWER;
306 /*********************************************************************
307 * iswprint (MSVCRT.@)
309 INT __cdecl MSVCRT_iswprint( WCHAR wc )
311 return get_char_typeW(wc) & (C1_ALPHA|C1_BLANK|C1_PUNCT|C1_DIGIT|C1_LOWER|C1_UPPER);
314 /*********************************************************************
315 * iswpunct (MSVCRT.@)
317 INT __cdecl MSVCRT_iswpunct( WCHAR wc )
319 return get_char_typeW(wc) & C1_PUNCT;
322 /*********************************************************************
323 * iswspace (MSVCRT.@)
325 INT __cdecl MSVCRT_iswspace( WCHAR wc )
327 return get_char_typeW(wc) & C1_SPACE;
330 /*********************************************************************
331 * iswupper (MSVCRT.@)
333 INT __cdecl MSVCRT_iswupper( WCHAR wc )
335 return get_char_typeW(wc) & C1_UPPER;
338 /*********************************************************************
339 * iswxdigit (MSVCRT.@)
341 INT __cdecl MSVCRT_iswxdigit( WCHAR wc )
343 return get_char_typeW(wc) & C1_XDIGIT;
346 extern char *__cdecl _itoa( long , char *, int);
347 extern char *__cdecl _ultoa( long , char *, int);
348 extern char *__cdecl _ltoa( long , char *, int);
350 /*********************************************************************
353 WCHAR* __cdecl MSVCRT__itow(int value,WCHAR* out,int base)
356 _itoa(value, buf, base);
357 MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, buf, -1, out, 128);
361 /*********************************************************************
364 WCHAR* __cdecl MSVCRT__ltow(long value,WCHAR* out,int base)
367 _ltoa(value, buf, base);
368 MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, buf, -1, out, 128);
372 /*********************************************************************
375 WCHAR* __cdecl MSVCRT__ultow(unsigned long value,WCHAR* out,int base)
378 _ultoa(value, buf, base);
379 MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, buf, -1, out, 128);