Localization and many changes to behaviour and outlook.
[wine] / dlls / ntdll / wcstring.c
1 /*
2  * NTDLL wide-char functions
3  *
4  * Copyright 2000 Alexandre Julliard
5  */
6
7 #include "config.h"
8
9 #include <ctype.h>
10 #include <stdlib.h>
11 #include <string.h>
12
13 #include "windef.h"
14 #include "winbase.h"
15 #include "winnls.h"
16 #include "wine/unicode.h"
17 #include "heap.h"
18 #include "debugtools.h"
19
20 DEFAULT_DEBUG_CHANNEL(ntdll);
21
22
23 /*********************************************************************
24  *           NTDLL__wcsicmp    (NTDLL)
25  */
26 INT __cdecl NTDLL__wcsicmp( LPCWSTR str1, LPCWSTR str2 )
27 {
28     return strcmpiW( str1, str2 );
29 }
30
31
32 /*********************************************************************
33  *           NTDLL__wcslwr    (NTDLL)
34  */
35 LPWSTR __cdecl NTDLL__wcslwr( LPWSTR str )
36 {
37     return strlwrW( str );
38 }
39
40
41 /*********************************************************************
42  *           NTDLL__wcsnicmp    (NTDLL)
43  */
44 INT __cdecl NTDLL__wcsnicmp( LPCWSTR str1, LPCWSTR str2, INT n )
45 {
46     return strncmpiW( str1, str2, n );
47 }
48
49
50 /*********************************************************************
51  *           NTDLL__wcsupr    (NTDLL)
52  */
53 LPWSTR __cdecl NTDLL__wcsupr( LPWSTR str )
54 {
55     return struprW( str );
56 }
57
58
59 /*********************************************************************
60  *           NTDLL_towlower    (NTDLL)
61  */
62 WCHAR __cdecl NTDLL_towlower( WCHAR ch )
63 {
64     return tolowerW(ch);
65 }
66
67
68 /*********************************************************************
69  *           NTDLL_towupper    (NTDLL)
70  */
71 WCHAR __cdecl NTDLL_towupper( WCHAR ch )
72 {
73     return toupperW(ch);
74 }
75
76
77 /***********************************************************************
78  *           NTDLL_wcscat    (NTDLL)
79  */
80 LPWSTR __cdecl NTDLL_wcscat( LPWSTR dst, LPCWSTR src )
81 {
82     return strcatW( dst, src );
83 }
84
85
86 /*********************************************************************
87  *           NTDLL_wcschr    (NTDLL)
88  */
89 LPWSTR __cdecl NTDLL_wcschr( LPCWSTR str, WCHAR ch )
90 {
91     return strchrW( str, ch );
92 }
93
94
95 /*********************************************************************
96  *           NTDLL_wcscmp    (NTDLL)
97  */
98 INT __cdecl NTDLL_wcscmp( LPCWSTR str1, LPCWSTR str2 )
99 {
100     return strcmpW( str1, str2 );
101 }
102
103
104 /***********************************************************************
105  *           NTDLL_wcscpy    (NTDLL)
106  */
107 LPWSTR __cdecl NTDLL_wcscpy( LPWSTR dst, LPCWSTR src )
108 {
109     return strcpyW( dst, src );
110 }
111
112
113 /*********************************************************************
114  *           NTDLL_wcscspn    (NTDLL)
115  */
116 INT __cdecl NTDLL_wcscspn( LPCWSTR str, LPCWSTR reject )
117 {
118     LPCWSTR start = str;
119     while (*str)
120     {
121         LPCWSTR p = reject;
122         while (*p && (*p != *str)) p++;
123         if (*p) break;
124         str++;
125     }
126     return str - start;
127 }
128
129
130 /***********************************************************************
131  *           NTDLL_wcslen    (NTDLL)
132  */
133 INT __cdecl NTDLL_wcslen( LPCWSTR str )
134 {
135     return strlenW( str );
136 }
137
138
139 /*********************************************************************
140  *           NTDLL_wcsncat    (NTDLL)
141  */
142 LPWSTR __cdecl NTDLL_wcsncat( LPWSTR s1, LPCWSTR s2, INT n )
143 {
144     LPWSTR ret = s1;
145     while (*s1) s1++;
146     while (n-- > 0) if (!(*s1++ = *s2++)) return ret;
147     *s1 = 0;
148     return ret;
149 }
150
151
152 /*********************************************************************
153  *           NTDLL_wcsncmp    (NTDLL)
154  */
155 INT __cdecl NTDLL_wcsncmp( LPCWSTR str1, LPCWSTR str2, INT n )
156 {
157     return strncmpW( str1, str2, n );
158 }
159
160
161 /*********************************************************************
162  *           NTDLL_wcsncpy    (NTDLL)
163  */
164 LPWSTR __cdecl NTDLL_wcsncpy( LPWSTR s1, LPCWSTR s2, INT n )
165 {
166     return strncpyW( s1, s2, n );
167 }
168
169
170 /*********************************************************************
171  *           NTDLL_wcspbrk    (NTDLL)
172  */
173 LPWSTR __cdecl NTDLL_wcspbrk( LPCWSTR str, LPCWSTR accept )
174 {
175     LPCWSTR p;
176     while (*str)
177     {
178         for (p = accept; *p; p++) if (*p == *str) return (LPWSTR)str;
179         str++;
180     }
181     return NULL;
182 }
183
184
185 /*********************************************************************
186  *           NTDLL_wcsrchr    (NTDLL)
187  */
188 LPWSTR __cdecl NTDLL_wcsrchr( LPWSTR str, WCHAR ch )
189 {
190     LPWSTR last = NULL;
191     while (*str)
192     {
193         if (*str == ch) last = str;
194         str++;
195     }
196     return last;
197 }
198
199
200 /*********************************************************************
201  *           NTDLL_wcsspn    (NTDLL)
202  */
203 INT __cdecl NTDLL_wcsspn( LPCWSTR str, LPCWSTR accept )
204 {
205     LPCWSTR start = str;
206     while (*str)
207     {
208         LPCWSTR p = accept;
209         while (*p && (*p != *str)) p++;
210         if (!*p) break;
211         str++;
212     }
213     return str - start;
214 }
215
216
217 /*********************************************************************
218  *           NTDLL_wcsstr    (NTDLL)
219  */
220 LPWSTR __cdecl NTDLL_wcsstr( LPCWSTR str, LPCWSTR sub )
221 {
222     return strstrW( str, sub );
223 }
224
225
226 /*********************************************************************
227  *           NTDLL_wcstok    (NTDLL)
228  */
229 LPWSTR __cdecl NTDLL_wcstok( LPWSTR str, LPCWSTR delim )
230 {
231     static LPWSTR next = NULL;
232     LPWSTR ret;
233
234     if (!str)
235         if (!(str = next)) return NULL;
236
237     while (*str && NTDLL_wcschr( delim, *str )) str++;
238     if (!*str) return NULL;
239     ret = str++;
240     while (*str && !NTDLL_wcschr( delim, *str )) str++;
241     if (*str) *str++ = 0;
242     next = str;
243     return ret;
244 }
245
246
247 /*********************************************************************
248  *           NTDLL_wcstombs    (NTDLL)
249  */
250 INT __cdecl NTDLL_wcstombs( LPSTR dst, LPCWSTR src, INT n )
251 {
252     INT ret;
253     if (n <= 0) return 0;
254     ret = WideCharToMultiByte( CP_ACP, 0, src, -1, dst, dst ? n : 0, NULL, NULL );
255     if (!ret) return n;  /* overflow */
256     return ret - 1;  /* do not count terminating NULL */
257 }
258
259
260 /*********************************************************************
261  *           NTDLL_mbstowcs    (NTDLL)
262  */
263 INT __cdecl NTDLL_mbstowcs( LPWSTR dst, LPCSTR src, INT n )
264 {
265     INT ret;
266     if (n <= 0) return 0;
267     ret = MultiByteToWideChar( CP_ACP, 0, src, -1, dst, dst ? n : 0 );
268     if (!ret) return n;  /* overflow */
269     return ret - 1;  /* do not count terminating NULL */
270 }
271
272
273 /*********************************************************************
274  *                  wcstol  (NTDLL)
275  * Like strtol, but for wide character strings.
276  */
277 INT __cdecl NTDLL_wcstol(LPWSTR s,LPWSTR *end,INT base)
278 {
279     LPSTR sA = HEAP_strdupWtoA(GetProcessHeap(),0,s),endA;
280     INT ret = strtol(sA,&endA,base);
281
282     HeapFree(GetProcessHeap(),0,sA);
283     if (end) *end = s+(endA-sA); /* pointer magic checked. */
284     return ret;
285 }
286
287
288 /*********************************************************************
289  *           NTDLL_iswctype    (NTDLL)
290  */
291 INT __cdecl NTDLL_iswctype( WCHAR wc, WCHAR wct )
292 {
293     return (get_char_typeW(wc) & 0xfff) & wct;
294 }
295
296
297 /*********************************************************************
298  *           NTDLL_iswalpha    (NTDLL)
299  */
300 INT __cdecl NTDLL_iswalpha( WCHAR wc )
301 {
302     return get_char_typeW(wc) & C1_ALPHA;
303 }