summaryrefslogtreecommitdiff
path: root/lib/libc/stdlib/memalignment.c
blob: 771ddc2f525310abd8fadc8709afb9ec91e30f92 (plain)
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
/*
 * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

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

size_t
memalignment(const void *p)
{
	uintptr_t align;

	if (p == NULL)
		return (0);

	align = (uintptr_t)p;
	align &= -align;

#if UINTPTR_MAX > SIZE_MAX
	/* if alignment overflows size_t, return maximum possible */
	if (align > SIZE_MAX)
		align = SIZE_MAX - SIZE_MAX/2;
#endif

	return (align);
}