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 }