1 /*
2 * Basic C environment.
3 *
4 * Copyright (c) 2007-2009 Marko Kreen
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include <usual/base.h>
20 #include <usual/bits.h>
21
22 #if defined(HAVE_MALLOC_H) && defined(__darwin__)
23 #include <malloc.h>
24 #endif
25
26 /* define posix_memalign() only when possible to emulate */
27 #if !defined(HAVE_POSIX_MEMALIGN) \
28 && (defined(HAVE_MEMALIGN) || defined(HAVE_VALLOC))
29
posix_memalign(void ** ptr_p,size_t align,size_t len)30 int posix_memalign(void **ptr_p, size_t align, size_t len)
31 {
32 void *p;
33 int ret, old_errno = errno;
34
35 #ifdef HAVE_MEMALIGN
36 p = memalign(align, len);
37 #else /* !HAVE_MEMALIGN */
38 #ifdef HAVE_VALLOC
39 /* assuming less than pagesize alignment */
40 p = valloc(len);
41 #endif /* !VALLOC */
42 #endif /* !MEMALIGN */
43
44 *ptr_p = p;
45 if (p)
46 return 0;
47
48 /* on error restore old errno */
49 ret = errno;
50 errno = old_errno;
51 return ret;
52 }
53 #endif
54
55 #ifndef HAVE_REALLOCARRAY
56
reallocarray(void * p,size_t count,size_t size)57 void *reallocarray(void *p, size_t count, size_t size)
58 {
59 size_t total;
60 if (!safe_mul_size(&total, count, size)) {
61 errno = ENOMEM;
62 return NULL;
63 }
64 return realloc(p, total);
65 }
66
67 #endif
68