2 * msvcrt.dll wide-char functions
4 * Copyright 1999 Alexandre Julliard
5 * Copyright 2000 Jon Griffiths
11 #include "wine/unicode.h"
13 #include "msvcrt/stdio.h"
14 #include "msvcrt/stdlib.h"
15 #include "msvcrt/string.h"
16 #include "msvcrt/wctype.h"
18 #include "wine/debug.h"
20 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
23 /* INTERNAL: MSVCRT_malloc() based wstrndup */
24 WCHAR* msvcrt_wstrndup(LPCWSTR buf, unsigned int size)
27 unsigned int len = strlenW(buf), max_len;
29 max_len = size <= len? size : len + 1;
31 ret = MSVCRT_malloc(max_len * sizeof (WCHAR));
34 memcpy(ret,buf,max_len * sizeof (WCHAR));
40 /*********************************************************************
43 WCHAR* _wcsdup( const WCHAR* str )
48 int size = (strlenW(str) + 1) * sizeof(WCHAR);
49 ret = MSVCRT_malloc( size );
50 if (ret) memcpy( ret, str, size );
55 /*********************************************************************
56 * _wcsicoll (MSVCRT.@)
58 INT _wcsicoll( const WCHAR* str1, const WCHAR* str2 )
60 /* FIXME: handle collates */
61 return strcmpiW( str1, str2 );
64 /*********************************************************************
67 WCHAR* _wcsnset( WCHAR* str, WCHAR c, MSVCRT_size_t n )
70 while ((n-- > 0) && *str) *str++ = c;
74 /*********************************************************************
77 WCHAR* _wcsrev( WCHAR* str )
80 WCHAR* end = str + strlenW(str) - 1;
90 /*********************************************************************
93 WCHAR* _wcsset( WCHAR* str, WCHAR c )
96 while (*str) *str++ = c;
100 /*********************************************************************
101 * _vsnwprintf (MSVCRT.@)
103 int _vsnwprintf(WCHAR *str, unsigned int len,
104 const WCHAR *format, va_list valist)
106 /* If you fix a bug in this function, fix it in ntdll/wcstring.c also! */
107 unsigned int written = 0;
108 const WCHAR *iter = format;
109 char bufa[256], fmtbufa[64], *fmta;
111 TRACE("(%d,%s)\n",len,debugstr_w(format));
115 while (*iter && *iter != (WCHAR)L'%')
117 if (written++ >= len)
121 if (*iter == (WCHAR)L'%')
125 while (*iter == (WCHAR)L'0' ||
126 *iter == (WCHAR)L'+' ||
127 *iter == (WCHAR)L'-' ||
128 *iter == (WCHAR)L' ' ||
129 *iter == (WCHAR)L'0' ||
130 *iter == (WCHAR)L'*' ||
131 *iter == (WCHAR)L'#')
133 if (*iter == (WCHAR)L'*')
135 char *buffiter = bufa;
136 int fieldlen = va_arg(valist, int);
137 sprintf(buffiter, "%d", fieldlen);
139 *fmta++ = *buffiter++;
146 while (isdigit(*iter))
149 if (*iter == (WCHAR)L'.')
152 if (*iter == (WCHAR)L'*')
154 char *buffiter = bufa;
155 int fieldlen = va_arg(valist, int);
156 sprintf(buffiter, "%d", fieldlen);
158 *fmta++ = *buffiter++;
161 while (isdigit(*iter))
164 if (*iter == (WCHAR)L'h' ||
165 *iter == (WCHAR)L'l')
175 static const WCHAR none[] = { '(', 'n', 'u', 'l', 'l', ')', 0 };
176 const WCHAR *wstr = va_arg(valist, const WCHAR *);
177 const WCHAR *striter = wstr ? wstr : none;
180 if (written++ >= len)
189 if (written++ >= len)
191 *str++ = (WCHAR)va_arg(valist, int);
197 /* For non wc types, use system sprintf and append to wide char output */
198 /* FIXME: for unrecognised types, should ignore % when printing */
199 char *bufaiter = bufa;
200 if (*iter == (WCHAR)L'p')
201 sprintf(bufaiter, "%08lX", va_arg(valist, long));
206 if (*iter == (WCHAR)L'f')
207 sprintf(bufaiter, fmtbufa, va_arg(valist, double));
209 sprintf(bufaiter, fmtbufa, va_arg(valist, void *));
213 if (written++ >= len)
215 *str++ = *bufaiter++;
225 *str++ = (WCHAR)L'\0';
229 /*********************************************************************
230 * vswprintf (MSVCRT.@)
232 int MSVCRT_vswprintf( WCHAR* str, const WCHAR* format, va_list args )
234 return _vsnwprintf( str, INT_MAX, format, args );
237 /*********************************************************************
240 int MSVCRT_wcscoll( const WCHAR* str1, const WCHAR* str2 )
242 /* FIXME: handle collates */
243 return strcmpW( str1, str2 );
246 /*********************************************************************
249 WCHAR* MSVCRT_wcspbrk( const WCHAR* str, const WCHAR* accept )
254 for (p = accept; *p; p++) if (*p == *str) return (WCHAR*)str;
260 /*********************************************************************
263 INT MSVCRT_wctomb( char *dst, WCHAR ch )
265 return WideCharToMultiByte( CP_ACP, 0, &ch, 1, dst, 6, NULL, NULL );
268 /*********************************************************************
269 * iswalnum (MSVCRT.@)
271 INT MSVCRT_iswalnum( WCHAR wc )
273 return isalnumW( wc );
276 /*********************************************************************
277 * iswalpha (MSVCRT.@)
279 INT MSVCRT_iswalpha( WCHAR wc )
281 return isalphaW( wc );
284 /*********************************************************************
285 * iswcntrl (MSVCRT.@)
287 INT MSVCRT_iswcntrl( WCHAR wc )
289 return iscntrlW( wc );
292 /*********************************************************************
293 * iswdigit (MSVCRT.@)
295 INT MSVCRT_iswdigit( WCHAR wc )
297 return isdigitW( wc );
300 /*********************************************************************
301 * iswgraph (MSVCRT.@)
303 INT MSVCRT_iswgraph( WCHAR wc )
305 return isgraphW( wc );
308 /*********************************************************************
309 * iswlower (MSVCRT.@)
311 INT MSVCRT_iswlower( WCHAR wc )
313 return islowerW( wc );
316 /*********************************************************************
317 * iswprint (MSVCRT.@)
319 INT MSVCRT_iswprint( WCHAR wc )
321 return isprintW( wc );
324 /*********************************************************************
325 * iswpunct (MSVCRT.@)
327 INT MSVCRT_iswpunct( WCHAR wc )
329 return ispunctW( wc );
332 /*********************************************************************
333 * iswspace (MSVCRT.@)
335 INT MSVCRT_iswspace( WCHAR wc )
337 return isspaceW( wc );
340 /*********************************************************************
341 * iswupper (MSVCRT.@)
343 INT MSVCRT_iswupper( WCHAR wc )
345 return isupperW( wc );
348 /*********************************************************************
349 * iswxdigit (MSVCRT.@)
351 INT MSVCRT_iswxdigit( WCHAR wc )
353 return isxdigitW( wc );
356 /*********************************************************************
359 WCHAR* _itow(int value,WCHAR* out,int base)
362 _itoa(value, buf, base);
363 MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, buf, -1, out, 128);
367 /*********************************************************************
370 WCHAR* _ltow(long value,WCHAR* out,int base)
373 _ltoa(value, buf, base);
374 MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, buf, -1, out, 128);