Added PE dump capabilities to specmaker and renamed specmaker into
[wine/wine-kai.git] / dlls / msvcrt / wcs.c
blobde26ec4b9a914de81b45683f8e262eeb5ec414db
1 /*
2 * msvcrt.dll wide-char functions
4 * Copyright 1999 Alexandre Julliard
5 * Copyright 2000 Jon Griffiths
6 */
7 #include <limits.h>
8 #include <stdio.h>
9 #include "msvcrt.h"
10 #include "winnls.h"
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 DEFAULT_DEBUG_CHANNEL(msvcrt);
21 /* INTERNAL: MSVCRT_malloc() based wstrndup */
22 WCHAR* msvcrt_wstrndup(LPCWSTR buf, unsigned int size)
24 WCHAR* ret;
25 unsigned int len = strlenW(buf), max_len;
27 max_len = size <= len? size : len + 1;
29 ret = MSVCRT_malloc(max_len * sizeof (WCHAR));
30 if (ret)
32 memcpy(ret,buf,max_len * sizeof (WCHAR));
33 ret[max_len] = 0;
35 return ret;
38 /*********************************************************************
39 * _wcsdup (MSVCRT.@)
41 WCHAR* _wcsdup( const WCHAR* str )
43 WCHAR* ret = NULL;
44 if (str)
46 int size = (strlenW(str) + 1) * sizeof(WCHAR);
47 ret = MSVCRT_malloc( size );
48 if (ret) memcpy( ret, str, size );
50 return ret;
53 /*********************************************************************
54 * _wcsicoll (MSVCRT.@)
56 INT _wcsicoll( const WCHAR* str1, const WCHAR* str2 )
58 /* FIXME: handle collates */
59 return strcmpiW( str1, str2 );
62 /*********************************************************************
63 * _wcsnset (MSVCRT.@)
65 WCHAR* _wcsnset( WCHAR* str, WCHAR c, MSVCRT_size_t n )
67 WCHAR* ret = str;
68 while ((n-- > 0) && *str) *str++ = c;
69 return ret;
72 /*********************************************************************
73 * _wcsrev (MSVCRT.@)
75 WCHAR* _wcsrev( WCHAR* str )
77 WCHAR* ret = str;
78 WCHAR* end = str + strlenW(str) - 1;
79 while (end > str)
81 WCHAR t = *end;
82 *end-- = *str;
83 *str++ = t;
85 return ret;
88 /*********************************************************************
89 * _wcsset (MSVCRT.@)
91 WCHAR* _wcsset( WCHAR* str, WCHAR c )
93 WCHAR* ret = str;
94 while (*str) *str++ = c;
95 return ret;
98 /*********************************************************************
99 * _vsnwprintf (MSVCRT.@)
101 int _vsnwprintf(WCHAR *str, unsigned int len,
102 const WCHAR *format, va_list valist)
104 /* If you fix a bug in this function, fix it in ntdll/wcstring.c also! */
105 unsigned int written = 0;
106 const WCHAR *iter = format;
107 char bufa[256], fmtbufa[64], *fmta;
109 TRACE("(%d,%s)\n",len,debugstr_w(format));
111 while (*iter)
113 while (*iter && *iter != (WCHAR)L'%')
115 if (written++ >= len)
116 return -1;
117 *str++ = *iter++;
119 if (*iter == (WCHAR)L'%')
121 fmta = fmtbufa;
122 *fmta++ = *iter++;
123 while (*iter == (WCHAR)L'0' ||
124 *iter == (WCHAR)L'+' ||
125 *iter == (WCHAR)L'-' ||
126 *iter == (WCHAR)L' ' ||
127 *iter == (WCHAR)L'0' ||
128 *iter == (WCHAR)L'*' ||
129 *iter == (WCHAR)L'#')
131 if (*iter == (WCHAR)L'*')
133 char *buffiter = bufa;
134 int fieldlen = va_arg(valist, int);
135 sprintf(buffiter, "%d", fieldlen);
136 while (*buffiter)
137 *fmta++ = *buffiter++;
139 else
140 *fmta++ = *iter;
141 iter++;
144 while (isdigit(*iter))
145 *fmta++ = *iter++;
147 if (*iter == (WCHAR)L'.')
149 *fmta++ = *iter++;
150 if (*iter == (WCHAR)L'*')
152 char *buffiter = bufa;
153 int fieldlen = va_arg(valist, int);
154 sprintf(buffiter, "%d", fieldlen);
155 while (*buffiter)
156 *fmta++ = *buffiter++;
158 else
159 while (isdigit(*iter))
160 *fmta++ = *iter++;
162 if (*iter == (WCHAR)L'h' ||
163 *iter == (WCHAR)L'l')
165 *fmta++ = *iter++;
166 *fmta++ = *iter++;
169 switch (*iter)
171 case (WCHAR)L's':
173 static const WCHAR none[] = { '(', 'n', 'u', 'l', 'l', ')', 0 };
174 const WCHAR *wstr = va_arg(valist, const WCHAR *);
175 const WCHAR *striter = wstr ? wstr : none;
176 while (*striter)
178 if (written++ >= len)
179 return -1;
180 *str++ = *striter++;
182 iter++;
183 break;
186 case (WCHAR)L'c':
187 if (written++ >= len)
188 return -1;
189 *str++ = (WCHAR)va_arg(valist, int);
190 iter++;
191 break;
193 default:
195 /* For non wc types, use system sprintf and append to wide char output */
196 /* FIXME: for unrecognised types, should ignore % when printing */
197 char *bufaiter = bufa;
198 if (*iter == (WCHAR)L'p')
199 sprintf(bufaiter, "%08lX", va_arg(valist, long));
200 else
202 *fmta++ = *iter;
203 *fmta = '\0';
204 if (*iter == (WCHAR)L'f')
205 sprintf(bufaiter, fmtbufa, va_arg(valist, double));
206 else
207 sprintf(bufaiter, fmtbufa, va_arg(valist, void *));
209 while (*bufaiter)
211 if (written++ >= len)
212 return -1;
213 *str++ = *bufaiter++;
215 iter++;
216 break;
221 if (written >= len)
222 return -1;
223 *str++ = (WCHAR)L'\0';
224 return (int)written;
227 /*********************************************************************
228 * vswprintf (MSVCRT.@)
230 int MSVCRT_vswprintf( WCHAR* str, const WCHAR* format, va_list args )
232 return _vsnwprintf( str, INT_MAX, format, args );
235 /*********************************************************************
236 * wcscoll (MSVCRT.@)
238 int MSVCRT_wcscoll( const WCHAR* str1, const WCHAR* str2 )
240 /* FIXME: handle collates */
241 return strcmpW( str1, str2 );
244 /*********************************************************************
245 * wcspbrk (MSVCRT.@)
247 WCHAR* MSVCRT_wcspbrk( const WCHAR* str, const WCHAR* accept )
249 const WCHAR* p;
250 while (*str)
252 for (p = accept; *p; p++) if (*p == *str) return (WCHAR*)str;
253 str++;
255 return NULL;
258 /*********************************************************************
259 * wctomb (MSVCRT.@)
261 INT MSVCRT_wctomb( char *dst, WCHAR ch )
263 return WideCharToMultiByte( CP_ACP, 0, &ch, 1, dst, 6, NULL, NULL );
266 /*********************************************************************
267 * iswalnum (MSVCRT.@)
269 INT MSVCRT_iswalnum( WCHAR wc )
271 return get_char_typeW(wc) & (C1_ALPHA|C1_DIGIT|C1_LOWER|C1_UPPER);
274 /*********************************************************************
275 * iswalpha (MSVCRT.@)
277 INT MSVCRT_iswalpha( WCHAR wc )
279 return get_char_typeW(wc) & (C1_ALPHA|C1_LOWER|C1_UPPER);
282 /*********************************************************************
283 * iswcntrl (MSVCRT.@)
285 INT MSVCRT_iswcntrl( WCHAR wc )
287 return get_char_typeW(wc) & C1_CNTRL;
290 /*********************************************************************
291 * iswdigit (MSVCRT.@)
293 INT MSVCRT_iswdigit( WCHAR wc )
295 return get_char_typeW(wc) & C1_DIGIT;
298 /*********************************************************************
299 * iswgraph (MSVCRT.@)
301 INT MSVCRT_iswgraph( WCHAR wc )
303 return get_char_typeW(wc) & (C1_ALPHA|C1_PUNCT|C1_DIGIT|C1_LOWER|C1_UPPER);
306 /*********************************************************************
307 * iswlower (MSVCRT.@)
309 INT MSVCRT_iswlower( WCHAR wc )
311 return get_char_typeW(wc) & C1_LOWER;
314 /*********************************************************************
315 * iswprint (MSVCRT.@)
317 INT MSVCRT_iswprint( WCHAR wc )
319 return get_char_typeW(wc) & (C1_ALPHA|C1_BLANK|C1_PUNCT|C1_DIGIT|C1_LOWER|C1_UPPER);
322 /*********************************************************************
323 * iswpunct (MSVCRT.@)
325 INT MSVCRT_iswpunct( WCHAR wc )
327 return get_char_typeW(wc) & C1_PUNCT;
330 /*********************************************************************
331 * iswspace (MSVCRT.@)
333 INT MSVCRT_iswspace( WCHAR wc )
335 return get_char_typeW(wc) & C1_SPACE;
338 /*********************************************************************
339 * iswupper (MSVCRT.@)
341 INT MSVCRT_iswupper( WCHAR wc )
343 return get_char_typeW(wc) & C1_UPPER;
346 /*********************************************************************
347 * iswxdigit (MSVCRT.@)
349 INT MSVCRT_iswxdigit( WCHAR wc )
351 return get_char_typeW(wc) & C1_XDIGIT;
354 /*********************************************************************
355 * _itow (MSVCRT.@)
357 WCHAR* _itow(int value,WCHAR* out,int base)
359 char buf[64];
360 _itoa(value, buf, base);
361 MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, buf, -1, out, 128);
362 return out;
365 /*********************************************************************
366 * _ltow (MSVCRT.@)
368 WCHAR* _ltow(long value,WCHAR* out,int base)
370 char buf[128];
371 _ltoa(value, buf, base);
372 MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, buf, -1, out, 128);
373 return out;