Removed a few dependencies on kernel32 functions.
[wine] / dlls / crtdll / wcstring.c
1 /*
2  * CRTDLL wide-char functions
3  *
4  * Copyright 1999 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 "crtdll.h"
18 #include "debugtools.h"
19
20 DEFAULT_DEBUG_CHANNEL(crtdll);
21
22
23 /*********************************************************************
24  *           CRTDLL__wcsdup    (CRTDLL.320)
25  */
26 LPWSTR __cdecl CRTDLL__wcsdup( LPCWSTR str )
27 {
28     LPWSTR ret = NULL;
29     if (str)
30     {
31         int size = (strlenW(str) + 1) * sizeof(WCHAR);
32         ret = CRTDLL_malloc( size );
33         if (ret) memcpy( ret, str, size );
34     }
35     return ret;
36 }
37
38
39 /*********************************************************************
40  *           CRTDLL__wcsicoll    (CRTDLL.322)
41  */
42 INT __cdecl CRTDLL__wcsicoll( LPCWSTR str1, LPCWSTR str2 )
43 {
44     /* FIXME: handle collates */
45     return strcmpiW( str1, str2 );
46 }
47
48
49 /*********************************************************************
50  *           CRTDLL__wcsnset    (CRTDLL.325)
51  */
52 LPWSTR __cdecl CRTDLL__wcsnset( LPWSTR str, WCHAR c, INT n )
53 {
54     LPWSTR ret = str;
55     while ((n-- > 0) && *str) *str++ = c;
56     return ret;
57 }
58
59
60 /*********************************************************************
61  *           CRTDLL__wcsrev    (CRTDLL.326)
62  */
63 LPWSTR __cdecl CRTDLL__wcsrev( LPWSTR str )
64 {
65     LPWSTR ret = str;
66     LPWSTR end = str + strlenW(str) - 1;
67     while (end > str)
68     {
69         WCHAR t = *end;
70         *end--  = *str;
71         *str++  = t;
72     }
73     return ret;
74 }
75
76
77 /*********************************************************************
78  *           CRTDLL__wcsset    (CRTDLL.327)
79  */
80 LPWSTR __cdecl CRTDLL__wcsset( LPWSTR str, WCHAR c )
81 {
82     LPWSTR ret = str;
83     while (*str) *str++ = c;
84     return ret;
85 }
86
87
88 /*********************************************************************
89  *           CRTDLL_wcscoll    (CRTDLL.506)
90  */
91 DWORD __cdecl CRTDLL_wcscoll( LPCWSTR str1, LPCWSTR str2 )
92 {
93     /* FIXME: handle collates */
94     return strcmpW( str1, str2 );
95 }
96
97
98 /*********************************************************************
99  *           CRTDLL_wcspbrk    (CRTDLL.514)
100  */
101 LPWSTR __cdecl CRTDLL_wcspbrk( LPCWSTR str, LPCWSTR accept )
102 {
103     LPCWSTR p;
104     while (*str)
105     {
106         for (p = accept; *p; p++) if (*p == *str) return (LPWSTR)str;
107         str++;
108     }
109     return NULL;
110 }
111
112
113 /*********************************************************************
114  *           CRTDLL_wctomb    (CRTDLL.524)
115  */
116 INT __cdecl CRTDLL_wctomb( LPSTR dst, WCHAR ch )
117 {
118     return WideCharToMultiByte( CP_ACP, 0, &ch, 1, dst, 6, NULL, NULL );
119 }
120
121 /*********************************************************************
122  *           CRTDLL_iswalnum    (CRTDLL.405)
123  */
124 INT __cdecl CRTDLL_iswalnum( WCHAR wc )
125 {
126     return get_char_typeW(wc) & (C1_ALPHA|C1_DIGIT|C1_LOWER|C1_UPPER);
127 }
128
129 /*********************************************************************
130  *           CRTDLL_iswalpha    (CRTDLL.406)
131  */
132 INT __cdecl CRTDLL_iswalpha( WCHAR wc )
133 {
134     return get_char_typeW(wc) & (C1_ALPHA|C1_LOWER|C1_UPPER);
135 }
136
137 /*********************************************************************
138  *           CRTDLL_iswcntrl    (CRTDLL.408)
139  */
140 INT __cdecl CRTDLL_iswcntrl( WCHAR wc )
141 {
142     return get_char_typeW(wc) & C1_CNTRL;
143 }
144
145 /*********************************************************************
146  *           CRTDLL_iswdigit    (CRTDLL.410)
147  */
148 INT __cdecl CRTDLL_iswdigit( WCHAR wc )
149 {
150     return get_char_typeW(wc) & C1_DIGIT;
151 }
152
153 /*********************************************************************
154  *           CRTDLL_iswgraph    (CRTDLL.411)
155  */
156 INT __cdecl CRTDLL_iswgraph( WCHAR wc )
157 {
158     return get_char_typeW(wc) & (C1_ALPHA|C1_PUNCT|C1_DIGIT|C1_LOWER|C1_UPPER);
159 }
160
161 /*********************************************************************
162  *           CRTDLL_iswlower    (CRTDLL.412)
163  */
164 INT __cdecl CRTDLL_iswlower( WCHAR wc )
165 {
166     return get_char_typeW(wc) & C1_LOWER;
167 }
168
169 /*********************************************************************
170  *           CRTDLL_iswprint    (CRTDLL.413)
171  */
172 INT __cdecl CRTDLL_iswprint( WCHAR wc )
173 {
174     return get_char_typeW(wc) & (C1_ALPHA|C1_BLANK|C1_PUNCT|C1_DIGIT|C1_LOWER|C1_UPPER);
175 }
176
177 /*********************************************************************
178  *           CRTDLL_iswpunct    (CRTDLL.414)
179  */
180 INT __cdecl CRTDLL_iswpunct( WCHAR wc )
181 {
182     return get_char_typeW(wc) & C1_PUNCT;
183 }
184
185 /*********************************************************************
186  *           CRTDLL_iswspace    (CRTDLL.415)
187  */
188 INT __cdecl CRTDLL_iswspace( WCHAR wc )
189 {
190     return get_char_typeW(wc) & C1_SPACE;
191 }
192
193 /*********************************************************************
194  *           CRTDLL_iswupper    (CRTDLL.416)
195  */
196 INT __cdecl CRTDLL_iswupper( WCHAR wc )
197 {
198     return get_char_typeW(wc) & C1_UPPER;
199 }
200
201 /*********************************************************************
202  *           CRTDLL_iswxdigit    (CRTDLL.417)
203  */
204 INT __cdecl CRTDLL_iswxdigit( WCHAR wc )
205 {
206     return get_char_typeW(wc) & C1_XDIGIT;
207 }