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 }