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
_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
_wcsicoll( LPCWSTR str1
, LPCWSTR str2
)
53 /* FIXME: handle collates */
54 return strcmpiW( str1
, str2
);
57 /*********************************************************************
60 LPWSTR
_wcsnset( LPWSTR str
, WCHAR c
, INT n
)
63 while ((n
-- > 0) && *str
) *str
++ = c
;
67 /*********************************************************************
70 LPWSTR
_wcsrev( LPWSTR str
)
73 LPWSTR end
= str
+ strlenW(str
) - 1;
83 /*********************************************************************
86 LPWSTR
_wcsset( LPWSTR str
, WCHAR c
)
89 while (*str
) *str
++ = c
;
93 /*********************************************************************
94 * _vsnwprintf (MSVCRT.@)
96 int _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 MSVCRT_vswprintf( LPWSTR str
, LPCWSTR format
, va_list args
)
224 return _vsnwprintf( str
, INT_MAX
, format
, args
);
227 /*********************************************************************
230 DWORD
MSVCRT_wcscoll( LPCWSTR str1
, LPCWSTR str2
)
232 /* FIXME: handle collates */
233 return strcmpW( str1
, str2
);
236 /*********************************************************************
239 LPWSTR
MSVCRT_wcspbrk( LPCWSTR str
, LPCWSTR accept
)
244 for (p
= accept
; *p
; p
++) if (*p
== *str
) return (LPWSTR
)str
;
250 /*********************************************************************
253 INT
MSVCRT_wctomb( char *dst
, WCHAR ch
)
255 return WideCharToMultiByte( CP_ACP
, 0, &ch
, 1, dst
, 6, NULL
, NULL
);
258 /*********************************************************************
259 * iswalnum (MSVCRT.@)
261 INT
MSVCRT_iswalnum( WCHAR wc
)
263 return get_char_typeW(wc
) & (C1_ALPHA
|C1_DIGIT
|C1_LOWER
|C1_UPPER
);
266 /*********************************************************************
267 * iswalpha (MSVCRT.@)
269 INT
MSVCRT_iswalpha( WCHAR wc
)
271 return get_char_typeW(wc
) & (C1_ALPHA
|C1_LOWER
|C1_UPPER
);
274 /*********************************************************************
275 * iswcntrl (MSVCRT.@)
277 INT
MSVCRT_iswcntrl( WCHAR wc
)
279 return get_char_typeW(wc
) & C1_CNTRL
;
282 /*********************************************************************
283 * iswdigit (MSVCRT.@)
285 INT
MSVCRT_iswdigit( WCHAR wc
)
287 return get_char_typeW(wc
) & C1_DIGIT
;
290 /*********************************************************************
291 * iswgraph (MSVCRT.@)
293 INT
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
MSVCRT_iswlower( WCHAR wc
)
303 return get_char_typeW(wc
) & C1_LOWER
;
306 /*********************************************************************
307 * iswprint (MSVCRT.@)
309 INT
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
MSVCRT_iswpunct( WCHAR wc
)
319 return get_char_typeW(wc
) & C1_PUNCT
;
322 /*********************************************************************
323 * iswspace (MSVCRT.@)
325 INT
MSVCRT_iswspace( WCHAR wc
)
327 return get_char_typeW(wc
) & C1_SPACE
;
330 /*********************************************************************
331 * iswupper (MSVCRT.@)
333 INT
MSVCRT_iswupper( WCHAR wc
)
335 return get_char_typeW(wc
) & C1_UPPER
;
338 /*********************************************************************
339 * iswxdigit (MSVCRT.@)
341 INT
MSVCRT_iswxdigit( WCHAR wc
)
343 return get_char_typeW(wc
) & C1_XDIGIT
;
346 extern char *_itoa( long , char *, int);
347 extern char *_ultoa( long , char *, int);
348 extern char *_ltoa( long , char *, int);
350 /*********************************************************************
353 WCHAR
* _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
* _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
* _ultow(unsigned long value
,WCHAR
* out
,int base
)
378 _ultoa(value
, buf
, base
);
379 MultiByteToWideChar (CP_ACP
, MB_PRECOMPOSED
, buf
, -1, out
, 128);