root/maint/gnulib/lib/eealloc.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. eemalloc
  2. eerealloc

   1 /* Memory allocation with expensive empty allocations.
   2    Copyright (C) 2003, 2008, 2010-2021 Free Software Foundation, Inc.
   3    Written by Bruno Haible <bruno@clisp.org>, 2003,
   4    based on prior work by Jim Meyering.
   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 3 of the License, or
   9    (at your option) 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, see <https://www.gnu.org/licenses/>.  */
  18 
  19 #ifndef _EEALLOC_H
  20 #define _EEALLOC_H
  21 
  22 /* malloc() and realloc() are allowed to return NULL when asked to allocate
  23    a memory block of 0 bytes; this is not an out-of-memory condition.
  24    (See ISO C 99 section 7.20.3.)  In some places, this is not welcome,
  25    because it requires extra checking (so as not to confuse a zero-sized
  26    allocation with an out-of-memory condition).  This file provides
  27    malloc()/realloc() workalikes which return non-NULL pointers for
  28    succeeding zero-sized allocations.  GNU libc already defines malloc()
  29    and realloc() this way; on such platforms the workalikes are aliased
  30    to the original malloc()/realloc() functions.  */
  31 
  32 #include <stdlib.h>
  33 
  34 #ifndef _GL_INLINE_HEADER_BEGIN
  35  #error "Please include config.h first."
  36 #endif
  37 _GL_INLINE_HEADER_BEGIN
  38 #ifndef EEALLOC_INLINE
  39 # define EEALLOC_INLINE _GL_INLINE
  40 #endif
  41 
  42 #if MALLOC_0_IS_NONNULL
  43 # define eemalloc malloc
  44 #else
  45 EEALLOC_INLINE void *eemalloc (size_t n)
     /* [previous][next][first][last][top][bottom][index][help] */
  46      _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1))
  47      _GL_ATTRIBUTE_DEALLOC_FREE;
  48 EEALLOC_INLINE void *
  49 eemalloc (size_t n)
  50 {
  51   /* If n is zero, allocate a 1-byte block.  */
  52   if (n == 0)
  53     n = 1;
  54   return malloc (n);
  55 }
  56 #endif
  57 
  58 #if REALLOC_0_IS_NONNULL
  59 # define eerealloc realloc
  60 #else
  61 EEALLOC_INLINE void *eerealloc (void *p, size_t n)
     /* [previous][next][first][last][top][bottom][index][help] */
  62      _GL_ATTRIBUTE_ALLOC_SIZE ((2));
  63 EEALLOC_INLINE void *
  64 eerealloc (void *p, size_t n)
  65 {
  66   /* If n is zero, allocate or keep a 1-byte block.  */
  67   if (n == 0)
  68     n = 1;
  69   return realloc (p, n);
  70 }
  71 #endif
  72 
  73 /* Maybe we should also define variants
  74     eenmalloc (size_t n, size_t s) - behaves like eemalloc (n * s)
  75     eezalloc (size_t n) - like eemalloc followed by memset 0
  76     eecalloc (size_t n, size_t s) - like eemalloc (n * s) followed by memset 0
  77     eenrealloc (void *p, size_t n, size_t s) - like eerealloc (p, n * s)
  78    If this would be useful in your application. please speak up.  */
  79 
  80 _GL_INLINE_HEADER_END
  81 
  82 #endif /* _EEALLOC_H */

/* [previous][next][first][last][top][bottom][index][help] */