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