home *** CD-ROM | disk | FTP | other *** search
- /* realloc.c (emx+gcc) -- Copyright (c) 1990-1993 by Eberhard Mattes */
-
- #include <sys/emx.h>
- #include <stdlib.h>
-
- void *realloc (void *mem, size_t new_size)
- {
- void *p;
- size_t *block;
- size_t old_size;
-
- if (mem == NULL)
- return (malloc (new_size));
- if (new_size == 0)
- {
- free (mem);
- return (NULL);
- }
- HEAP_LOCK;
- block = mem;
- --block;
- old_size = (*block & ~3);
- *block = old_size; /* in use */
- if (_expand2 (mem, new_size) != NULL)
- {
- HEAP_UNLOCK;
- return (mem);
- }
- p = _malloc2 (new_size);
- if (p != NULL)
- {
- memcpy (p, mem, old_size);
- free (mem);
- }
- else
- _expand2 (mem, old_size); /* shrink block to original size */
- HEAP_UNLOCK;
- return (p);
- }
-