1 | /***************************************
2 | $Revision: 1.7 $
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 | static void
43 | wr_alloc_log(void *ptr, int len, char* comment, int line)
44 | {
45 | fprintf(stderr,"allocated %7d bytes at address %p in %s/%d\n",
46 | len, ptr, comment, line);
47 | }
48 |
49 | static void
50 | wr_free_log(void *ptr, char* comment, int line)
51 | {
52 | fprintf(stderr,"freed some memory space at address %p in %s/%d\n",
53 | ptr, comment, line);
54 | }
55 |
56 | static void
57 | wr_free_list_log(void *ptr, char* comment, int line)
58 | {
59 | fprintf(stderr,"freeing list + elements at address %p in %s/%d\n",
60 | ptr, comment, line);
61 | }
62 |
63 | er_ret_t
64 | wr_real_malloc(void **ptr, size_t size, char* comment, int line)
65 | {
66 | if( (*ptr = malloc(size)) == NULL ) {
67 | /* die; */ /* this should return an appropriate error number */
68 | return UT_OUTMEM;
69 | }
70 | else {
71 | #ifdef USE_LOGGING
72 | wr_alloc_log(*ptr, size, comment, line);
73 | #endif
74 | return UT_OK;
75 | }
76 | }
77 |
78 | er_ret_t
79 | wr_real_calloc(void **ptr, size_t num, size_t size, char* comment, int line)
80 | {
81 | void *newalloc;
82 |
83 | newalloc = calloc(num, size);
84 |
85 | if( newalloc == NULL ) {
86 | /*die; */ /* this should return an appropriate error number */
87 | return UT_OUTMEM;
88 | }
89 | else {
90 | *ptr=newalloc;
91 | #ifdef USE_LOGGING
92 | wr_alloc_log(*ptr, size*num, comment, line);
93 | #endif
94 | return UT_OK;
95 | }
96 | }
97 |
98 |
99 | er_ret_t
100 | wr_real_realloc(void **ptr, void *oldptr, size_t size, char* comment, int line)
101 | {
102 | if( (*ptr = realloc(oldptr, size)) == NULL ) {
103 | /* die; */ /* this should return an appropriate error number */
104 | return UT_OUTMEM;
105 | }
106 | else {
107 | #ifdef USE_LOGGING
108 | wr_free_log(oldptr, comment, line);
109 | wr_alloc_log(*ptr, size, comment, line);
110 | #endif
111 | return UT_OK;
112 | }
113 | }
114 |
115 | er_ret_t
116 | wr_real_free(void *ptr, char* comment, int line)
117 | {
118 | if( ptr == NULL ) {
119 | die;
120 | }
121 | #ifdef USE_LOGGING
122 | wr_free_log(ptr, comment, line);
123 | #endif
124 | free(ptr);
125 | /* if we're tired of those dies, we can set the pointer to NULL after free */
126 | return UT_OK;
127 | }
128 |
129 |
130 | /* make a copy and return the pointer to the allocated area */
131 | char *
132 | wr_string(char *text)
133 | {
134 | char *area;
135 | int len = strlen(text);
136 |
137 | wr_real_malloc( (void **) &area, len+1, "wr_string", len );
138 |
139 | strcpy( area, text );
140 |
141 | return area;
142 | }
143 |
144 | /* for GList's foreach */
145 | static
146 | void
147 | wr_free_list_element(void *cpy, void *trash)
148 | {
149 | wr_real_free(cpy, "wr_free_list_element", 0 );
150 | }
151 |
152 | /* for GList's foreach */
153 | void
154 | wr_real_clear_list(GList **list, char* comment, int line)
155 | {
156 | /* allow NULL argument */
157 | if( *list != NULL ) {
158 |
159 | #ifdef USE_LOGGING
160 | wr_free_list_log(*list, comment, line);
161 | #endif
162 | g_list_foreach(*list, wr_free_list_element, NULL);
163 | g_list_free(*list);
164 | *list = NULL;
165 | }
166 | }