]> pd.if.org Git - pdclib/blob - functions/string/memcpy.c
Merged PDPCLIB and Therx code.
[pdclib] / functions / string / memcpy.c
1 // ----------------------------------------------------------------------------
2 // $Id$
3 // ----------------------------------------------------------------------------
4 // Public Domain C Library - http://pdclib.sourceforge.net
5 // This code is Public Domain. Use, modify, and redistribute at will.
6 // ----------------------------------------------------------------------------
7
8 void * memcpy( void * restrict s1, const void * restrict s2, size_t n ) { /* TODO */ };
9
10 /* Therx code
11 {
12     void * ret = s1;
13     const char * src = (const char *) s2;
14     char * dst = (char *) s1;
15     for( ; n != 0; n-- )
16     {
17         *dst++ = *src++;
18     }
19     return ret;
20 }
21 */
22
23 /* PDPC code - unreviewed
24 void *memcpy(void *s1, const void *s2, size_t n)
25 {
26     register const unsigned char *f = s2;
27     register const unsigned char *fe;
28     register unsigned char *t = s1;
29     
30     fe = f + n;
31     while (f != fe)
32     {
33         *t++ = *f++;
34     }
35     return (s1);
36 }
37 #else
38 void *memcpy(void *s1, const void *s2, size_t n)
39 {
40     register unsigned int *p = (unsigned int *)s1;
41     register unsigned int *cs2 = (unsigned int *)s2;
42     register unsigned int *endi;
43     
44     endi = (unsigned int *)((char *)p + (n & ~0x03));
45     while (p != endi)
46     {
47         *p++ = *cs2++;
48     }
49     switch (n & 0x03)
50     {
51         case 0:
52             break;
53         case 1:
54             *(char *)p = *(char *)cs2;
55             break;
56         case 2:
57             *(char *)p = *(char *)cs2;
58             p = (unsigned int *)((char *)p + 1);
59             cs2 = (unsigned int *)((char *)cs2 + 1);
60             *(char *)p = *(char *)cs2;
61             break;
62         case 3:
63             *(char *)p = *(char *)cs2;
64             p = (unsigned int *)((char *)p + 1);
65             cs2 = (unsigned int *)((char *)cs2 + 1);
66             *(char *)p = *(char *)cs2;
67             p = (unsigned int *)((char *)p + 1);
68             cs2 = (unsigned int *)((char *)cs2 + 1);
69             *(char *)p = *(char *)cs2;
70             break;
71     }
72     return (s1);
73 }
74 */