Rev 3728 | Rev 3730 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3728 | Rev 3729 | ||
---|---|---|---|
Line 187... | Line 187... | ||
187 | *dstb++ = *srcb++; |
187 | *dstb++ = *srcb++; |
188 | 188 | ||
189 | return dst; |
189 | return dst; |
190 | } |
190 | } |
191 | 191 | ||
- | 192 | /** Move memory block with possible overlapping. */ |
|
192 | void *memmove(void *dst, const void *src, size_t n) |
193 | void *memmove(void *dst, const void *src, size_t n) |
193 | { |
194 | { |
194 | int i, j; |
195 | uint8_t *dp, *sp; |
195 | 196 | ||
- | 197 | /* Nothing to do? */ |
|
196 | if (src > dst) |
198 | if (src == dst) |
- | 199 | return dst; |
|
- | 200 | ||
- | 201 | /* Non-overlapping? */ |
|
- | 202 | if (dst >= src + n || src >= dst + n) { |
|
197 | return memcpy(dst, src, n); |
203 | return memcpy(dst, src, n); |
- | 204 | } |
|
- | 205 | ||
- | 206 | /* Which direction? */ |
|
- | 207 | if (src > dst) { |
|
- | 208 | /* Forwards. */ |
|
- | 209 | sp = src; |
|
- | 210 | dp = dst; |
|
198 | 211 | ||
199 | for (j = (n % sizeof(unsigned long)) - 1; j >= 0; j--) |
212 | while (n-- != 0) |
- | 213 | *dp++ = *sp++; |
|
- | 214 | } else { |
|
- | 215 | /* Backwards. */ |
|
200 | ((unsigned char *) ((unsigned long *) dst))[j] = |
216 | sp = src + (n - 1); |
201 | ((unsigned char *) ((unsigned long *) src))[j]; |
217 | dp = dst + (n - 1); |
202 | 218 | ||
203 | for (i = n / sizeof(unsigned long) - 1; i >=0 ; i--) |
219 | while (n-- != 0) |
204 | ((unsigned long *) dst)[i] = ((unsigned long *) src)[i]; |
220 | *dp-- = *sp--; |
205 | 221 | } |
|
- | 222 | ||
206 | return (char *) dst; |
223 | return dst; |
207 | } |
224 | } |
208 | 225 | ||
209 | /** Compare two memory areas. |
226 | /** Compare two memory areas. |
210 | * |
227 | * |
211 | * @param s1 Pointer to the first area to compare. |
228 | * @param s1 Pointer to the first area to compare. |