exif-mem.c

Go to the documentation of this file.
00001 #include <libexif/exif-mem.h>
00002 
00003 #include <stdlib.h>
00004 
00005 struct _ExifMem {
00006         unsigned int ref_count;
00007         ExifMemAllocFunc alloc_func;
00008         ExifMemReallocFunc realloc_func;
00009         ExifMemFreeFunc free_func;
00010 };
00011 
00012 static void *
00013 exif_mem_alloc_func (ExifLong ds)
00014 {
00015         return calloc ((size_t) ds, 1);
00016 }
00017 
00018 static void *
00019 exif_mem_realloc_func (void *d, ExifLong ds)
00020 {
00021         return realloc (d, (size_t) ds);
00022 }
00023 
00024 static void
00025 exif_mem_free_func (void *d)
00026 {
00027         free (d);
00028 }
00029 
00030 ExifMem *
00031 exif_mem_new (ExifMemAllocFunc alloc_func, ExifMemReallocFunc realloc_func,
00032               ExifMemFreeFunc free_func)
00033 {
00034         ExifMem *mem;
00035 
00036         if (!alloc_func || !realloc_func) return NULL;
00037         mem = alloc_func ? alloc_func (sizeof (ExifMem)) :
00038                            realloc_func (NULL, sizeof (ExifMem));
00039         if (!mem) return NULL;
00040         mem->ref_count = 1;
00041 
00042         mem->alloc_func   = alloc_func;
00043         mem->realloc_func = realloc_func;
00044         mem->free_func    = free_func;
00045 
00046         return mem;
00047 }
00048 
00049 void
00050 exif_mem_ref (ExifMem *mem)
00051 {
00052         if (!mem) return;
00053         mem->ref_count++;
00054 }
00055 
00056 void
00057 exif_mem_unref (ExifMem *mem)
00058 {
00059         if (!mem) return;
00060         if (!--mem->ref_count)
00061                 exif_mem_free (mem, mem);
00062 }
00063 
00064 void
00065 exif_mem_free (ExifMem *mem, void *d)
00066 {
00067         if (!mem) return;
00068         if (mem->free_func) {
00069                 mem->free_func (d);
00070                 return;
00071         }
00072 }
00073 
00074 void *
00075 exif_mem_alloc (ExifMem *mem, ExifLong ds)
00076 {
00077         if (!mem) return NULL;
00078         if (mem->alloc_func || mem->realloc_func)
00079                 return mem->alloc_func ? mem->alloc_func (ds) :
00080                                          mem->realloc_func (NULL, ds);
00081         return NULL;
00082 }
00083 
00084 void *
00085 exif_mem_realloc (ExifMem *mem, void *d, ExifLong ds)
00086 {
00087         return (mem && mem->realloc_func) ? mem->realloc_func (d, ds) : NULL;
00088 }
00089 
00090 ExifMem *
00091 exif_mem_new_default (void)
00092 {
00093         return exif_mem_new (exif_mem_alloc_func, exif_mem_realloc_func,
00094                              exif_mem_free_func);
00095 }

Generated on Tue Dec 19 14:33:53 2006 for EXIF library (libexif) Internals by  doxygen 1.5.1