1 | /*-
|
---|
2 | * Copyright (c) 1990, 1993
|
---|
3 | * The Regents of the University of California. All rights reserved.
|
---|
4 | *
|
---|
5 | * This code is derived from software contributed to Berkeley by
|
---|
6 | * Chris Torek.
|
---|
7 | *
|
---|
8 | * Redistribution and use in source and binary forms, with or without
|
---|
9 | * modification, are permitted provided that the following conditions
|
---|
10 | * are met:
|
---|
11 | * 1. Redistributions of source code must retain the above copyright
|
---|
12 | * notice, this list of conditions and the following disclaimer.
|
---|
13 | * 2. Redistributions in binary form must reproduce the above copyright
|
---|
14 | * notice, this list of conditions and the following disclaimer in the
|
---|
15 | * documentation and/or other materials provided with the distribution.
|
---|
16 | * 3. All advertising materials mentioning features or use of this software
|
---|
17 | * must display the following acknowledgement:
|
---|
18 | * This product includes software developed by the University of
|
---|
19 | * California, Berkeley and its contributors.
|
---|
20 | * 4. Neither the name of the University nor the names of its contributors
|
---|
21 | * may be used to endorse or promote products derived from this software
|
---|
22 | * without specific prior written permission.
|
---|
23 | *
|
---|
24 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
---|
25 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
---|
26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
---|
27 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
---|
28 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
---|
29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
---|
30 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
---|
31 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
---|
32 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
---|
33 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
---|
34 | * SUCH DAMAGE.
|
---|
35 | */
|
---|
36 |
|
---|
37 | #if 0
|
---|
38 | #if defined(LIBC_SCCS) && !defined(lint)
|
---|
39 | static char sccsid[] = "@(#)bcopy.c 8.1 (Berkeley) 6/4/93";
|
---|
40 | #endif /* LIBC_SCCS and not lint */
|
---|
41 |
|
---|
42 | #include <sys/cdefs.h>
|
---|
43 | #include <string.h>
|
---|
44 | #endif
|
---|
45 |
|
---|
46 | /*
|
---|
47 | * sizeof(word) MUST BE A POWER OF TWO
|
---|
48 | * SO THAT wmask BELOW IS ALL ONES
|
---|
49 | */
|
---|
50 | typedef int word; /* "word" used for optimal copy speed */
|
---|
51 |
|
---|
52 | #define wsize sizeof(word)
|
---|
53 | #define wmask (wsize - 1)
|
---|
54 |
|
---|
55 | /* ADR: 1/2004. For gawk, we need memmove(). */
|
---|
56 | #define MEMMOVE 1
|
---|
57 |
|
---|
58 | /*
|
---|
59 | * Copy a block of memory, handling overlap.
|
---|
60 | * This is the routine that actually implements
|
---|
61 | * (the portable versions of) bcopy, memcpy, and memmove.
|
---|
62 | */
|
---|
63 | #ifdef MEMCOPY
|
---|
64 | void *
|
---|
65 | memcpy(dst0, src0, length)
|
---|
66 | #else
|
---|
67 | #ifdef MEMMOVE
|
---|
68 | void *
|
---|
69 | memmove(dst0, src0, length)
|
---|
70 | #else
|
---|
71 | void
|
---|
72 | bcopy(src0, dst0, length)
|
---|
73 | #endif
|
---|
74 | #endif
|
---|
75 | void *dst0;
|
---|
76 | const void *src0;
|
---|
77 | register size_t length;
|
---|
78 | {
|
---|
79 | register char *dst = dst0;
|
---|
80 | register const char *src = src0;
|
---|
81 | register size_t t;
|
---|
82 |
|
---|
83 | if (length == 0 || dst == src) /* nothing to do */
|
---|
84 | goto done;
|
---|
85 |
|
---|
86 | /*
|
---|
87 | * Macros: loop-t-times; and loop-t-times, t>0
|
---|
88 | */
|
---|
89 | #define TLOOP(s) if (t) TLOOP1(s)
|
---|
90 | #define TLOOP1(s) do { s; } while (--t)
|
---|
91 |
|
---|
92 | if ((unsigned long)dst < (unsigned long)src) {
|
---|
93 | /*
|
---|
94 | * Copy forward.
|
---|
95 | */
|
---|
96 | t = (int)src; /* only need low bits */
|
---|
97 | if ((t | (int)dst) & wmask) {
|
---|
98 | /*
|
---|
99 | * Try to align operands. This cannot be done
|
---|
100 | * unless the low bits match.
|
---|
101 | */
|
---|
102 | if ((t ^ (int)dst) & wmask || length < wsize)
|
---|
103 | t = length;
|
---|
104 | else
|
---|
105 | t = wsize - (t & wmask);
|
---|
106 | length -= t;
|
---|
107 | TLOOP1(*dst++ = *src++);
|
---|
108 | }
|
---|
109 | /*
|
---|
110 | * Copy whole words, then mop up any trailing bytes.
|
---|
111 | */
|
---|
112 | t = length / wsize;
|
---|
113 | TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize);
|
---|
114 | t = length & wmask;
|
---|
115 | TLOOP(*dst++ = *src++);
|
---|
116 | } else {
|
---|
117 | /*
|
---|
118 | * Copy backwards. Otherwise essentially the same.
|
---|
119 | * Alignment works as before, except that it takes
|
---|
120 | * (t&wmask) bytes to align, not wsize-(t&wmask).
|
---|
121 | */
|
---|
122 | src += length;
|
---|
123 | dst += length;
|
---|
124 | t = (int)src;
|
---|
125 | if ((t | (int)dst) & wmask) {
|
---|
126 | if ((t ^ (int)dst) & wmask || length <= wsize)
|
---|
127 | t = length;
|
---|
128 | else
|
---|
129 | t &= wmask;
|
---|
130 | length -= t;
|
---|
131 | TLOOP1(*--dst = *--src);
|
---|
132 | }
|
---|
133 | t = length / wsize;
|
---|
134 | TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src);
|
---|
135 | t = length & wmask;
|
---|
136 | TLOOP(*--dst = *--src);
|
---|
137 | }
|
---|
138 | done:
|
---|
139 | #if defined(MEMCOPY) || defined(MEMMOVE)
|
---|
140 | return (dst0);
|
---|
141 | #else
|
---|
142 | return;
|
---|
143 | #endif
|
---|
144 | }
|
---|
145 | #undef wsize
|
---|
146 | #undef wmask
|
---|
147 | #undef MEMMOVE
|
---|
148 | #undef TLOOP
|
---|
149 | #undef TLOOP1
|
---|