4 * Copyright 1993 Yngvi Sigurjonsson
5 * Copyright 1996 Alexandre Julliard
8 #define NO_TRANSITION_TYPES /* This file is Win32-clean */
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
) );
34 /***********************************************************************
35 * lstrcat32A (KERNEL32.599)
37 LPSTR
lstrcat32A( LPSTR dst
, LPCSTR src
)
44 /***********************************************************************
45 * lstrcat32W (KERNEL32.600)
47 LPWSTR
lstrcat32W( LPWSTR dst
, LPCWSTR src
)
49 register LPWSTR p
= dst
;
51 while ((*p
++ = *src
++));
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
);
66 /***********************************************************************
67 * lstrcatn32A (Not a Windows API)
69 LPSTR
lstrcatn32A( LPSTR dst
, LPCSTR src
, INT32 n
)
71 register LPSTR p
= dst
;
73 if ((n
-= (INT32
)(p
- dst
)) <= 0) return dst
;
74 lstrcpyn32A( p
, src
, n
);
79 /***********************************************************************
80 * lstrcatn32W (Not a Windows API)
82 LPWSTR
lstrcatn32W( LPWSTR dst
, LPCWSTR src
, INT32 n
)
84 register LPWSTR p
= dst
;
86 if ((n
-= (INT32
)(p
- dst
)) <= 0) return dst
;
87 lstrcpyn32W( p
, src
, n
);
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
)
138 if ((res
= toupper(*str1
) - toupper(*str2
)) != 0) return res
;
142 return toupper(*str1
) - toupper(*str2
);
146 /***********************************************************************
147 * lstrcmpi32W (KERNEL32.606)
149 INT32
lstrcmpi32W( LPCWSTR str1
, LPCWSTR str2
)
156 if ((res
= toupper(*str1
) - toupper(*str2
)) != 0) return res
;
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
) );
174 /***********************************************************************
175 * lstrcpy32A (KERNEL32.608)
177 LPSTR
lstrcpy32A( LPSTR dst
, LPCSTR src
)
179 if (!src
|| !dst
) return NULL
;
185 /***********************************************************************
186 * lstrcpy32W (KERNEL32.609)
188 LPWSTR
lstrcpy32W( LPWSTR dst
, LPCWSTR src
)
190 register LPWSTR p
= dst
;
191 while ((*p
++ = *src
++));
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
);
206 /***********************************************************************
207 * lstrcpyn32A (KERNEL32.611)
209 LPSTR
lstrcpyn32A( LPSTR dst
, LPCSTR src
, INT32 n
)
212 while ((n
-- > 1) && *src
) *p
++ = *src
++;
218 /***********************************************************************
219 * lstrcpyn32W (KERNEL32.612)
221 LPWSTR
lstrcpyn32W( LPWSTR dst
, LPCWSTR src
, INT32 n
)
224 while ((n
-- > 1) && *src
) *p
++ = *src
++;
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.
249 return (INT32
)strlen(str
);
253 /***********************************************************************
254 * lstrlen32W (KERNEL32.615)
256 INT32
lstrlen32W( LPCWSTR str
)
260 while (*str
++) 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
)
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
)
293 while ((--n
> 0) && *str1
)
295 if ((res
= toupper(*str1
) - toupper(*str2
)) != 0) return res
;
299 return toupper(*str1
) - toupper(*str2
);
303 /***********************************************************************
304 * lstrncmpi32W (Not a Windows API)
306 INT32
lstrncmpi32W( LPCWSTR str1
, LPCWSTR str2
, INT32 n
)
311 while ((--n
> 0) && *str1
)
314 if ((res
= toupper(*str1
) - toupper(*str2
)) != 0) return res
;
318 return toupper(*str1
) - toupper(*str2
);
322 /***********************************************************************
323 * lstrcpynAtoW (Not a Windows API)
325 LPWSTR
lstrcpynAtoW( LPWSTR dst
, LPCSTR src
, INT32 n
)
328 while ((n
-- > 1) && *src
) *p
++ = (WCHAR
)(unsigned char)*src
++;
334 /***********************************************************************
335 * lstrcpynWtoA (Not a Windows API)
337 LPSTR
lstrcpynWtoA( LPSTR dst
, LPCWSTR src
, INT32 n
)
340 while ((n
-- > 1) && *src
) *p
++ = (CHAR
)*src
++;
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
);
368 /* do it the hard way (FIXME: could do better than this) */
371 while (len
--) *((BYTE
*)dst
)++ = *((BYTE
*)src
)++;
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
);