root/maint/gnulib/lib/ialloc.h

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

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. _gl_alloc_nomem
  2. imalloc
  3. irealloc
  4. icalloc
  5. ireallocarray

   1 /* ialloc.h -- malloc with idx_t rather than size_t
   2 
   3    Copyright 2021 Free Software Foundation, Inc.
   4 
   5    This file is free software: you can redistribute it and/or modify
   6    it under the terms of the GNU Lesser General Public License as
   7    published by the Free Software Foundation; either version 2.1 of the
   8    License, or (at your option) any later version.
   9 
  10    This file is distributed in the hope that it will be useful,
  11    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13    GNU Lesser General Public License for more details.
  14 
  15    You should have received a copy of the GNU Lesser General Public License
  16    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  17 
  18 #ifndef IALLOC_H_
  19 #define IALLOC_H_
  20 
  21 #include "idx.h"
  22 
  23 #include <errno.h>
  24 #include <stdint.h>
  25 #include <stdlib.h>
  26 
  27 #ifndef _GL_INLINE_HEADER_BEGIN
  28  #error "Please include config.h first."
  29 #endif
  30 _GL_INLINE_HEADER_BEGIN
  31 #ifndef IALLOC_INLINE
  32 # define IALLOC_INLINE _GL_INLINE
  33 #endif
  34 
  35 #ifdef __cplusplus
  36 extern "C" {
  37 #endif
  38 
  39 IALLOC_INLINE void * _GL_ATTRIBUTE_COLD
  40 _gl_alloc_nomem (void)
     /* [previous][next][first][last][top][bottom][index][help] */
  41 {
  42   errno = ENOMEM;
  43   return NULL;
  44 }
  45 
  46 IALLOC_INLINE
  47 _GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/
  48 void *
  49 imalloc (idx_t s)
     /* [previous][next][first][last][top][bottom][index][help] */
  50 {
  51   return s <= SIZE_MAX ? malloc (s) : _gl_alloc_nomem ();
  52 }
  53 
  54 IALLOC_INLINE
  55 /*_GL_ATTRIBUTE_DEALLOC_FREE*/
  56 void *
  57 irealloc (void *p, idx_t s)
     /* [previous][next][first][last][top][bottom][index][help] */
  58 {
  59   /* Work around GNU realloc glitch by treating a zero size as if it
  60      were 1, so that returning NULL is equivalent to failing.  */
  61   return s <= SIZE_MAX ? realloc (p, s | !s) : _gl_alloc_nomem ();
  62 }
  63 
  64 IALLOC_INLINE
  65 _GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/
  66 void *
  67 icalloc (idx_t n, idx_t s)
     /* [previous][next][first][last][top][bottom][index][help] */
  68 {
  69   if (SIZE_MAX < n)
  70     {
  71       if (s != 0)
  72         return _gl_alloc_nomem ();
  73       n = 0;
  74     }
  75   if (SIZE_MAX < s)
  76     {
  77       if (n != 0)
  78         return _gl_alloc_nomem ();
  79       s = 0;
  80     }
  81   return calloc (n, s);
  82 }
  83 
  84 IALLOC_INLINE void *
  85 ireallocarray (void *p, idx_t n, idx_t s)
     /* [previous][next][first][last][top][bottom][index][help] */
  86 {
  87   /* Work around GNU reallocarray glitch by treating a zero size as if
  88      it were 1, so that returning NULL is equivalent to failing.  */
  89   if (n == 0 || s == 0)
  90     n = s = 1;
  91   return (n <= SIZE_MAX && s <= SIZE_MAX
  92           ? reallocarray (p, n, s)
  93           : _gl_alloc_nomem ());
  94 }
  95 
  96 #ifdef __cplusplus
  97 }
  98 #endif
  99 
 100 #endif

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