1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* xalloc.h -- 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, 2003, 2004 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#ifndef XALLOC_H_
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define XALLOC_H_
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <stddef.h>
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef __cplusplus
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern "C" {
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifndef __attribute__
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   define __attribute__(x)
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  endif
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifndef ATTRIBUTE_NORETURN
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* This function is always triggered when memory is exhausted.
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   It must be defined by the application, either explicitly
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   or by using gnulib's xalloc-die module.  This is the
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   function to call when one wants the program to die because of a
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   memory allocation failure.  */
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern void xalloc_die (void) ATTRIBUTE_NORETURN;
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *xmalloc (size_t s);
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *xnmalloc (size_t n, size_t s);
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *xzalloc (size_t s);
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *xcalloc (size_t n, size_t s);
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *xrealloc (void *p, size_t s);
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *xnrealloc (void *p, size_t n, size_t s);
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *x2realloc (void *p, size_t *pn);
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *x2nrealloc (void *p, size_t *pn, size_t s);
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *xmemdup (void const *p, size_t s);
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *xstrdup (char const *str);
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Return 1 if an array of N objects, each of size S, cannot exist due
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   to size arithmetic overflow.  S must be positive and N must be
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   nonnegative.  This is a macro, not an inline function, so that it
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   works correctly even when SIZE_MAX < N.
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   By gnulib convention, SIZE_MAX represents overflow in size
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   calculations, so the conservative dividend to use here is
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   However, malloc (SIZE_MAX) fails on all known hosts where
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   exactly-SIZE_MAX allocations on such hosts; this avoids a test and
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   branch when S is known to be 1.  */
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define xalloc_oversized(n, s) \
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef __cplusplus
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* !XALLOC_H_ */
80