Fixed build.
[reactos.git] / reactos / dll / win32 / kernel32 / string / lstring.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/file/lstring.c
5 * PURPOSE: Local string functions
6 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
7 * UPDATE HISTORY:
8 * Created 01/11/98
9 */
10
11 #include <k32.h>
12
13
14 static _SEH_FILTER(lstr_page_fault)
15 {
16 if (_SEH_GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
17 return _SEH_EXECUTE_HANDLER;
18 else
19 return _SEH_CONTINUE_SEARCH;
20 }
21
22
23 /*
24 * @implemented
25 */
26 int
27 STDCALL
28 lstrcmpA(
29 LPCSTR lpString1,
30 LPCSTR lpString2
31 )
32 {
33 int Result;
34
35 if (lpString1 == lpString2)
36 return 0;
37 if (lpString1 == NULL)
38 return -1;
39 if (lpString2 == NULL)
40 return 1;
41
42 Result = CompareStringA(GetThreadLocale(), 0, lpString1, -1, lpString2, -1);
43 if (Result) Result -= 2;
44
45 return Result;
46 }
47
48
49 /*
50 * @implemented
51 */
52 int
53 STDCALL
54 lstrcmpiA(
55 LPCSTR lpString1,
56 LPCSTR lpString2
57 )
58 {
59 int Result;
60
61 if (lpString1 == lpString2)
62 return 0;
63 if (lpString1 == NULL)
64 return -1;
65 if (lpString2 == NULL)
66 return 1;
67
68 Result = CompareStringA(GetThreadLocale(), NORM_IGNORECASE, lpString1, -1,
69 lpString2, -1);
70 if (Result) Result -= 2;
71
72 return Result;
73 }
74
75
76 /*
77 * @implemented
78 */
79 LPSTR
80 STDCALL
81 lstrcpynA(
82 LPSTR lpString1,
83 LPCSTR lpString2,
84 int iMaxLength
85 )
86 {
87 LPSTR d = lpString1;
88 LPCSTR s = lpString2;
89 UINT count = iMaxLength;
90 LPSTR Ret = NULL;
91
92 _SEH_TRY
93 {
94 while ((count > 1) && *s)
95 {
96 count--;
97 *d++ = *s++;
98 }
99 if (count) *d = 0;
100
101 Ret = lpString1;
102 }
103 _SEH_EXCEPT(lstr_page_fault)
104 {
105 SetLastError( ERROR_INVALID_PARAMETER );
106 }
107 _SEH_END;
108
109 return Ret;
110 }
111
112
113 /*
114 * @implemented
115 */
116 LPSTR
117 STDCALL
118 lstrcpyA(
119 LPSTR lpString1,
120 LPCSTR lpString2
121 )
122 {
123 LPSTR Ret = NULL;
124
125 _SEH_TRY
126 {
127 memmove(lpString1, lpString2, strlen(lpString2) + 1);
128 Ret = lpString1;
129 }
130 _SEH_EXCEPT(lstr_page_fault)
131 {
132 SetLastError(ERROR_INVALID_PARAMETER);
133 }
134 _SEH_END;
135
136 return Ret;
137 }
138
139
140 /*
141 * @implemented
142 */
143 LPSTR
144 STDCALL
145 lstrcatA(
146 LPSTR lpString1,
147 LPCSTR lpString2
148 )
149 {
150 LPSTR Ret = NULL;
151
152 _SEH_TRY
153 {
154 Ret = strcat(lpString1, lpString2);
155 }
156 _SEH_EXCEPT(lstr_page_fault)
157 {
158 SetLastError(ERROR_INVALID_PARAMETER);
159 }
160 _SEH_END;
161
162 return Ret;
163
164 }
165
166
167 /*
168 * @implemented
169 */
170 int
171 STDCALL
172 lstrlenA(
173 LPCSTR lpString
174 )
175 {
176 INT Ret = 0;
177
178 _SEH_TRY
179 {
180 Ret = strlen(lpString);
181 }
182 _SEH_EXCEPT(lstr_page_fault)
183 {
184 SetLastError(ERROR_INVALID_PARAMETER);
185 }
186 _SEH_END;
187
188 return Ret;
189 }
190
191
192 /*
193 * @implemented
194 */
195 int
196 STDCALL
197 lstrcmpW(
198 LPCWSTR lpString1,
199 LPCWSTR lpString2
200 )
201 {
202 int Result;
203
204 if (lpString1 == lpString2)
205 return 0;
206 if (lpString1 == NULL)
207 return -1;
208 if (lpString2 == NULL)
209 return 1;
210
211 Result = CompareStringW(GetThreadLocale(), 0, lpString1, -1, lpString2, -1);
212 if (Result) Result -= 2;
213
214 return Result;
215 }
216
217
218 /*
219 * @implemented
220 */
221 int
222 STDCALL
223 lstrcmpiW(
224 LPCWSTR lpString1,
225 LPCWSTR lpString2
226 )
227 {
228 int Result;
229
230 if (lpString1 == lpString2)
231 return 0;
232 if (lpString1 == NULL)
233 return -1;
234 if (lpString2 == NULL)
235 return 1;
236
237 Result = CompareStringW(GetThreadLocale(), NORM_IGNORECASE, lpString1, -1, lpString2, -1);
238 if (Result) Result -= 2;
239
240 return Result;
241 }
242
243
244 /*
245 * @implemented
246 */
247 LPWSTR
248 STDCALL
249 lstrcpynW(
250 LPWSTR lpString1,
251 LPCWSTR lpString2,
252 int iMaxLength
253 )
254 {
255 LPWSTR d = lpString1;
256 LPCWSTR s = lpString2;
257 UINT count = iMaxLength;
258 LPWSTR Ret = NULL;
259
260 _SEH_TRY
261 {
262 while ((count > 1) && *s)
263 {
264 count--;
265 *d++ = *s++;
266 }
267 if (count) *d = 0;
268
269 Ret = lpString1;
270 }
271 _SEH_EXCEPT(lstr_page_fault)
272 {
273 SetLastError( ERROR_INVALID_PARAMETER );
274 }
275 _SEH_END;
276
277 return Ret;
278 }
279
280
281 /*
282 * @implemented
283 */
284 LPWSTR
285 STDCALL
286 lstrcpyW(
287 LPWSTR lpString1,
288 LPCWSTR lpString2
289 )
290 {
291 LPWSTR Ret = NULL;
292
293 _SEH_TRY
294 {
295 Ret = wcscpy(lpString1, lpString2);
296 }
297 _SEH_EXCEPT(lstr_page_fault)
298 {
299 SetLastError(ERROR_INVALID_PARAMETER);
300 }
301 _SEH_END;
302
303 return Ret;
304 }
305
306
307 /*
308 * @implemented
309 */
310 LPWSTR
311 STDCALL
312 lstrcatW(
313 LPWSTR lpString1,
314 LPCWSTR lpString2
315 )
316 {
317 LPWSTR Ret = NULL;
318
319 _SEH_TRY
320 {
321 Ret = wcscat(lpString1, lpString2);
322 }
323 _SEH_EXCEPT(lstr_page_fault)
324 {
325 SetLastError(ERROR_INVALID_PARAMETER);
326 }
327 _SEH_END;
328
329 return Ret;
330 }
331
332
333 /*
334 * @implemented
335 */
336 int
337 STDCALL
338 lstrlenW(
339 LPCWSTR lpString
340 )
341 {
342 INT Ret = 0;
343
344 _SEH_TRY
345 {
346 Ret = wcslen(lpString);
347 }
348 _SEH_EXCEPT(lstr_page_fault)
349 {
350 SetLastError(ERROR_INVALID_PARAMETER);
351 }
352 _SEH_END;
353
354 return Ret;
355 }