## modules/ut/memwrap.c

/* [<][>][^][v][top][bottom][index][help] */

## FUNCTIONS

This source file includes following functions.

1. wr_log_set
2. wr_alloc_log
3. wr_free_log
4. wr_free_list_log
5. wr_real_malloc
6. wr_real_calloc
7. wr_real_realloc
8. wr_real_free
9. wr_string
10. wr_free_list_element
11. wr_real_clear_list

       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) {
         /* [<][>][^][v][top][bottom][index][help] */
      46   wr_logging = (value != 0);
      47 }
      48
      49 static void
      50 wr_alloc_log(void *ptr, int len, char* comment, int line)
         /* [<][>][^][v][top][bottom][index][help] */
      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)
         /* [<][>][^][v][top][bottom][index][help] */
      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)
         /* [<][>][^][v][top][bottom][index][help] */
      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)
         /* [<][>][^][v][top][bottom][index][help] */
      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)
         /* [<][>][^][v][top][bottom][index][help] */
      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)
         /* [<][>][^][v][top][bottom][index][help] */
     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)
         /* [<][>][^][v][top][bottom][index][help] */
     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)
         /* [<][>][^][v][top][bottom][index][help] */
     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)
         /* [<][>][^][v][top][bottom][index][help] */
     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)
         /* [<][>][^][v][top][bottom][index][help] */
     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 }

/* [<][>][^][v][top][bottom][index][help] */