1 /* 2 * Copyright (c) 1987, 1989 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #if defined(LIBC_SCCS) && !defined(lint) 19 static char sccsid[] = "@(#)bcopy.c 5.6 (Berkeley) 07/25/89"; 20 #endif /* LIBC_SCCS and not lint */ 21 22 #include <sys/types.h> 23 24 /* 25 * bcopy -- copy memory block, handling overlap of source and destination 26 * (vax movc3 instruction) 27 */ 28 29 typedef int word; /* size of "word" used for optimal copy speed */ 30 31 bcopy(src, dst, length) 32 register char *src, *dst; 33 register int length; 34 { 35 if (length && src != dst) 36 if ((u_int)dst < (u_int)src) 37 if (((int)src | (int)dst | length) & (sizeof(word) - 1)) 38 do /* copy by bytes */ 39 *dst++ = *src++; 40 while (--length); 41 else { 42 length /= sizeof(word); 43 do { /* copy by words */ 44 *(word *)dst = *(word *)src; 45 src += sizeof(word); 46 dst += sizeof(word); 47 } while (--length); 48 } 49 else { /* copy backwards */ 50 src += length; 51 dst += length; 52 if (((int)src | (int)dst | length) & (sizeof(word) - 1)) 53 do /* copy by bytes */ 54 *--dst = *--src; 55 while (--length); 56 else { 57 length /= sizeof(word); 58 do { /* copy by words */ 59 src -= sizeof(word); 60 dst -= sizeof(word); 61 *(word *)dst = *(word *)src; 62 } while (--length); 63 } 64 } 65 } 66