Release 960712
[wine/dcerpc.git] / memory / string.c
blob399eb0691154aed355e84e66ddfd7bb6e57def24
1 /*
2 * String functions
4 * Copyright 1993 Yngvi Sigurjonsson
5 * Copyright 1996 Alexandre Julliard
6 */
8 #define NO_TRANSITION_TYPES /* This file is Win32-clean */
9 #include <ctype.h>
10 #include <string.h>
11 #include "windows.h"
12 #include "ldt.h"
15 /***********************************************************************
16 * hmemcpy (KERNEL.348)
18 void hmemcpy( LPVOID dst, LPCVOID src, LONG count )
20 memcpy( dst, src, count );
24 /***********************************************************************
25 * lstrcat16 (KERNEL.89)
27 SEGPTR lstrcat16( SEGPTR dst, SEGPTR src )
29 lstrcat32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src) );
30 return dst;
34 /***********************************************************************
35 * lstrcat32A (KERNEL32.599)
37 LPSTR lstrcat32A( LPSTR dst, LPCSTR src )
39 strcat( dst, src );
40 return dst;
44 /***********************************************************************
45 * lstrcat32W (KERNEL32.600)
47 LPWSTR lstrcat32W( LPWSTR dst, LPCWSTR src )
49 register LPWSTR p = dst;
50 while (*p) p++;
51 while ((*p++ = *src++));
52 return dst;
56 /***********************************************************************
57 * lstrcatn16 (KERNEL.352)
59 SEGPTR lstrcatn16( SEGPTR dst, SEGPTR src, INT16 n )
61 lstrcatn32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src), n );
62 return dst;
66 /***********************************************************************
67 * lstrcatn32A (Not a Windows API)
69 LPSTR lstrcatn32A( LPSTR dst, LPCSTR src, INT32 n )
71 register LPSTR p = dst;
72 while (*p) p++;
73 if ((n -= (INT32)(p - dst)) <= 0) return dst;
74 lstrcpyn32A( p, src, n );
75 return dst;
79 /***********************************************************************
80 * lstrcatn32W (Not a Windows API)
82 LPWSTR lstrcatn32W( LPWSTR dst, LPCWSTR src, INT32 n )
84 register LPWSTR p = dst;
85 while (*p) p++;
86 if ((n -= (INT32)(p - dst)) <= 0) return dst;
87 lstrcpyn32W( p, src, n );
88 return dst;
92 /***********************************************************************
93 * lstrcmp16 (USER.430)
95 INT16 lstrcmp16( LPCSTR str1, LPCSTR str2 )
97 return (INT16)lstrcmp32A( str1, str2 );
101 /***********************************************************************
102 * lstrcmp32A (KERNEL.602)
104 INT32 lstrcmp32A( LPCSTR str1, LPCSTR str2 )
106 return (INT32)strcmp( str1, str2 );
110 /***********************************************************************
111 * lstrcmp32W (KERNEL.603)
113 INT32 lstrcmp32W( LPCWSTR str1, LPCWSTR str2 )
115 while (*str1 && (*str1 == *str2)) { str1++; str2++; }
116 return (INT32)(*str1 - *str2);
120 /***********************************************************************
121 * lstrcmpi16 (USER.471)
123 INT16 lstrcmpi16( LPCSTR str1, LPCSTR str2 )
125 return (INT16)lstrcmpi32A( str1, str2 );
129 /***********************************************************************
130 * lstrcmpi32A (KERNEL32.605)
132 INT32 lstrcmpi32A( LPCSTR str1, LPCSTR str2 )
134 INT32 res;
136 while (*str1)
138 if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
139 str1++;
140 str2++;
142 return toupper(*str1) - toupper(*str2);
146 /***********************************************************************
147 * lstrcmpi32W (KERNEL32.606)
149 INT32 lstrcmpi32W( LPCWSTR str1, LPCWSTR str2 )
151 INT32 res;
153 while (*str1)
155 /* FIXME: Unicode */
156 if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
157 str1++;
158 str2++;
160 return toupper(*str1) - toupper(*str2);
164 /***********************************************************************
165 * lstrcpy16 (KERNEL.88)
167 SEGPTR lstrcpy16( SEGPTR dst, SEGPTR src )
169 lstrcpy32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src) );
170 return dst;
174 /***********************************************************************
175 * lstrcpy32A (KERNEL32.608)
177 LPSTR lstrcpy32A( LPSTR dst, LPCSTR src )
179 if (!src || !dst) return NULL;
180 strcpy( dst, src );
181 return dst;
185 /***********************************************************************
186 * lstrcpy32W (KERNEL32.609)
188 LPWSTR lstrcpy32W( LPWSTR dst, LPCWSTR src )
190 register LPWSTR p = dst;
191 while ((*p++ = *src++));
192 return dst;
196 /***********************************************************************
197 * lstrcpyn16 (KERNEL.353)
199 SEGPTR lstrcpyn16( SEGPTR dst, SEGPTR src, INT16 n )
201 lstrcpyn32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src), n );
202 return dst;
206 /***********************************************************************
207 * lstrcpyn32A (KERNEL32.611)
209 LPSTR lstrcpyn32A( LPSTR dst, LPCSTR src, INT32 n )
211 LPSTR p = dst;
212 while ((n-- > 1) && *src) *p++ = *src++;
213 *p = 0;
214 return dst;
218 /***********************************************************************
219 * lstrcpyn32W (KERNEL32.612)
221 LPWSTR lstrcpyn32W( LPWSTR dst, LPCWSTR src, INT32 n )
223 LPWSTR p = dst;
224 while ((n-- > 1) && *src) *p++ = *src++;
225 *p = 0;
226 return dst;
230 /***********************************************************************
231 * lstrlen16 (KERNEL.90)
233 INT16 lstrlen16( LPCSTR str )
235 return (INT16)lstrlen32A( str );
239 /***********************************************************************
240 * lstrlen32A (KERNEL32.614)
242 INT32 lstrlen32A( LPCSTR str )
244 /* looks weird, but win3.1 KERNEL got a GeneralProtection handler
245 * in lstrlen() ... we check only for NULL pointer reference.
246 * - Marcus Meissner
248 if (!str) return 0;
249 return (INT32)strlen(str);
253 /***********************************************************************
254 * lstrlen32W (KERNEL32.615)
256 INT32 lstrlen32W( LPCWSTR str )
258 INT32 len = 0;
259 if (!str) return 0;
260 while (*str++) len++;
261 return len;
265 /***********************************************************************
266 * lstrncmp32A (Not a Windows API)
268 INT32 lstrncmp32A( LPCSTR str1, LPCSTR str2, INT32 n )
270 return (INT32)strncmp( str1, str2, n );
274 /***********************************************************************
275 * lstrncmp32W (Not a Windows API)
277 INT32 lstrncmp32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
279 if (!n) return 0;
280 while ((--n > 0) && *str1 && (*str1 == *str2)) { str1++; str2++; }
281 return (INT32)(*str1 - *str2);
285 /***********************************************************************
286 * lstrncmpi32A (Not a Windows API)
288 INT32 lstrncmpi32A( LPCSTR str1, LPCSTR str2, INT32 n )
290 INT32 res;
292 if (!n) return 0;
293 while ((--n > 0) && *str1)
295 if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
296 str1++;
297 str2++;
299 return toupper(*str1) - toupper(*str2);
303 /***********************************************************************
304 * lstrncmpi32W (Not a Windows API)
306 INT32 lstrncmpi32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
308 INT32 res;
310 if (!n) return 0;
311 while ((--n > 0) && *str1)
313 /* FIXME: Unicode */
314 if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
315 str1++;
316 str2++;
318 return toupper(*str1) - toupper(*str2);
322 /***********************************************************************
323 * lstrcpynAtoW (Not a Windows API)
325 LPWSTR lstrcpynAtoW( LPWSTR dst, LPCSTR src, INT32 n )
327 LPWSTR p = dst;
328 while ((n-- > 1) && *src) *p++ = (WCHAR)(unsigned char)*src++;
329 *p = 0;
330 return dst;
334 /***********************************************************************
335 * lstrcpynWtoA (Not a Windows API)
337 LPSTR lstrcpynWtoA( LPSTR dst, LPCWSTR src, INT32 n )
339 LPSTR p = dst;
340 while ((n-- > 1) && *src) *p++ = (CHAR)*src++;
341 *p = 0;
342 return dst;
346 /***********************************************************************
347 * RtlFillMemory (KERNEL32.441)
349 VOID RtlFillMemory( LPVOID ptr, UINT32 len, UINT32 fill )
351 memset( ptr, fill, len );
355 /***********************************************************************
356 * RtlMoveMemory (KERNEL32.442)
358 VOID RtlMoveMemory( LPVOID dst, LPCVOID src, UINT32 len )
360 /* memcpy does not support overlapped copies, */
361 /* and memmove is not portable. */
362 if (((BYTE *)dst + len <= (BYTE *)src) ||
363 ((BYTE *)src + len <= (BYTE *)dst))
365 memcpy( dst, src, len );
366 return;
368 /* do it the hard way (FIXME: could do better than this) */
369 if (dst < src)
371 while (len--) *((BYTE *)dst)++ = *((BYTE *)src)++;
373 else
375 dst = (BYTE *)dst + len - 1;
376 src = (BYTE *)src + len - 1;
377 while (len--) *((BYTE *)dst)-- = *((BYTE *)src)--;
382 /***********************************************************************
383 * RtlZeroMemory (KERNEL32.444)
385 VOID RtlZeroMemory( LPVOID ptr, UINT32 len )
387 memset( ptr, 0, len );