diff options
Diffstat (limited to 'newlib/libc/stdlib')
-rw-r--r-- | newlib/libc/stdlib/Makefile.am | 1 | ||||
-rw-r--r-- | newlib/libc/stdlib/Makefile.in | 23 | ||||
-rw-r--r-- | newlib/libc/stdlib/malloc.c | 27 | ||||
-rw-r--r-- | newlib/libc/stdlib/reallocf.c | 55 |
4 files changed, 95 insertions, 11 deletions
diff --git a/newlib/libc/stdlib/Makefile.am b/newlib/libc/stdlib/Makefile.am index ce3bcbca4..e63ea0334 100644 --- a/newlib/libc/stdlib/Makefile.am +++ b/newlib/libc/stdlib/Makefile.am @@ -47,6 +47,7 @@ GENERAL_SOURCES = \ rand.c \ rand_r.c \ realloc.c \ + reallocf.c \ strtod.c \ strtol.c \ strtoul.c \ diff --git a/newlib/libc/stdlib/Makefile.in b/newlib/libc/stdlib/Makefile.in index 632e92d23..be947cbcf 100644 --- a/newlib/libc/stdlib/Makefile.in +++ b/newlib/libc/stdlib/Makefile.in @@ -87,11 +87,11 @@ am__objects_1 = lib_a-__adjust.$(OBJEXT) lib_a-__atexit.$(OBJEXT) \ lib_a-mlock.$(OBJEXT) lib_a-mprec.$(OBJEXT) \ lib_a-mstats.$(OBJEXT) lib_a-rand.$(OBJEXT) \ lib_a-rand_r.$(OBJEXT) lib_a-realloc.$(OBJEXT) \ - lib_a-strtod.$(OBJEXT) lib_a-strtol.$(OBJEXT) \ - lib_a-strtoul.$(OBJEXT) lib_a-wcstol.$(OBJEXT) \ - lib_a-wcstoul.$(OBJEXT) lib_a-wcstombs.$(OBJEXT) \ - lib_a-wcstombs_r.$(OBJEXT) lib_a-wctomb.$(OBJEXT) \ - lib_a-wctomb_r.$(OBJEXT) + lib_a-reallocf.$(OBJEXT) lib_a-strtod.$(OBJEXT) \ + lib_a-strtol.$(OBJEXT) lib_a-strtoul.$(OBJEXT) \ + lib_a-wcstol.$(OBJEXT) lib_a-wcstoul.$(OBJEXT) \ + lib_a-wcstombs.$(OBJEXT) lib_a-wcstombs_r.$(OBJEXT) \ + lib_a-wctomb.$(OBJEXT) lib_a-wctomb_r.$(OBJEXT) am__objects_2 = lib_a-cxa_atexit.$(OBJEXT) \ lib_a-cxa_finalize.$(OBJEXT) lib_a-drand48.$(OBJEXT) \ lib_a-ecvtbuf.$(OBJEXT) lib_a-efgcvt.$(OBJEXT) \ @@ -135,9 +135,9 @@ am__objects_7 = __adjust.lo __atexit.lo __call_atexit.lo __exp10.lo \ gdtoa-gethex.lo gdtoa-hexnan.lo getenv.lo getenv_r.lo labs.lo \ ldiv.lo ldtoa.lo malloc.lo mblen.lo mblen_r.lo mbstowcs.lo \ mbstowcs_r.lo mbtowc.lo mbtowc_r.lo mlock.lo mprec.lo \ - mstats.lo rand.lo rand_r.lo realloc.lo strtod.lo strtol.lo \ - strtoul.lo wcstol.lo wcstoul.lo wcstombs.lo wcstombs_r.lo \ - wctomb.lo wctomb_r.lo + mstats.lo rand.lo rand_r.lo realloc.lo reallocf.lo strtod.lo \ + strtol.lo strtoul.lo wcstol.lo wcstoul.lo wcstombs.lo \ + wcstombs_r.lo wctomb.lo wctomb_r.lo am__objects_8 = cxa_atexit.lo cxa_finalize.lo drand48.lo ecvtbuf.lo \ efgcvt.lo erand48.lo jrand48.lo lcong48.lo lrand48.lo \ mrand48.lo msize.lo mtrim.lo nrand48.lo rand48.lo seed48.lo \ @@ -388,6 +388,7 @@ GENERAL_SOURCES = \ rand.c \ rand_r.c \ realloc.c \ + reallocf.c \ strtod.c \ strtol.c \ strtoul.c \ @@ -857,6 +858,12 @@ lib_a-realloc.o: realloc.c lib_a-realloc.obj: realloc.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-realloc.obj `if test -f 'realloc.c'; then $(CYGPATH_W) 'realloc.c'; else $(CYGPATH_W) '$(srcdir)/realloc.c'; fi` +lib_a-reallocf.o: reallocf.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-reallocf.o `test -f 'reallocf.c' || echo '$(srcdir)/'`reallocf.c + +lib_a-reallocf.obj: reallocf.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-reallocf.obj `if test -f 'reallocf.c'; then $(CYGPATH_W) 'reallocf.c'; else $(CYGPATH_W) '$(srcdir)/reallocf.c'; fi` + lib_a-strtod.o: strtod.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strtod.o `test -f 'strtod.c' || echo '$(srcdir)/'`strtod.c diff --git a/newlib/libc/stdlib/malloc.c b/newlib/libc/stdlib/malloc.c index 83453ab8d..160a13eff 100644 --- a/newlib/libc/stdlib/malloc.c +++ b/newlib/libc/stdlib/malloc.c @@ -23,6 +23,8 @@ INDEX INDEX realloc INDEX + reallocf +INDEX free INDEX memalign @@ -33,6 +35,8 @@ INDEX INDEX _realloc_r INDEX + _reallocf_r +INDEX _free_r INDEX _memalign_r @@ -43,6 +47,7 @@ ANSI_SYNOPSIS #include <stdlib.h> void *malloc(size_t <[nbytes]>); void *realloc(void *<[aptr]>, size_t <[nbytes]>); + void *reallocf(void *<[aptr]>, size_t <[nbytes]>); void free(void *<[aptr]>); void *memalign(size_t <[align]>, size_t <[nbytes]>); @@ -52,6 +57,8 @@ ANSI_SYNOPSIS void *_malloc_r(void *<[reent]>, size_t <[nbytes]>); void *_realloc_r(void *<[reent]>, void *<[aptr]>, size_t <[nbytes]>); + void *_reallocf_r(void *<[reent]>, + void *<[aptr]>, size_t <[nbytes]>); void _free_r(void *<[reent]>, void *<[aptr]>); void *_memalign_r(void *<[reent]>, @@ -68,6 +75,10 @@ TRAD_SYNOPSIS char *<[aptr]>; size_t <[nbytes]>; + char *reallocf(<[aptr]>, <[nbytes]>) + char *<[aptr]>; + size_t <[nbytes]>; + void free(<[aptr]>) char *<[aptr]>; @@ -87,6 +98,11 @@ TRAD_SYNOPSIS char *<[aptr]>; size_t <[nbytes]>; + char *_reallocf_r(<[reent]>, <[aptr]>, <[nbytes]>) + char *<[reent]>; + char *<[aptr]>; + size_t <[nbytes]>; + void _free_r(<[reent]>, <[aptr]>) char *<[reent]>; char *<[aptr]>; @@ -124,6 +140,11 @@ memory storage pool by calling <<free>> with the address of the object as the argument. You can also use <<realloc>> for this purpose by calling it with <<0>> as the <[nbytes]> argument. +The <<reallocf>> function behaves just like <<realloc>> except if the +function is required to allocate new storage and this fails. In this +case <<reallocf>> will free the original object passed in whereas +<<realloc>> will not. + The <<memalign>> function returns a block of size <[nbytes]> aligned to a <[align]> boundary. The <[align]> argument must be a power of two. @@ -134,9 +155,9 @@ available in the block. This may or may not be more than the size requested from <<malloc>>, due to alignment or minimum size constraints. -The alternate functions <<_malloc_r>>, <<_realloc_r>>, <<_free_r>>, -<<_memalign_r>>, and <<_malloc_usable_size_r>> are reentrant versions. -The extra argument <[reent]> is a pointer to a reentrancy structure. +The alternate functions <<_malloc_r>>, <<_realloc_r>>, <<_reallocf_r>>, +<<_free_r>>, <<_memalign_r>>, and <<_malloc_usable_size_r>> are reentrant +versions. The extra argument <[reent]> is a pointer to a reentrancy structure. If you have multiple threads of execution which may call any of these routines, or if any of these routines may be called reentrantly, then diff --git a/newlib/libc/stdlib/reallocf.c b/newlib/libc/stdlib/reallocf.c new file mode 100644 index 000000000..a9d329398 --- /dev/null +++ b/newlib/libc/stdlib/reallocf.c @@ -0,0 +1,55 @@ +/*- + * Copyright (c) 1998, M. Warner Losh <imp@freebsd.org> + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* Documented in malloc.c. */ + +#include <sys/cdefs.h> + +#include <stdlib.h> + +_PTR +_DEFUN (_reallocf_r, (reentptr, ptr, size), + struct _reent *reentptr _AND + _PTR ptr _AND + size_t size) +{ + void *nptr; + + nptr = _realloc_r(reentptr, ptr, size); + if (!nptr && ptr) + _free_r(reentptr, ptr); + return (nptr); +} + +#ifndef _REENT_ONLY +_PTR +_DEFUN (reallocf, (ptr, size), + _PTR ptr _AND + size_t size) +{ + return _reallocf_r(_REENT, ptr, size); +} +#endif |