xref: /src/lib/libc/stdlib/memalignment.c (revision 6c57e368eb1777f6097158eeca2fcc175d068dba) !
16c57e368SRobert Clausecker /*
26c57e368SRobert Clausecker  * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
36c57e368SRobert Clausecker  *
46c57e368SRobert Clausecker  * SPDX-License-Identifier: BSD-2-Clause
56c57e368SRobert Clausecker  */
66c57e368SRobert Clausecker 
76c57e368SRobert Clausecker #include <stdint.h>
86c57e368SRobert Clausecker #include <stdlib.h>
96c57e368SRobert Clausecker 
106c57e368SRobert Clausecker size_t
memalignment(const void * p)116c57e368SRobert Clausecker memalignment(const void *p)
126c57e368SRobert Clausecker {
136c57e368SRobert Clausecker 	uintptr_t align;
146c57e368SRobert Clausecker 
156c57e368SRobert Clausecker 	if (p == NULL)
166c57e368SRobert Clausecker 		return (0);
176c57e368SRobert Clausecker 
186c57e368SRobert Clausecker 	align = (uintptr_t)p;
196c57e368SRobert Clausecker 	align &= -align;
206c57e368SRobert Clausecker 
216c57e368SRobert Clausecker #if UINTPTR_MAX > SIZE_MAX
226c57e368SRobert Clausecker 	/* if alignment overflows size_t, return maximum possible */
236c57e368SRobert Clausecker 	if (align > SIZE_MAX)
246c57e368SRobert Clausecker 		align = SIZE_MAX - SIZE_MAX/2;
256c57e368SRobert Clausecker #endif
266c57e368SRobert Clausecker 
276c57e368SRobert Clausecker 	return (align);
286c57e368SRobert Clausecker }
29