aboutsummaryrefslogtreecommitdiffstats
path: root/libsimple/memalignz.h
blob: 4b47d0e92c9776ae99413c8490dc42dd478c8e44 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/* See LICENSE file for copyright and license details. */

/*
 * Alignment must be a power of 2.
 */

_LIBSIMPLE_GCC_ONLY(__attribute__((__malloc__, __alloc_align__(2), __warn_unused_result__)))
static inline void *
libsimple_vmemalignzn(int __clear, size_t __alignment, size_t __n, va_list __ap) /* TODO test ([v]memalign[z]n) */
{
	if (!__alignment || (__alignment & (__alignment - 1UL))) {
		errno = EINVAL;
		return NULL;
	}
	return libsimple_memalloc(0, LIBSIMPLE_MEMALLOC_1_VA_PRODUCT_SIZE, __n, __ap,
	                          LIBSIMPLE_MEMALLOC_CONDITIONAL_ZERO_INIT, __clear,
	                          LIBSIMPLE_MEMALLOC_ALIGNMENT, __alignment,
	                          LIBSIMPLE_MEMALLOC_END);
}
#ifndef vmemalignzn
# define vmemalignzn libsimple_vmemalignzn
#endif

_LIBSIMPLE_GCC_ONLY(__attribute__((__malloc__, __alloc_align__(2), __alloc_size__(3), __warn_unused_result__)))
static inline void *
libsimple_memalignz(int __clear, size_t __alignment, size_t __n) /* TODO test (memalign[z]) */
{
	if (!__alignment || (__alignment & (__alignment - 1UL))) {
		errno = EINVAL;
		return NULL;
	}
	return libsimple_memalloc(__n,
	                          LIBSIMPLE_MEMALLOC_CONDITIONAL_ZERO_INIT, __clear,
	                          LIBSIMPLE_MEMALLOC_ALIGNMENT, __alignment,
	                          LIBSIMPLE_MEMALLOC_END);
}
#ifndef memalignz
# define memalignz libsimple_memalignz
#endif

_LIBSIMPLE_GCC_ONLY(__attribute__((__malloc__, __alloc_align__(2), __warn_unused_result__)))
static inline void *
libsimple_memalignzn(int __clear, size_t __alignment, size_t __n, ... /*, (size_t)0 */)
{
	va_list __ap;
	va_start(__ap, __n);
	return libsimple_vmemalignzn(__clear, __alignment, __n, __ap);
	va_end(__ap);
}
#ifndef memalignzn
# define memalignzn libsimple_memalignzn
#endif

_LIBSIMPLE_GCC_ONLY(__attribute__((__malloc__, __alloc_align__(3), __alloc_size__(4), __warn_unused_result__, __returns_nonnull__)))
static inline void *
libsimple_enmemalignz(int __status, int __clear, size_t __alignment, size_t __n) /* TODO test (e[n]memalign[z]) */
{
	if (!__alignment || (__alignment & (__alignment - 1UL))) {
		errno = EINVAL;
		return NULL;
	}
	return libsimple_enmemalloc(__status, __n,
	                            LIBSIMPLE_MEMALLOC_CONDITIONAL_ZERO_INIT, __clear,
	                            LIBSIMPLE_MEMALLOC_ALIGNMENT, __alignment,
	                            LIBSIMPLE_MEMALLOC_END);
}
#ifndef enmemalignz
# define enmemalignz libsimple_enmemalignz
#endif

_LIBSIMPLE_GCC_ONLY(__attribute__((__malloc__, __alloc_align__(3), __warn_unused_result__, __returns_nonnull__)))
static inline void *
libsimple_envmemalignzn(int __status, int __clear, size_t __alignment, size_t __n, va_list __ap) /* TODO test (e[n][v]memalign[z]n) */
{
	if (!__alignment || (__alignment & (__alignment - 1UL))) {
		errno = EINVAL;
		return NULL;
	}
	return libsimple_enmemalloc(__status,
	                            0, LIBSIMPLE_MEMALLOC_1_VA_PRODUCT_SIZE, __n, __ap,
	                            LIBSIMPLE_MEMALLOC_CONDITIONAL_ZERO_INIT, __clear,
	                            LIBSIMPLE_MEMALLOC_ALIGNMENT, __alignment,
	                            LIBSIMPLE_MEMALLOC_END);
}
#ifndef envmemalignzn
# define envmemalignzn libsimple_envmemalignzn
#endif

_LIBSIMPLE_GCC_ONLY(__attribute__((__malloc__, __alloc_align__(3), __warn_unused_result__, __returns_nonnull__)))
static inline void *
libsimple_enmemalignzn(int __status, int __clear, size_t __alignment, size_t __n, ... /*, (size_t)0 */)
{
	va_list __ap;
	va_start(__ap, __n);
	return libsimple_envmemalignzn(__status, __clear, __alignment, __n, __ap);
	va_end(__ap);
}
#ifndef enmemalignzn
# define enmemalignzn libsimple_enmemalignzn
#endif

_LIBSIMPLE_GCC_ONLY(__attribute__((__malloc__, __alloc_align__(2), __alloc_size__(3), __warn_unused_result__, __returns_nonnull__)))
static inline void *libsimple_ememalignz(int __clear, size_t __alignment, size_t __n)
{ return libsimple_enmemalignz(libsimple_default_failure_exit, __alignment, __clear, __n); }
#ifndef ememalignz
# define ememalignz libsimple_ememalignz
#endif

_LIBSIMPLE_GCC_ONLY(__attribute__((__malloc__, __alloc_align__(2), __warn_unused_result__, __returns_nonnull__)))
static inline void *libsimple_evmemalignzn(int __clear, size_t __alignment, size_t __n, va_list __ap)
{ return libsimple_envmemalignzn(libsimple_default_failure_exit, __alignment, __clear, __n, __ap); }
#ifndef evmemalignzn
# define evmemalignzn libsimple_evmemalignzn
#endif

_LIBSIMPLE_GCC_ONLY(__attribute__((__malloc__, __alloc_align__(2), __warn_unused_result__, __returns_nonnull__)))
static inline void *
libsimple_ememalignzn(int __clear, size_t __alignment, size_t __n, ... /*, (size_t)0 */)
{
	va_list __ap;
	va_start(__ap, __n);
	return libsimple_evmemalignzn(__clear, __alignment, __n, __ap);
	va_end(__ap);
}
#ifndef ememalignzn
# define ememalignzn libsimple_ememalignzn
#endif