Line | |
---|
1 | /* fast memcpy -- Copyright (C) 2003 Thomas M. Ogrisegg <tom@hi-tek.fnord.at> */ |
---|
2 | |
---|
3 | #include <string.h> |
---|
4 | #include "dietfeatures.h" |
---|
5 | #include "dietstring.h" |
---|
6 | |
---|
7 | void * |
---|
8 | memcpy (void *dst, const void *src, size_t n) |
---|
9 | { |
---|
10 | void *res = dst; |
---|
11 | unsigned char *c1, *c2; |
---|
12 | #ifdef WANT_SMALL_STRING_ROUTINES |
---|
13 | c1 = (unsigned char *) dst; |
---|
14 | c2 = (unsigned char *) src; |
---|
15 | while (n--) *c1++ = *c2++; |
---|
16 | return (res); |
---|
17 | #else |
---|
18 | int tmp; |
---|
19 | unsigned long *lx1 = NULL; |
---|
20 | const unsigned long *lx2 = NULL; |
---|
21 | |
---|
22 | if (!UNALIGNED(dst, src) && n > sizeof(unsigned long)) { |
---|
23 | |
---|
24 | if ((tmp = STRALIGN(dst))) { |
---|
25 | c1 = (unsigned char *) dst; |
---|
26 | c2 = (unsigned char *) src; |
---|
27 | while (tmp-- && n--) |
---|
28 | *c1++ = *c2++; |
---|
29 | if (n == (size_t) - 1) |
---|
30 | return (res); |
---|
31 | dst = c1; |
---|
32 | src = c2; |
---|
33 | } |
---|
34 | |
---|
35 | lx1 = (unsigned long *) dst; |
---|
36 | lx2 = (unsigned long *) src; |
---|
37 | |
---|
38 | for (; n >= sizeof(unsigned long); n -= sizeof(unsigned long)) |
---|
39 | *lx1++ = *lx2++; |
---|
40 | } |
---|
41 | |
---|
42 | if (n) { |
---|
43 | c1 = (unsigned char *) (lx1?lx1:dst); |
---|
44 | c2 = (unsigned char *) (lx1?lx2:src); |
---|
45 | while (n--) |
---|
46 | *c1++ = *c2++; |
---|
47 | } |
---|
48 | |
---|
49 | return (res); |
---|
50 | #endif |
---|
51 | } |
---|
Note: See
TracBrowser
for help on using the repository browser.