Home | History | Annotate | Download | only in libexif
      1 #include <libexif/exif-mem.h>
      2 
      3 #include <stdlib.h>
      4 
      5 struct _ExifMem {
      6 	unsigned int ref_count;
      7 	ExifMemAllocFunc alloc_func;
      8 	ExifMemReallocFunc realloc_func;
      9 	ExifMemFreeFunc free_func;
     10 };
     11 
     12 /*! Default memory allocation function. */
     13 static void *
     14 exif_mem_alloc_func (ExifLong ds)
     15 {
     16 	return calloc ((size_t) ds, 1);
     17 }
     18 
     19 /*! Default memory reallocation function. */
     20 static void *
     21 exif_mem_realloc_func (void *d, ExifLong ds)
     22 {
     23 	return realloc (d, (size_t) ds);
     24 }
     25 
     26 /*! Default memory free function. */
     27 static void
     28 exif_mem_free_func (void *d)
     29 {
     30 	free (d);
     31 }
     32 
     33 ExifMem *
     34 exif_mem_new (ExifMemAllocFunc alloc_func, ExifMemReallocFunc realloc_func,
     35 	      ExifMemFreeFunc free_func)
     36 {
     37 	ExifMem *mem;
     38 
     39 	if (!alloc_func && !realloc_func)
     40 		return NULL;
     41 	mem = alloc_func ? alloc_func (sizeof (ExifMem)) :
     42 		           realloc_func (NULL, sizeof (ExifMem));
     43 	if (!mem) return NULL;
     44 	mem->ref_count = 1;
     45 
     46 	mem->alloc_func   = alloc_func;
     47 	mem->realloc_func = realloc_func;
     48 	mem->free_func    = free_func;
     49 
     50 	return mem;
     51 }
     52 
     53 void
     54 exif_mem_ref (ExifMem *mem)
     55 {
     56 	if (!mem) return;
     57 	mem->ref_count++;
     58 }
     59 
     60 void
     61 exif_mem_unref (ExifMem *mem)
     62 {
     63 	if (!mem) return;
     64 	if (!--mem->ref_count)
     65 		exif_mem_free (mem, mem);
     66 }
     67 
     68 void
     69 exif_mem_free (ExifMem *mem, void *d)
     70 {
     71 	if (!mem) return;
     72 	if (mem->free_func) {
     73 		mem->free_func (d);
     74 		return;
     75 	}
     76 }
     77 
     78 void *
     79 exif_mem_alloc (ExifMem *mem, ExifLong ds)
     80 {
     81 	if (!mem) return NULL;
     82 	if (mem->alloc_func || mem->realloc_func)
     83 		return mem->alloc_func ? mem->alloc_func (ds) :
     84 					 mem->realloc_func (NULL, ds);
     85 	return NULL;
     86 }
     87 
     88 void *
     89 exif_mem_realloc (ExifMem *mem, void *d, ExifLong ds)
     90 {
     91 	return (mem && mem->realloc_func) ? mem->realloc_func (d, ds) : NULL;
     92 }
     93 
     94 ExifMem *
     95 exif_mem_new_default (void)
     96 {
     97 	return exif_mem_new (exif_mem_alloc_func, exif_mem_realloc_func,
     98 			     exif_mem_free_func);
     99 }
    100