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 
00013 static void *
00014 exif_mem_alloc_func (ExifLong ds)
00015 {
00016         return calloc ((size_t) ds, 1);
00017 }
00018 
00020 static void *
00021 exif_mem_realloc_func (void *d, ExifLong ds)
00022 {
00023         return realloc (d, (size_t) ds);
00024 }
00025 
00027 static void
00028 exif_mem_free_func (void *d)
00029 {
00030         free (d);
00031 }
00032 
00033 ExifMem *
00034 exif_mem_new (ExifMemAllocFunc alloc_func, ExifMemReallocFunc realloc_func,
00035               ExifMemFreeFunc free_func)
00036 {
00037         ExifMem *mem;
00038 
00039         if (!alloc_func && !realloc_func) 
00040                 return NULL;
00041         mem = alloc_func ? alloc_func (sizeof (ExifMem)) :
00042                            realloc_func (NULL, sizeof (ExifMem));
00043         if (!mem) return NULL;
00044         mem->ref_count = 1;
00045 
00046         mem->alloc_func   = alloc_func;
00047         mem->realloc_func = realloc_func;
00048         mem->free_func    = free_func;
00049 
00050         return mem;
00051 }
00052 
00053 void
00054 exif_mem_ref (ExifMem *mem)
00055 {
00056         if (!mem) return;
00057         mem->ref_count++;
00058 }
00059 
00060 void
00061 exif_mem_unref (ExifMem *mem)
00062 {
00063         if (!mem) return;
00064         if (!--mem->ref_count)
00065                 exif_mem_free (mem, mem);
00066 }
00067 
00068 void
00069 exif_mem_free (ExifMem *mem, void *d)
00070 {
00071         if (!mem) return;
00072         if (mem->free_func) {
00073                 mem->free_func (d);
00074                 return;
00075         }
00076 }
00077 
00078 void *
00079 exif_mem_alloc (ExifMem *mem, ExifLong ds)
00080 {
00081         if (!mem) return NULL;
00082         if (mem->alloc_func || mem->realloc_func)
00083                 return mem->alloc_func ? mem->alloc_func (ds) :
00084                                          mem->realloc_func (NULL, ds);
00085         return NULL;
00086 }
00087 
00088 void *
00089 exif_mem_realloc (ExifMem *mem, void *d, ExifLong ds)
00090 {
00091         return (mem && mem->realloc_func) ? mem->realloc_func (d, ds) : NULL;
00092 }
00093 
00094 ExifMem *
00095 exif_mem_new_default (void)
00096 {
00097         return exif_mem_new (exif_mem_alloc_func, exif_mem_realloc_func,
00098                              exif_mem_free_func);
00099 }

SourceForge.net Logo Generated by doxygen