xref: /netbsd-src/external/gpl2/gettext/dist/gettext-tools/gnulib-lib/memmove.c (revision 946379e7b37692fc43f68eb0d1c10daa0a7f3b6c)
1*946379e7Schristos /* memmove.c -- copy memory.
2*946379e7Schristos    Copy LENGTH bytes from SOURCE to DEST.  Does not null-terminate.
3*946379e7Schristos    In the public domain.
4*946379e7Schristos    By David MacKenzie <djm@gnu.ai.mit.edu>.  */
5*946379e7Schristos 
6*946379e7Schristos #include <config.h>
7*946379e7Schristos 
8*946379e7Schristos #include <stddef.h>
9*946379e7Schristos 
10*946379e7Schristos void *
memmove(void * dest0,void const * source0,size_t length)11*946379e7Schristos memmove (void *dest0, void const *source0, size_t length)
12*946379e7Schristos {
13*946379e7Schristos   char *dest = dest0;
14*946379e7Schristos   char const *source = source0;
15*946379e7Schristos   if (source < dest)
16*946379e7Schristos     /* Moving from low mem to hi mem; start at end.  */
17*946379e7Schristos     for (source += length, dest += length; length; --length)
18*946379e7Schristos       *--dest = *--source;
19*946379e7Schristos   else if (source != dest)
20*946379e7Schristos     {
21*946379e7Schristos       /* Moving from hi mem to low mem; start at beginning.  */
22*946379e7Schristos       for (; length; --length)
23*946379e7Schristos 	*dest++ = *source++;
24*946379e7Schristos     }
25*946379e7Schristos   return dest0;
26*946379e7Schristos }
27