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