diff options
Diffstat (limited to 'nss/lib/dbm/src/memmove.c')
-rw-r--r-- | nss/lib/dbm/src/memmove.c | 145 |
1 files changed, 75 insertions, 70 deletions
diff --git a/nss/lib/dbm/src/memmove.c b/nss/lib/dbm/src/memmove.c index aacf946..135185b 100644 --- a/nss/lib/dbm/src/memmove.c +++ b/nss/lib/dbm/src/memmove.c @@ -1,7 +1,7 @@ #if defined(__sun) && !defined(__SVR4) /*- * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. + * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Chris Torek. @@ -14,7 +14,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. ***REMOVED*** - see + * 3. ***REMOVED*** - see * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software @@ -34,7 +34,7 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)bcopy.c 8.1 (Berkeley) 6/4/93"; +static char sccsid[] = "@(#)bcopy.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ #include <string.h> @@ -43,10 +43,10 @@ static char sccsid[] = "@(#)bcopy.c 8.1 (Berkeley) 6/4/93"; * sizeof(word) MUST BE A POWER OF TWO * SO THAT wmask BELOW IS ALL ONES */ -typedef int word; /* "word" used for optimal copy speed */ +typedef int word; /* "word" used for optimal copy speed */ -#define wsize sizeof(word) -#define wmask (wsize - 1) +#define wsize sizeof(word) +#define wmask (wsize - 1) /* * Copy a block of memory, handling overlap. @@ -55,84 +55,89 @@ typedef int word; /* "word" used for optimal copy speed */ */ #ifdef MEMCOPY void * -memcpy(dst0, src0, length) + memcpy(dst0, src0, length) #else #ifdef MEMMOVE void * -memmove(dst0, src0, length) + memmove(dst0, src0, length) #else void -bcopy(src0, dst0, length) + bcopy(src0, dst0, length) #endif #endif - void *dst0; - const void *src0; - register size_t length; + void *dst0; +const void *src0; +register size_t length; { - register char *dst = dst0; - register const char *src = src0; - register size_t t; + register char *dst = dst0; + register const char *src = src0; + register size_t t; - if (length == 0 || dst == src) /* nothing to do */ - goto done; + if (length == 0 || dst == src) /* nothing to do */ + goto done; - /* - * Macros: loop-t-times; and loop-t-times, t>0 - */ -#define TLOOP(s) if (t) TLOOP1(s) -#define TLOOP1(s) do { s; } while (--t) +/* + * Macros: loop-t-times; and loop-t-times, t>0 + */ +#define TLOOP(s) \ + if (t) \ + TLOOP1(s) +#define TLOOP1(s) \ + do { \ + s; \ + } while (--t) - if ((unsigned long)dst < (unsigned long)src) { - /* - * Copy forward. - */ - t = (int)src; /* only need low bits */ - if ((t | (int)dst) & wmask) { - /* - * Try to align operands. This cannot be done - * unless the low bits match. - */ - if ((t ^ (int)dst) & wmask || length < wsize) - t = length; - else - t = wsize - (t & wmask); - length -= t; - TLOOP1(*dst++ = *src++); - } - /* - * Copy whole words, then mop up any trailing bytes. - */ - t = length / wsize; - TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize); - t = length & wmask; - TLOOP(*dst++ = *src++); - } else { - /* - * Copy backwards. Otherwise essentially the same. - * Alignment works as before, except that it takes - * (t&wmask) bytes to align, not wsize-(t&wmask). - */ - src += length; - dst += length; - t = (int)src; - if ((t | (int)dst) & wmask) { - if ((t ^ (int)dst) & wmask || length <= wsize) - t = length; - else - t &= wmask; - length -= t; - TLOOP1(*--dst = *--src); - } - t = length / wsize; - TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src); - t = length & wmask; - TLOOP(*--dst = *--src); - } + if ((unsigned long)dst < (unsigned long)src) { + /* + * Copy forward. + */ + t = (int)src; /* only need low bits */ + if ((t | (int)dst) & wmask) { + /* + * Try to align operands. This cannot be done + * unless the low bits match. + */ + if ((t ^ (int)dst) & wmask || length < wsize) + t = length; + else + t = wsize - (t & wmask); + length -= t; + TLOOP1(*dst++ = *src++); + } + /* + * Copy whole words, then mop up any trailing bytes. + */ + t = length / wsize; + TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize); + t = length & wmask; + TLOOP(*dst++ = *src++); + } else { + /* + * Copy backwards. Otherwise essentially the same. + * Alignment works as before, except that it takes + * (t&wmask) bytes to align, not wsize-(t&wmask). + */ + src += length; + dst += length; + t = (int)src; + if ((t | (int)dst) & wmask) { + if ((t ^ (int)dst) & wmask || length <= wsize) + t = length; + else + t &= wmask; + length -= t; + TLOOP1(*--dst = *--src); + } + t = length / wsize; + TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src); + t = length & wmask; + TLOOP(*--dst = *--src); + } done: #if defined(MEMCOPY) || defined(MEMMOVE) - return (dst0); + return (dst0); #else - return; + return; #endif } #endif /* no __sgi */ |