xref: /illumos-gate/usr/src/lib/libdemangle/common/util.c (revision bde334a8dbd66dfa70ce4d7fc9dcad6e1ae45fe4)
1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2017 Jason King
14  */
15 
16 #include <sys/debug.h>
17 #include <stdlib.h>
18 #include <string.h>
19 #include "demangle-sys.h"
20 #include "demangle_int.h"
21 
22 void *
23 zalloc(sysdem_ops_t *ops, size_t len)
24 {
25 	void *p = ops->alloc(len);
26 
27 	if (p != NULL)
28 		(void) memset(p, 0, len);
29 
30 #ifdef DEBUG
31 	/*
32 	 * In normal operation, we should never exhaust memory.  Either
33 	 * something's wrong, or the system is so hosed that aborting
34 	 * shouldn't hurt anything, and it gives us a more useful stack
35 	 * trace.
36 	 */
37 	if (p == NULL)
38 		abort();
39 #endif
40 
41 	return (p);
42 }
43 
44 void
45 xfree(sysdem_ops_t *ops, void *p, size_t len)
46 {
47 	if (p == NULL || len == 0)
48 		return;
49 
50 	ops->free(p, len);
51 }
52 
53 void *
54 xrealloc(sysdem_ops_t *ops, void *p, size_t oldsz, size_t newsz)
55 {
56 	if (newsz == oldsz)
57 		return (p);
58 
59 	VERIFY3U(newsz, >, oldsz);
60 
61 	void *temp = zalloc(ops, newsz);
62 
63 	if (temp == NULL)
64 		return (NULL);
65 
66 	if (oldsz > 0) {
67 		(void) memcpy(temp, p, oldsz);
68 		xfree(ops, p, oldsz);
69 	}
70 
71 	return (temp);
72 }
73 
74 /*ARGSUSED*/
75 static void
76 def_free(void *p, size_t len)
77 {
78 	free(p);
79 }
80 
81 static sysdem_ops_t i_sysdem_ops_default = {
82 	.alloc = malloc,
83 	.free = def_free
84 };
85 sysdem_ops_t *sysdem_ops_default = &i_sysdem_ops_default;
86