/* ialloc.h -- malloc with idx_t rather than size_t

   Copyright 2021-2026 Free Software Foundation, Inc.

   This file is free software: you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as
   published by the Free Software Foundation; either version 2.1 of the
   License, or (at your option) any later version.

   This file is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public License
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */

#ifndef IALLOC_H_
#define IALLOC_H_

/* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE, _GL_ATTRIBUTE_COLD,
   _GL_ATTRIBUTE_MALLOC.  */
#if !_GL_CONFIG_H_INCLUDED
 #error "Please include config.h first."
#endif

#include "idx.h"

#include <errno.h>
#include <stdint.h>
#include <stdlib.h>

_GL_INLINE_HEADER_BEGIN
#ifndef IALLOC_INLINE
# define IALLOC_INLINE _GL_INLINE
#endif

#ifdef __cplusplus
extern "C" {
#endif

IALLOC_INLINE void * _GL_ATTRIBUTE_COLD
_gl_alloc_nomem (void)
{
  errno = ENOMEM;
  return NULL;
}

/* imalloc (size) is like malloc (size).
   It returns a non-NULL pointer to size bytes of memory.
   Upon failure, it returns NULL with errno set.  */
IALLOC_INLINE
_GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/
void *
imalloc (idx_t s)
{
  return s <= SIZE_MAX ? malloc (s) : _gl_alloc_nomem ();
}

/* irealloc (ptr, size) is like realloc (ptr, size).
   It returns a non-NULL pointer to size bytes of memory.
   Upon failure, it returns NULL with errno set.  */
IALLOC_INLINE
/*_GL_ATTRIBUTE_DEALLOC_FREE*/
void *
irealloc (void *p, idx_t s)
{
  return s <= SIZE_MAX ? realloc (p, s) : _gl_alloc_nomem ();
}

/* icalloc (num, size) is like calloc (num, size).
   It returns a non-NULL pointer to num * size bytes of memory.
   Upon failure, it returns NULL with errno set.  */
IALLOC_INLINE
_GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/
void *
icalloc (idx_t n, idx_t s)
{
  if (SIZE_MAX < n)
    {
      if (s != 0)
        return _gl_alloc_nomem ();
      n = 0;
    }
  if (SIZE_MAX < s)
    {
      if (n != 0)
        return _gl_alloc_nomem ();
      s = 0;
    }
  return calloc (n, s);
}

/* ireallocarray (ptr, num, size) is like reallocarray (ptr, num, size).
   It returns a non-NULL pointer to num * size bytes of memory.
   Upon failure, it returns NULL with errno set.  */
IALLOC_INLINE void *
ireallocarray (void *p, idx_t n, idx_t s)
{
  return (n <= SIZE_MAX && s <= SIZE_MAX
          ? reallocarray (p, n, s)
          : _gl_alloc_nomem ());
}

#ifdef __cplusplus
}
#endif

_GL_INLINE_HEADER_END

#endif
