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. |