Update spec file for license macro
[platform/upstream/libexif.git] / libexif / exif-mem.c
1 #include <libexif/exif-mem.h>
2
3 #include <stdlib.h>
4
5 struct _ExifMem {
6         unsigned int ref_count;
7         ExifMemAllocFunc alloc_func;
8         ExifMemReallocFunc realloc_func;
9         ExifMemFreeFunc free_func;
10 };
11
12 /*! Default memory allocation function. */
13 static void *
14 exif_mem_alloc_func (ExifLong ds)
15 {
16         return calloc ((size_t) ds, 1);
17 }
18
19 /*! Default memory reallocation function. */
20 static void *
21 exif_mem_realloc_func (void *d, ExifLong ds)
22 {
23         return realloc (d, (size_t) ds);
24 }
25
26 /*! Default memory free function. */
27 static void
28 exif_mem_free_func (void *d)
29 {
30         free (d);
31 }
32
33 ExifMem *
34 exif_mem_new (ExifMemAllocFunc alloc_func, ExifMemReallocFunc realloc_func,
35               ExifMemFreeFunc free_func)
36 {
37         ExifMem *mem;
38
39         if (!alloc_func && !realloc_func) 
40                 return NULL;
41         mem = alloc_func ? alloc_func (sizeof (ExifMem)) :
42                            realloc_func (NULL, sizeof (ExifMem));
43         if (!mem) return NULL;
44         mem->ref_count = 1;
45
46         mem->alloc_func   = alloc_func;
47         mem->realloc_func = realloc_func;
48         mem->free_func    = free_func;
49
50         return mem;
51 }
52
53 void
54 exif_mem_ref (ExifMem *mem)
55 {
56         if (!mem) return;
57         mem->ref_count++;
58 }
59
60 void
61 exif_mem_unref (ExifMem *mem)
62 {
63         if (!mem) return;
64         if (!--mem->ref_count)
65                 exif_mem_free (mem, mem);
66 }
67
68 void
69 exif_mem_free (ExifMem *mem, void *d)
70 {
71         if (!mem) return;
72         if (mem->free_func) {
73                 mem->free_func (d);
74                 return;
75         }
76 }
77
78 void *
79 exif_mem_alloc (ExifMem *mem, ExifLong ds)
80 {
81         if (!mem) return NULL;
82         if (mem->alloc_func || mem->realloc_func)
83                 return mem->alloc_func ? mem->alloc_func (ds) :
84                                          mem->realloc_func (NULL, ds);
85         return NULL;
86 }
87
88 void *
89 exif_mem_realloc (ExifMem *mem, void *d, ExifLong ds)
90 {
91         return (mem && mem->realloc_func) ? mem->realloc_func (d, ds) : NULL;
92 }
93
94 ExifMem *
95 exif_mem_new_default (void)
96 {
97         return exif_mem_new (exif_mem_alloc_func, exif_mem_realloc_func,
98                              exif_mem_free_func);
99 }