Annotation of embedaddon/libiconv/gnulib-local/lib/xmalloc.c, revision 1.1.1.2

1.1       misho       1: /* xmalloc.c -- malloc with out of memory checking
                      2:    Copyright (C) 1990-1996, 2000-2003, 2005-2007 Free Software Foundation, Inc.
                      3: 
                      4:    This program is free software: you can redistribute it and/or modify
                      5:    it under the terms of the GNU General Public License as published by
                      6:    the Free Software Foundation; either version 3 of the License, or
                      7:    (at your option) any later version.
                      8: 
                      9:    This program is distributed in the hope that it will be useful,
                     10:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     11:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     12:    GNU General Public License for more details.
                     13: 
                     14:    You should have received a copy of the GNU General Public License
1.1.1.2 ! misho      15:    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
1.1       misho      16: 
                     17: #include <config.h>
                     18: 
                     19: /* Specification.  */
                     20: #include "xalloc.h"
                     21: 
                     22: #include <stdlib.h>
                     23: 
                     24: #include "error.h"
                     25: #include "gettext.h"
                     26: 
                     27: #define _(str) gettext (str)
                     28: 
                     29: 
                     30: /* Exit value when the requested amount of memory is not available.
                     31:    The caller may set it to some other value.  */
                     32: int xmalloc_exit_failure = EXIT_FAILURE;
                     33: 
                     34: void
                     35: xalloc_die ()
                     36: {
                     37:   error (xmalloc_exit_failure, 0, _("memory exhausted"));
1.1.1.2 ! misho      38:   /* _Noreturn cannot be given to error, since it may return if
1.1       misho      39:      its first argument is 0.  To help compilers understand the
                     40:      xalloc_die does terminate, call exit. */
                     41:   exit (EXIT_FAILURE);
                     42: }
                     43: 
                     44: static void *
                     45: fixup_null_alloc (size_t n)
                     46: {
                     47:   void *p;
                     48: 
                     49:   p = NULL;
                     50:   if (n == 0)
                     51:     p = malloc ((size_t) 1);
                     52:   if (p == NULL)
                     53:     xalloc_die ();
                     54:   return p;
                     55: }
                     56: 
                     57: /* Allocate N bytes of memory dynamically, with error checking.  */
                     58: 
                     59: void *
                     60: xmalloc (size_t n)
                     61: {
                     62:   void *p;
                     63: 
                     64:   p = malloc (n);
                     65:   if (p == NULL)
                     66:     p = fixup_null_alloc (n);
                     67:   return p;
                     68: }
                     69: 
                     70: /* Allocate memory for NMEMB elements of SIZE bytes, with error checking.
                     71:    SIZE must be > 0.  */
                     72: 
                     73: void *
                     74: xnmalloc (size_t nmemb, size_t size)
                     75: {
                     76:   size_t n;
                     77:   void *p;
                     78: 
                     79:   if (xalloc_oversized (nmemb, size))
                     80:     xalloc_die ();
                     81:   n = nmemb * size;
                     82:   p = malloc (n);
                     83:   if (p == NULL)
                     84:     p = fixup_null_alloc (n);
                     85:   return p;
                     86: }
                     87: 
                     88: /* Allocate SIZE bytes of memory dynamically, with error checking,
                     89:    and zero it.  */
                     90: 
                     91: void *
                     92: xzalloc (size_t size)
                     93: {
                     94:   void *p;
                     95: 
                     96:   p = xmalloc (size);
                     97:   memset (p, 0, size);
                     98:   return p;
                     99: }
                    100: 
                    101: /* Allocate memory for N elements of S bytes, with error checking,
                    102:    and zero it.  */
                    103: 
                    104: void *
                    105: xcalloc (size_t n, size_t s)
                    106: {
                    107:   void *p;
                    108: 
                    109:   p = calloc (n, s);
                    110:   if (p == NULL)
                    111:     p = fixup_null_alloc (n);
                    112:   return p;
                    113: }
                    114: 
                    115: /* Change the size of an allocated block of memory P to N bytes,
                    116:    with error checking.
                    117:    If P is NULL, run xmalloc.  */
                    118: 
                    119: void *
                    120: xrealloc (void *p, size_t n)
                    121: {
                    122:   if (p == NULL)
                    123:     return xmalloc (n);
                    124:   p = realloc (p, n);
                    125:   if (p == NULL)
                    126:     p = fixup_null_alloc (n);
                    127:   return p;
                    128: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>