⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memcpy.c

📁 含有完整TCP/IP PPP协议的嵌入式操作系统
💻 C
字号:
/* * Copyright (C) 2004 by egnite Software GmbH. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 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. Neither the name of the copyright holders nor the names of *    contributors may be used to endorse or promote products derived *    from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * For additional information see http://www.ethernut.de/ * *- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Chris Torek. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 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. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. *//* * $Log: memcpy.c,v $ * Revision 1.2  2005/08/02 17:46:47  haraldkipp * Major API documentation update. * * Revision 1.1  2004/09/08 10:23:43  haraldkipp * Generic C string library added * */#include <compiler.h>#include <string.h>/*! * \addtogroup xgCrtString *//*@{*//*! * \brief Copy a string. *  * Copies a source string including the terminating zero character to  * a destination string. * * \note The function does not perform any overflow checking. * * \param dst Pointer to the destination string. * \param src Pointer to the source string. * * \return The original destination pointer. *//* * sizeof(word) MUST BE A POWER OF TWO * SO THAT wmask BELOW IS ALL ONES */typedef	long word;		/* "word" used for optimal copy speed */#define	wsize	sizeof(word)#define	wmask	(wsize - 1)/* * Copy a block of memory, handling overlap. * This is the routine that actually implements * (the portable versions of) bcopy, memcpy, and memmove. */void *memcpy(void *dst0, CONST void *src0, size_t length){	register char *dst = dst0;	register const char *src = src0;	register size_t t;	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)	if ((unsigned long)dst < (unsigned long)src) {		/*		 * Copy forward.		 */		t = (long)src;	/* only need low bits */		if ((t | (long)dst) & wmask) {			/*			 * Try to align operands.  This cannot be done			 * unless the low bits match.			 */			if ((t ^ (long)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 = (long)src;		if ((t | (long)dst) & wmask) {			if ((t ^ (long)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:	return dst0;}/*@}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -