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  | }