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 }