X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fcommon%2Frealloc.c;h=6c4f40a6c2d577e30e0f429425902c6bb619f4bc;hb=6657214a18d41ce76e9ea1bc8b67977ee13d3645;hp=32c05f46f8dbac520051accea1e41b6c6077ef4f;hpb=53dd513176425872128ef26031d00952ef7a0628;p=cc65 diff --git a/libsrc/common/realloc.c b/libsrc/common/realloc.c index 32c05f46f..6c4f40a6c 100644 --- a/libsrc/common/realloc.c +++ b/libsrc/common/realloc.c @@ -1,8 +1,35 @@ -/* - * realloc.c - * - * Ullrich von Bassewitz, 06.06.1998 - */ +/*****************************************************************************/ +/* */ +/* realloc.c */ +/* */ +/* Change the size of an allocated memory block */ +/* */ +/* */ +/* */ +/* (C) 1998-2002 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@musoftware.de */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ @@ -12,7 +39,7 @@ -void* realloc (void* block, size_t size) +void* __fastcall__ realloc (void* block, size_t size) { unsigned* b; unsigned* newblock; @@ -62,7 +89,19 @@ void* realloc (void* block, size_t size) * room left. Try to allocate a new block and copy the data. */ if (newblock = malloc (size)) { - memcpy (newblock, block, oldsize - 2); + + /* Adjust the old size to the user visible portion */ + oldsize -= sizeof (unsigned); + + /* If the new block is larger than the old one, copy the old + * data only + */ + if (size > oldsize) { + size = oldsize; + } + + /* Copy the block data */ + memcpy (newblock, block, size); free (block); } return newblock; @@ -70,9 +109,3 @@ void* realloc (void* block, size_t size) - - - - - -