Home | History | Annotate | Line # | Download | only in lib
      1 /*	$NetBSD: xalloc.h,v 1.1.1.1 2016/01/13 03:15:30 christos Exp $	*/
      2 
      3 /* xalloc.h -- malloc with out-of-memory checking
      4    Copyright (C) 1990-1998, 1999, 2000, 2002 Free Software Foundation, Inc.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 2, or (at your option)
      9    any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software Foundation,
     18    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
     19 
     20 #ifndef XALLOC_H_
     21 # define XALLOC_H_
     22 
     23 # ifndef PARAMS
     24 #  if defined PROTOTYPES || (defined __STDC__ && __STDC__)
     25 #   define PARAMS(Args) Args
     26 #  else
     27 #   define PARAMS(Args) ()
     28 #  endif
     29 # endif
     30 
     31 # ifndef __attribute__
     32 #  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
     33 #   define __attribute__(x)
     34 #  endif
     35 # endif
     36 
     37 # ifndef ATTRIBUTE_NORETURN
     38 #  define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
     39 # endif
     40 
     41 /* If this pointer is non-zero, run the specified function upon each
     42    allocation failure.  It is initialized to zero. */
     43 extern void (*xalloc_fail_func) PARAMS ((void));
     44 
     45 /* If XALLOC_FAIL_FUNC is undefined or a function that returns, this
     46    message is output.  It is translated via gettext.
     47    Its value is "memory exhausted".  */
     48 extern char const xalloc_msg_memory_exhausted[];
     49 
     50 /* This function is always triggered when memory is exhausted.  It is
     51    in charge of honoring the three previous items.  This is the
     52    function to call when one wants the program to die because of a
     53    memory allocation failure.  */
     54 extern void xalloc_die PARAMS ((void)) ATTRIBUTE_NORETURN;
     55 
     56 void *xmalloc PARAMS ((size_t n));
     57 void *xcalloc PARAMS ((size_t n, size_t s));
     58 void *xrealloc PARAMS ((void *p, size_t n));
     59 char *xstrdup PARAMS ((const char *str));
     60 
     61 # define XMALLOC(Type, N_items) ((Type *) xmalloc (sizeof (Type) * (N_items)))
     62 # define XCALLOC(Type, N_items) ((Type *) xcalloc (sizeof (Type), (N_items)))
     63 # define XREALLOC(Ptr, Type, N_items) \
     64   ((Type *) xrealloc ((void *) (Ptr), sizeof (Type) * (N_items)))
     65 
     66 /* Declare and alloc memory for VAR of type TYPE. */
     67 # define NEW(Type, Var)  Type *(Var) = XMALLOC (Type, 1)
     68 
     69 /* Free VAR only if non NULL. */
     70 # define XFREE(Var)	\
     71    do {                 \
     72       if (Var)          \
     73         free (Var);     \
     74    } while (0)
     75 
     76 /* Return a pointer to a malloc'ed copy of the array SRC of NUM elements. */
     77 # define CCLONE(Src, Num) \
     78   (memcpy (xmalloc (sizeof (*Src) * (Num)), (Src), sizeof (*Src) * (Num)))
     79 
     80 /* Return a malloc'ed copy of SRC. */
     81 # define CLONE(Src) CCLONE (Src, 1)
     82 
     83 
     84 #endif /* !XALLOC_H_ */
     85