summaryrefslogtreecommitdiffstats
path: root/gl/ialloc.h
diff options
context:
space:
mode:
Diffstat (limited to 'gl/ialloc.h')
-rw-r--r--gl/ialloc.h33
1 files changed, 22 insertions, 11 deletions
diff --git a/gl/ialloc.h b/gl/ialloc.h
index 1d43faf3..8bf5dd12 100644
--- a/gl/ialloc.h
+++ b/gl/ialloc.h
@@ -1,6 +1,6 @@
1/* ialloc.h -- malloc with idx_t rather than size_t 1/* ialloc.h -- malloc with idx_t rather than size_t
2 2
3 Copyright 2021-2023 Free Software Foundation, Inc. 3 Copyright 2021-2025 Free Software Foundation, Inc.
4 4
5 This file is free software: you can redistribute it and/or modify 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 6 it under the terms of the GNU Lesser General Public License as
@@ -18,15 +18,18 @@
18#ifndef IALLOC_H_ 18#ifndef IALLOC_H_
19#define IALLOC_H_ 19#define IALLOC_H_
20 20
21/* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE, _GL_ATTRIBUTE_COLD,
22 _GL_ATTRIBUTE_MALLOC. */
23#if !_GL_CONFIG_H_INCLUDED
24 #error "Please include config.h first."
25#endif
26
21#include "idx.h" 27#include "idx.h"
22 28
23#include <errno.h> 29#include <errno.h>
24#include <stdint.h> 30#include <stdint.h>
25#include <stdlib.h> 31#include <stdlib.h>
26 32
27#ifndef _GL_INLINE_HEADER_BEGIN
28 #error "Please include config.h first."
29#endif
30_GL_INLINE_HEADER_BEGIN 33_GL_INLINE_HEADER_BEGIN
31#ifndef IALLOC_INLINE 34#ifndef IALLOC_INLINE
32# define IALLOC_INLINE _GL_INLINE 35# define IALLOC_INLINE _GL_INLINE
@@ -43,6 +46,9 @@ _gl_alloc_nomem (void)
43 return NULL; 46 return NULL;
44} 47}
45 48
49/* imalloc (size) is like malloc (size).
50 It returns a non-NULL pointer to size bytes of memory.
51 Upon failure, it returns NULL with errno set. */
46IALLOC_INLINE 52IALLOC_INLINE
47_GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/ 53_GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/
48void * 54void *
@@ -51,16 +57,20 @@ imalloc (idx_t s)
51 return s <= SIZE_MAX ? malloc (s) : _gl_alloc_nomem (); 57 return s <= SIZE_MAX ? malloc (s) : _gl_alloc_nomem ();
52} 58}
53 59
60/* irealloc (ptr, size) is like realloc (ptr, size).
61 It returns a non-NULL pointer to size bytes of memory.
62 Upon failure, it returns NULL with errno set. */
54IALLOC_INLINE 63IALLOC_INLINE
55/*_GL_ATTRIBUTE_DEALLOC_FREE*/ 64/*_GL_ATTRIBUTE_DEALLOC_FREE*/
56void * 65void *
57irealloc (void *p, idx_t s) 66irealloc (void *p, idx_t s)
58{ 67{
59 /* Work around GNU realloc glitch by treating a zero size as if it 68 return s <= SIZE_MAX ? realloc (p, s) : _gl_alloc_nomem ();
60 were 1, so that returning NULL is equivalent to failing. */
61 return s <= SIZE_MAX ? realloc (p, s | !s) : _gl_alloc_nomem ();
62} 69}
63 70
71/* icalloc (num, size) is like calloc (num, size).
72 It returns a non-NULL pointer to num * size bytes of memory.
73 Upon failure, it returns NULL with errno set. */
64IALLOC_INLINE 74IALLOC_INLINE
65_GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/ 75_GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/
66void * 76void *
@@ -81,13 +91,12 @@ icalloc (idx_t n, idx_t s)
81 return calloc (n, s); 91 return calloc (n, s);
82} 92}
83 93
94/* ireallocarray (ptr, num, size) is like reallocarray (ptr, num, size).
95 It returns a non-NULL pointer to num * size bytes of memory.
96 Upon failure, it returns NULL with errno set. */
84IALLOC_INLINE void * 97IALLOC_INLINE void *
85ireallocarray (void *p, idx_t n, idx_t s) 98ireallocarray (void *p, idx_t n, idx_t s)
86{ 99{
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 100 return (n <= SIZE_MAX && s <= SIZE_MAX
92 ? reallocarray (p, n, s) 101 ? reallocarray (p, n, s)
93 : _gl_alloc_nomem ()); 102 : _gl_alloc_nomem ());
@@ -97,4 +106,6 @@ ireallocarray (void *p, idx_t n, idx_t s)
97} 106}
98#endif 107#endif
99 108
109_GL_INLINE_HEADER_END
110
100#endif 111#endif