1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* xmalloc.c -- malloc with out of memory checking
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   1999, 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is free software; you can redistribute it and/or modify
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the Free Software Foundation; either version 2, or (at your option)
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   any later version.
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is distributed in the hope that it will be useful,
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   along with this program; if not, write to the Free Software Foundation,
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_CONFIG_H
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <config.h>
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "xalloc.h"
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdlib.h>
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <string.h>
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef SIZE_MAX
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define SIZE_MAX ((size_t) -1)
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* 1 if calloc is known to be compatible with GNU calloc.  This
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   matters if we are not also using the calloc module, which defines
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   HAVE_CALLOC and supports the GNU API even on non-GNU platforms.  */
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined HAVE_CALLOC || defined __GLIBC__
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum { HAVE_GNU_CALLOC = 1 };
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum { HAVE_GNU_CALLOC = 0 };
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Allocate an array of N objects, each with S bytes of memory,
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   dynamically, with error checking.  S must be nonzero.  */
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline void *
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxnmalloc_inline (size_t n, size_t s)
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void *p;
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (xalloc_oversized (n, s) || (! (p = malloc (n * s)) && n != 0))
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    xalloc_die ();
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return p;
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxnmalloc (size_t n, size_t s)
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return xnmalloc_inline (n, s);
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Allocate N bytes of memory dynamically, with error checking.  */
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxmalloc (size_t n)
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return xnmalloc_inline (n, 1);
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Change the size of an allocated block of memory P to an array of N
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   objects each of S bytes, with error checking.  S must be nonzero.  */
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline void *
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxnrealloc_inline (void *p, size_t n, size_t s)
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (xalloc_oversized (n, s) || (! (p = realloc (p, n * s)) && n != 0))
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    xalloc_die ();
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return p;
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxnrealloc (void *p, size_t n, size_t s)
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return xnrealloc_inline (p, n, s);
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Change the size of an allocated block of memory P to N bytes,
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   with error checking.  */
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxrealloc (void *p, size_t n)
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return xnrealloc_inline (p, n, 1);
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* If P is null, allocate a block of at least *PN such objects;
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   otherwise, reallocate P so that it contains more than *PN objects
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   each of S bytes.  *PN must be nonzero unless P is null, and S must
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   be nonzero.  Set *PN to the new number of objects, and return the
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   pointer to the new block.  *PN is never set to zero, and the
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   returned pointer is never null.
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Repeated reallocations are guaranteed to make progress, either by
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   allocating an initial block with a nonzero size, or by allocating a
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   larger block.
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   In the following implementation, nonzero sizes are doubled so that
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   repeated reallocations have O(N log N) overall cost rather than
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   O(N**2) cost, but the specification for this function does not
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   guarantee that sizes are doubled.
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Here is an example of use:
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     int *p = NULL;
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     size_t used = 0;
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     size_t allocated = 0;
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     void
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     append_int (int value)
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       {
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 if (used == allocated)
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   p = x2nrealloc (p, &allocated, sizeof *p);
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 p[used++] = value;
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       }
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This causes x2nrealloc to allocate a block of some nonzero size the
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   first time it is called.
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   To have finer-grained control over the initial size, set *PN to a
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   nonzero value before calling this function with P == NULL.  For
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   example:
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     int *p = NULL;
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     size_t used = 0;
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     size_t allocated = 0;
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     size_t allocated1 = 1000;
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     void
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     append_int (int value)
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       {
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 if (used == allocated)
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   {
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     p = x2nrealloc (p, &allocated1, sizeof *p);
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     allocated = allocated1;
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   }
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 p[used++] = value;
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       }
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   */
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline void *
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectx2nrealloc_inline (void *p, size_t *pn, size_t s)
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t n = *pn;
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (! p)
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (! n)
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  /* The approximate size to use for initial small allocation
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     requests, when the invoking code specifies an old size of
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     zero.  64 bytes is the largest "small" request for the
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     GNU C library malloc.  */
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  enum { DEFAULT_MXFAST = 64 };
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  n = DEFAULT_MXFAST / s;
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  n += !n;
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (SIZE_MAX / 2 / s < n)
172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	xalloc_die ();
173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      n *= 2;
174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  *pn = n;
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return xrealloc (p, n * s);
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectx2nrealloc (void *p, size_t *pn, size_t s)
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return x2nrealloc_inline (p, pn, s);
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* If P is null, allocate a block of at least *PN bytes; otherwise,
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   reallocate P so that it contains more than *PN bytes.  *PN must be
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   nonzero unless P is null.  Set *PN to the new block's size, and
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   return the pointer to the new block.  *PN is never set to zero, and
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the returned pointer is never null.  */
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectx2realloc (void *p, size_t *pn)
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return x2nrealloc_inline (p, pn, 1);
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Allocate S bytes of zeroed memory dynamically, with error checking.
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   There's no need for xnzalloc (N, S), since it would be equivalent
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   to xcalloc (N, S).  */
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxzalloc (size_t s)
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return memset (xmalloc (s), 0, s);
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Allocate zeroed memory for N elements of S bytes, with error
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   checking.  S must be nonzero.  */
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxcalloc (size_t n, size_t s)
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void *p;
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Test for overflow, since some calloc implementations don't have
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     proper overflow checks.  But omit overflow and size-zero tests if
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     HAVE_GNU_CALLOC, since GNU calloc catches overflow and never
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     returns NULL if successful.  */
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if ((! HAVE_GNU_CALLOC && xalloc_oversized (n, s))
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0)))
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    xalloc_die ();
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return p;
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Clone an object P of size S, with error checking.  There's no need
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   need for an arithmetic overflow check.  */
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxmemdup (void const *p, size_t s)
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return memcpy (xmalloc (s), p, s);
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Clone STRING.  */
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxstrdup (char const *string)
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return xmemdup (string, strlen (string) + 1);
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
242