1 | /***************************************
2 | $Revision: 1.9 $
3 |
4 | Utilities (ut). memwrap.c - memory allocation wrappers.
5 | Facilitate easy changing a memory allocation
6 | library and provide uniform error codes.
7 |
8 | Status: NOT REVUED, TESTED,
9 |
10 | Design and implementation by: Marek Bukowy
11 |
12 | ******************/ /******************
13 | Copyright (c) 1999 RIPE NCC
14 |
15 | All Rights Reserved
16 |
17 | Permission to use, copy, modify, and distribute this software and its
18 | documentation for any purpose and without fee is hereby granted,
19 | provided that the above copyright notice appear in all copies and that
20 | both that copyright notice and this permission notice appear in
21 | supporting documentation, and that the name of the author not be
22 | used in advertising or publicity pertaining to distribution of the
23 | software without specific, written prior permission.
24 |
25 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
26 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
27 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
28 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
29 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
30 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
31 | ***************************************/
32 |
33 | #include <stdlib.h>
34 | #include <erroutines.h>
35 | #include <stubs.h>
36 | #include <glib.h>
37 |
38 |
39 | #define USE_LOGGING
40 | /* */
41 |
42 | /* global variable!! */
43 | int wr_logging = 0;
44 |
45 | void wr_log_set(int value) {
46 | wr_logging = (value != 0);
47 | }
48 |
49 | static void
50 | wr_alloc_log(void *ptr, int len, char* comment, int line)
51 | {
52 | if(wr_logging) {
53 | fprintf(stderr,"allocated %7d bytes at address %p in %s/%d\n",
54 | len, ptr, comment, line);
55 | }
56 | }
57 |
58 | static void
59 | wr_free_log(void *ptr, char* comment, int line)
60 | {
61 | if(wr_logging) {
62 | fprintf(stderr,"freed some memory space at address %p in %s/%d\n",
63 | ptr, comment, line);
64 | }
65 | }
66 |
67 | static void
68 | wr_free_list_log(void *ptr, char* comment, int line)
69 | {
70 | if(wr_logging) {
71 | fprintf(stderr,"freeing list + elements at address %p in %s/%d\n",
72 | ptr, comment, line);
73 | }
74 | }
75 |
76 | er_ret_t
77 | wr_real_malloc(void **ptr, size_t size, char* comment, int line)
78 | {
79 | if( (*ptr = malloc(size)) == NULL ) {
80 | /* die; */ /* this should return an appropriate error number */
81 | return UT_OUTMEM;
82 | }
83 | else {
84 | #ifdef USE_LOGGING
85 | wr_alloc_log(*ptr, size, comment, line);
86 | #endif
87 | return UT_OK;
88 | }
89 | }
90 |
91 | er_ret_t
92 | wr_real_calloc(void **ptr, size_t num, size_t size, char* comment, int line)
93 | {
94 | void *newalloc;
95 |
96 | newalloc = calloc(num, size);
97 |
98 | if( newalloc == NULL ) {
99 | /*die; */ /* this should return an appropriate error number */
100 | return UT_OUTMEM;
101 | }
102 | else {
103 | *ptr=newalloc;
104 | #ifdef USE_LOGGING
105 | wr_alloc_log(*ptr, size*num, comment, line);
106 | #endif
107 | return UT_OK;
108 | }
109 | }
110 |
111 |
112 | er_ret_t
113 | wr_real_realloc(void **ptr, size_t size, char* comment, int line)
114 | {
115 | if( (*ptr = realloc(*ptr, size)) == NULL ) {
116 | /* die; */ /* this should return an appropriate error number */
117 | return UT_OUTMEM;
118 | }
119 | else {
120 | #ifdef USE_LOGGING
121 | wr_free_log(*ptr, comment, line);
122 | wr_alloc_log(*ptr, size, comment, line);
123 | #endif
124 | return UT_OK;
125 | }
126 | }
127 |
128 | er_ret_t
129 | wr_real_free(void *ptr, char* comment, int line)
130 | {
131 | if( ptr == NULL ) {
132 | die;
133 | }
134 | #ifdef USE_LOGGING
135 | wr_free_log(ptr, comment, line);
136 | #endif
137 | free(ptr);
138 | /* if we're tired of those dies, we can set the pointer to NULL after free */
139 | return UT_OK;
140 | }
141 |
142 |
143 | /* make a copy and return the pointer to the allocated area */
144 | char *
145 | wr_string(const char *text)
146 | {
147 | char *area;
148 | int len = strlen(text);
149 |
150 | wr_real_malloc( (void **) &area, len+1, "wr_string", len );
151 |
152 | strcpy( area, text );
153 |
154 | return area;
155 | }
156 |
157 | /* for GList's foreach */
158 | static
159 | void
160 | wr_free_list_element(void *cpy, void *trash)
161 | {
162 | wr_real_free(cpy, "wr_free_list_element", 0 );
163 | }
164 |
165 | /* for GList's foreach */
166 | void
167 | wr_real_clear_list(GList **list, char* comment, int line)
168 | {
169 | /* allow NULL argument */
170 | if( *list != NULL ) {
171 |
172 | #ifdef USE_LOGGING
173 | wr_free_list_log(*list, comment, line);
174 | #endif
175 | g_list_foreach(*list, wr_free_list_element, NULL);
176 | g_list_free(*list);
177 | *list = NULL;
178 | }
179 | }