doxygen: blender/imbuf tagged.
[blender.git] / source / blender / imbuf / intern / metadata.c
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2005 Blender Foundation
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): Austin Benesh. Ton Roosendaal.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 /** \file blender/imbuf/intern/metadata.c
31  *  \ingroup imbuf
32  */
33
34
35 #include <stdlib.h>
36 #include <string.h>
37
38 #include "BLI_blenlib.h"
39 #include "MEM_guardedalloc.h"
40
41 #include "IMB_imbuf_types.h"
42 #include "IMB_imbuf.h"
43
44 #include "IMB_metadata.h"
45
46
47
48 void IMB_metadata_free(struct ImBuf* img)
49 {
50         ImMetaData *info;
51
52         if (!img)
53                 return;
54         if (!img->metadata) {
55                 return;
56         }
57         info = img->metadata;
58         while (info) {
59                 ImMetaData* next = info->next;
60                 MEM_freeN(info->key);
61                 MEM_freeN(info->value);
62                 MEM_freeN(info);
63                 info = next;
64         }
65 }
66
67 int IMB_metadata_get_field(struct ImBuf* img, const char* key, char* field, int len)
68 {
69         ImMetaData *info;
70         int retval = 0;
71
72         if (!img)
73                 return 0;
74         if (!img->metadata) {
75                 return 0;
76         }
77         info = img->metadata;
78         while (info) {
79                 if (strcmp(key, info->key) == 0) {
80                         BLI_strncpy(field, info->value, len);
81                         retval = 1;
82                         break;
83                 }
84                 info = info->next;
85         }
86         return retval;
87 }
88
89 int IMB_metadata_add_field(struct ImBuf* img, const char* key, const char* field)
90 {
91         ImMetaData *info;
92         ImMetaData *last;
93
94         if (!img)
95                 return 0;
96
97         if (!img->metadata) {
98                 img->metadata = MEM_callocN(sizeof(ImMetaData), "ImMetaData");
99                 info = img->metadata;
100         } else {
101                 info = img->metadata;
102                 last = info;
103                 while (info) {
104                         last = info;
105                         info = info->next;
106                 }
107                 info = MEM_callocN(sizeof(ImMetaData), "ImMetaData");
108                 last->next = info;
109         }
110         info->key = BLI_strdup(key);
111         info->value = BLI_strdup(field);
112         return 1;
113 }
114
115 int IMB_metadata_del_field(struct ImBuf *img, const char *key)
116 {
117         ImMetaData *p, *p1;
118
119         if ((!img) || (!img->metadata))
120                 return (0);
121
122         p = img->metadata;
123         p1 = NULL;
124         while (p) {
125                 if (!strcmp (key, p->key)) {
126                         if (p1)
127                                 p1->next = p->next;
128                         else
129                                 img->metadata = p->next;
130
131                         MEM_freeN(p->key);
132                         MEM_freeN(p->value);
133                         MEM_freeN(p);
134                         return (1);
135                 }
136                 p1 = p;
137                 p = p->next;
138         }
139         return (0);
140 }
141
142 int IMB_metadata_change_field(struct ImBuf *img, const char *key, const char *field)
143 {
144         ImMetaData *p;
145
146         if (!img)
147                 return (0);
148
149         if (!img->metadata)
150                 return (IMB_metadata_add_field (img, key, field));
151
152         p = img->metadata;
153         while (p) {
154                 if (!strcmp (key, p->key)) {
155                         MEM_freeN (p->value);
156                         p->value = BLI_strdup (field);
157                         return (1);
158                 }
159                 p = p->next;
160         }
161
162         return (IMB_metadata_add_field (img, key, field));
163 }
164