1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* xalloc.h -- malloc with out-of-memory checking
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 1990-2000, 2003-2004, 2006-2012 Free Software Foundation, Inc.
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3 of the License, or
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is distributed in the hope that it will be useful,
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef XALLOC_H_
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define XALLOC_H_
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <stddef.h>
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "xalloc-oversized.h"
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_INLINE_HEADER_BEGIN
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef XALLOC_INLINE
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define XALLOC_INLINE _GL_INLINE
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __cplusplus
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern "C" {
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if __GNUC__ >= 3
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_ATTRIBUTE_MALLOC
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* This function is always triggered when memory is exhausted.
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   It must be defined by the application, either explicitly
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   or by using gnulib's xalloc-die module.  This is the
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   function to call when one wants the program to die because of a
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   memory allocation failure.  */
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern _Noreturn void xalloc_die (void);
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid *xmalloc (size_t s)
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid *xzalloc (size_t s)
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid *xcalloc (size_t n, size_t s)
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2));
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid *xrealloc (void *p, size_t s)
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      _GL_ATTRIBUTE_ALLOC_SIZE ((2));
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *x2realloc (void *p, size_t *pn);
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid *xmemdup (void const *p, size_t s)
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((2));
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar *xstrdup (char const *str)
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      _GL_ATTRIBUTE_MALLOC;
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* In the following macros, T must be an elementary or structure/union or
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   typedef'ed type, or a pointer to such a type.  To apply one of the
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   following macros to a function pointer or array type, you need to typedef
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   it first and use the typedef name.  */
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Allocate an object of type T dynamically, with error checking.  */
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* extern t *XMALLOC (typename t); */
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define XMALLOC(t) ((t *) xmalloc (sizeof (t)))
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Allocate memory for N elements of type T, with error checking.  */
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* extern t *XNMALLOC (size_t n, typename t); */
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define XNMALLOC(n, t) \
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t))))
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Allocate an object of type T dynamically, with error checking,
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   and zero it.  */
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* extern t *XZALLOC (typename t); */
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define XZALLOC(t) ((t *) xzalloc (sizeof (t)))
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Allocate memory for N elements of type T, with error checking,
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   and zero it.  */
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* extern t *XCALLOC (size_t n, typename t); */
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define XCALLOC(n, t) \
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t))))
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Allocate an array of N objects, each with S bytes of memory,
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   dynamically, with error checking.  S must be nonzero.  */
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9705436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE void *xnmalloc (size_t n, size_t s)
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2));
9905436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE void *
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wangxnmalloc (size_t n, size_t s)
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (xalloc_oversized (n, s))
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    xalloc_die ();
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return xmalloc (n * s);
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Change the size of an allocated block of memory P to an array of N
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   objects each of S bytes, with error checking.  S must be nonzero.  */
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11005436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE void *xnrealloc (void *p, size_t n, size_t s)
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3));
11205436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE void *
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wangxnrealloc (void *p, size_t n, size_t s)
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (xalloc_oversized (n, s))
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    xalloc_die ();
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return xrealloc (p, n * s);
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* If P is null, allocate a block of at least *PN such objects;
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   otherwise, reallocate P so that it contains more than *PN objects
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   each of S bytes.  *PN must be nonzero unless P is null, and S must
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   be nonzero.  Set *PN to the new number of objects, and return the
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   pointer to the new block.  *PN is never set to zero, and the
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   returned pointer is never null.
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Repeated reallocations are guaranteed to make progress, either by
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   allocating an initial block with a nonzero size, or by allocating a
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   larger block.
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   In the following implementation, nonzero sizes are increased by a
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   factor of approximately 1.5 so that repeated reallocations have
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   O(N) overall cost rather than O(N**2) cost, but the
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   specification for this function does not guarantee that rate.
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Here is an example of use:
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang     int *p = NULL;
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang     size_t used = 0;
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     size_t allocated = 0;
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     void
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang     append_int (int value)
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       {
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang         if (used == allocated)
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang           p = x2nrealloc (p, &allocated, sizeof *p);
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang         p[used++] = value;
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       }
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This causes x2nrealloc to allocate a block of some nonzero size the
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   first time it is called.
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   To have finer-grained control over the initial size, set *PN to a
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   nonzero value before calling this function with P == NULL.  For
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   example:
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang     int *p = NULL;
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang     size_t used = 0;
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang     size_t allocated = 0;
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     size_t allocated1 = 1000;
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     void
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang     append_int (int value)
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       {
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang         if (used == allocated)
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang           {
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang             p = x2nrealloc (p, &allocated1, sizeof *p);
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang             allocated = allocated1;
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang           }
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang         p[used++] = value;
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       }
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   */
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17505436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE void *
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wangx2nrealloc (void *p, size_t *pn, size_t s)
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  size_t n = *pn;
17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (! p)
18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      if (! n)
18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* The approximate size to use for initial small allocation
18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang             requests, when the invoking code specifies an old size of
18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang             zero.  This is the largest "small" request for the GNU C
18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang             library malloc.  */
18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          n = DEFAULT_MXFAST / s;
19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          n += !n;
19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  else
19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      /* Set N = ceil (1.5 * N) so that progress is made if N == 1.
19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang         Check for overflow, so that N * S stays in size_t range.
19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang         The check is slightly conservative, but an exact check isn't
19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang         worth the trouble.  */
20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      if ((size_t) -1 / 3 * 2 / s <= n)
20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        xalloc_die ();
20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      n += (n + 1) / 2;
20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  *pn = n;
20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return xrealloc (p, n * s);
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Return a pointer to a new buffer of N bytes.  This is like xmalloc,
21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   except it returns char *.  */
21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
21205436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE char *xcharalloc (size_t n)
21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
21405436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE char *
21505436638acc7c010349a69c3395f1a57c642dc62Ying Wangxcharalloc (size_t n)
21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return XNMALLOC (n, char);
21805436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __cplusplus
22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* C++ does not allow conversions from void * to other pointer types
22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   without a cast.  Use templates to work around the problem when
22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   possible.  */
22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
22705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtemplate <typename T> inline T *
22805436638acc7c010349a69c3395f1a57c642dc62Ying Wangxrealloc (T *p, size_t s)
22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return (T *) xrealloc ((void *) p, s);
23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
23305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtemplate <typename T> inline T *
23405436638acc7c010349a69c3395f1a57c642dc62Ying Wangxnrealloc (T *p, size_t n, size_t s)
23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return (T *) xnrealloc ((void *) p, n, s);
23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
23905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtemplate <typename T> inline T *
24005436638acc7c010349a69c3395f1a57c642dc62Ying Wangx2realloc (T *p, size_t *pn)
24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return (T *) x2realloc ((void *) p, pn);
24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
24405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
24505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtemplate <typename T> inline T *
24605436638acc7c010349a69c3395f1a57c642dc62Ying Wangx2nrealloc (T *p, size_t *pn, size_t s)
24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
24805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return (T *) x2nrealloc ((void *) p, pn, s);
24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
25105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtemplate <typename T> inline T *
25205436638acc7c010349a69c3395f1a57c642dc62Ying Wangxmemdup (T const *p, size_t s)
25305436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return (T *) xmemdup ((void const *) p, s);
25505436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
25605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
25705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* !XALLOC_H_ */
261