Release 961023
[wine.git] / memory / string.c
blobc4b9ad54fe125099be87b5dea30015fbe78a1591
1 /*
2 * String functions
4 * Copyright 1993 Yngvi Sigurjonsson
5 * Copyright 1996 Alexandre Julliard
6 */
8 #include <ctype.h>
9 #include <string.h>
10 #include "windows.h"
11 #include "ldt.h"
14 /***********************************************************************
15 * hmemcpy (KERNEL.348)
17 void hmemcpy( LPVOID dst, LPCVOID src, LONG count )
19 memcpy( dst, src, count );
23 /***********************************************************************
24 * lstrcat16 (KERNEL.89)
26 SEGPTR lstrcat16( SEGPTR dst, SEGPTR src )
28 lstrcat32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src) );
29 return dst;
33 /***********************************************************************
34 * lstrcat32A (KERNEL32.599)
36 LPSTR lstrcat32A( LPSTR dst, LPCSTR src )
38 strcat( dst, src );
39 return dst;
43 /***********************************************************************
44 * lstrcat32W (KERNEL32.600)
46 LPWSTR lstrcat32W( LPWSTR dst, LPCWSTR src )
48 register LPWSTR p = dst;
49 while (*p) p++;
50 while ((*p++ = *src++));
51 return dst;
55 /***********************************************************************
56 * lstrcatn16 (KERNEL.352)
58 SEGPTR lstrcatn16( SEGPTR dst, SEGPTR src, INT16 n )
60 lstrcatn32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src), n );
61 return dst;
65 /***********************************************************************
66 * lstrcatn32A (Not a Windows API)
68 LPSTR lstrcatn32A( LPSTR dst, LPCSTR src, INT32 n )
70 register LPSTR p = dst;
71 while (*p) p++;
72 if ((n -= (INT32)(p - dst)) <= 0) return dst;
73 lstrcpyn32A( p, src, n );
74 return dst;
78 /***********************************************************************
79 * lstrcatn32W (Not a Windows API)
81 LPWSTR lstrcatn32W( LPWSTR dst, LPCWSTR src, INT32 n )
83 register LPWSTR p = dst;
84 while (*p) p++;
85 if ((n -= (INT32)(p - dst)) <= 0) return dst;
86 lstrcpyn32W( p, src, n );
87 return dst;
91 /***********************************************************************
92 * lstrcmp16 (USER.430)
94 INT16 lstrcmp16( LPCSTR str1, LPCSTR str2 )
96 return (INT16)lstrcmp32A( str1, str2 );
100 /***********************************************************************
101 * lstrcmp32A (KERNEL.602)
103 INT32 lstrcmp32A( LPCSTR str1, LPCSTR str2 )
105 return (INT32)strcmp( str1, str2 );
109 /***********************************************************************
110 * lstrcmp32W (KERNEL.603)
112 INT32 lstrcmp32W( LPCWSTR str1, LPCWSTR str2 )
114 while (*str1 && (*str1 == *str2)) { str1++; str2++; }
115 return (INT32)(*str1 - *str2);
119 /***********************************************************************
120 * lstrcmpi16 (USER.471)
122 INT16 lstrcmpi16( LPCSTR str1, LPCSTR str2 )
124 return (INT16)lstrcmpi32A( str1, str2 );
128 /***********************************************************************
129 * lstrcmpi32A (KERNEL32.605)
131 INT32 lstrcmpi32A( LPCSTR str1, LPCSTR str2 )
133 INT32 res;
135 while (*str1)
137 if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
138 str1++;
139 str2++;
141 return toupper(*str1) - toupper(*str2);
145 /***********************************************************************
146 * lstrcmpi32W (KERNEL32.606)
148 INT32 lstrcmpi32W( LPCWSTR str1, LPCWSTR str2 )
150 INT32 res;
152 while (*str1)
154 /* FIXME: Unicode */
155 if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
156 str1++;
157 str2++;
159 return toupper(*str1) - toupper(*str2);
163 /***********************************************************************
164 * lstrcpy16 (KERNEL.88)
166 SEGPTR lstrcpy16( SEGPTR dst, SEGPTR src )
168 lstrcpy32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src) );
169 return dst;
173 /***********************************************************************
174 * lstrcpy32A (KERNEL32.608)
176 LPSTR lstrcpy32A( LPSTR dst, LPCSTR src )
178 if (!src || !dst) return NULL;
179 strcpy( dst, src );
180 return dst;
184 /***********************************************************************
185 * lstrcpy32W (KERNEL32.609)
187 LPWSTR lstrcpy32W( LPWSTR dst, LPCWSTR src )
189 register LPWSTR p = dst;
190 while ((*p++ = *src++));
191 return dst;
195 /***********************************************************************
196 * lstrcpyn16 (KERNEL.353)
198 SEGPTR lstrcpyn16( SEGPTR dst, SEGPTR src, INT16 n )
200 lstrcpyn32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src), n );
201 return dst;
205 /***********************************************************************
206 * lstrcpyn32A (KERNEL32.611)
208 LPSTR lstrcpyn32A( LPSTR dst, LPCSTR src, INT32 n )
210 LPSTR p = dst;
211 while ((n-- > 1) && *src) *p++ = *src++;
212 *p = 0;
213 return dst;
217 /***********************************************************************
218 * lstrcpyn32W (KERNEL32.612)
220 LPWSTR lstrcpyn32W( LPWSTR dst, LPCWSTR src, INT32 n )
222 LPWSTR p = dst;
223 while ((n-- > 1) && *src) *p++ = *src++;
224 *p = 0;
225 return dst;
229 /***********************************************************************
230 * lstrlen16 (KERNEL.90)
232 INT16 lstrlen16( LPCSTR str )
234 return (INT16)lstrlen32A( str );
238 /***********************************************************************
239 * lstrlen32A (KERNEL32.614)
241 INT32 lstrlen32A( LPCSTR str )
243 /* looks weird, but win3.1 KERNEL got a GeneralProtection handler
244 * in lstrlen() ... we check only for NULL pointer reference.
245 * - Marcus Meissner
247 if (!str) return 0;
248 return (INT32)strlen(str);
252 /***********************************************************************
253 * lstrlen32W (KERNEL32.615)
255 INT32 lstrlen32W( LPCWSTR str )
257 INT32 len = 0;
258 if (!str) return 0;
259 while (*str++) len++;
260 return len;
264 /***********************************************************************
265 * lstrncmp32A (Not a Windows API)
267 INT32 lstrncmp32A( LPCSTR str1, LPCSTR str2, INT32 n )
269 return (INT32)strncmp( str1, str2, n );
273 /***********************************************************************
274 * lstrncmp32W (Not a Windows API)
276 INT32 lstrncmp32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
278 if (!n) return 0;
279 while ((--n > 0) && *str1 && (*str1 == *str2)) { str1++; str2++; }
280 return (INT32)(*str1 - *str2);
284 /***********************************************************************
285 * lstrncmpi32A (Not a Windows API)
287 INT32 lstrncmpi32A( LPCSTR str1, LPCSTR str2, INT32 n )
289 INT32 res;
291 if (!n) return 0;
292 while ((--n > 0) && *str1)
293 if ( (res = toupper(*str1++) - toupper(*str2++)) ) return res;
295 return toupper(*str1) - toupper(*str2);
299 /***********************************************************************
300 * lstrncmpi32W (Not a Windows API)
302 INT32 lstrncmpi32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
304 INT32 res;
306 if (!n) return 0;
307 while ((--n > 0) && *str1)
309 /* FIXME: Unicode */
310 if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
311 str1++;
312 str2++;
314 return toupper(*str1) - toupper(*str2);
318 /***********************************************************************
319 * lstrcpynAtoW (Not a Windows API)
321 LPWSTR lstrcpynAtoW( LPWSTR dst, LPCSTR src, INT32 n )
323 LPWSTR p = dst;
324 while ((n-- > 1) && *src) *p++ = (WCHAR)(unsigned char)*src++;
325 *p = 0;
326 return dst;
330 /***********************************************************************
331 * lstrcpynWtoA (Not a Windows API)
333 LPSTR lstrcpynWtoA( LPSTR dst, LPCWSTR src, INT32 n )
335 LPSTR p = dst;
336 while ((n-- > 1) && *src) *p++ = (CHAR)*src++;
337 *p = 0;
338 return dst;
342 /***********************************************************************
343 * RtlFillMemory (KERNEL32.441)
345 VOID RtlFillMemory( LPVOID ptr, UINT32 len, UINT32 fill )
347 memset( ptr, fill, len );
351 /***********************************************************************
352 * RtlMoveMemory (KERNEL32.442)
354 VOID RtlMoveMemory( LPVOID dst, LPCVOID src, UINT32 len )
356 memmove( dst, src, len );
360 /***********************************************************************
361 * RtlZeroMemory (KERNEL32.444)
363 VOID RtlZeroMemory( LPVOID ptr, UINT32 len )
365 memset( ptr, 0, len );