From 29cd838eab01ed7110f3ccb2e8c6a35c8a31dbcc Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 11 Apr 2024 10:21:29 +0200 Subject: Adding upstream version 1:0.1.9998svn3589+dfsg. Signed-off-by: Daniel Baumann --- src/sed/lib/memmove.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/sed/lib/memmove.c (limited to 'src/sed/lib/memmove.c') diff --git a/src/sed/lib/memmove.c b/src/sed/lib/memmove.c new file mode 100644 index 0000000..a0d730e --- /dev/null +++ b/src/sed/lib/memmove.c @@ -0,0 +1,76 @@ +/* Copyright (C) 1998 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +/* Last ditch effort to support memmove: if user doesn't have + memmove or bcopy, we offer this sluggish implementation. */ + +#include "config.h" +#ifndef HAVE_MEMMOVE + +#include +#ifdef HAVE_MEMORY_H +# include +#endif + +#ifndef VOID +# define VOID void +#endif + +VOID * +memmove(dest, src, len) + VOID *dest; + const VOID *src; + size_t len; +{ +#ifdef HAVE_BCOPY + bcopy(src, dest, len); + +#else /*!HAVE_BCOPY*/ + char *dp = dest; + const char *sp = src; + +# ifdef HAVE_MEMCPY + /* A special-case for non-overlapping regions, on the assumption + that there is some hope that the sytem's memcpy() implementaion + is better than our dumb fall-back one. */ + if ((dp < sp && dp+len < sp) || (sp < dp && sp+len < dp)) + return memcpy(dest, src, len); +# endif + + /* I tried real hard to avoid getting to this point. + You *really* ought to upgrade your system's libraries; + the performance of this implementation sucks. */ + if (dp < sp) + { + while (len-- > 0) + *dp++ = *sp++; + } + else + { + if (dp == sp) + return dest; + dp += len; + sp += len; + while (len-- > 0) + *--dp = *--sp; + } +#endif /*!HAVE_BCOPY*/ + + return dest; +} + +#endif /*!HAVE_MEMMOVE*/ -- cgit v1.2.3