SVN maintenance.
[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 #include <stdlib.h>
31 #include <string.h>
32
33 #include "BLI_blenlib.h"
34 #include "MEM_guardedalloc.h"
35
36 #include "IMB_imbuf_types.h"
37 #include "IMB_imbuf.h"
38
39 #include "IMB_metadata.h"
40
41
42
43 void IMB_metadata_free(struct ImBuf* img)
44 {
45         ImMetaData *info;
46
47         if (!img)
48                 return;
49         if (!img->metadata) {
50                 return;
51         }
52         info = img->metadata;
53         while (info) {
54                 ImMetaData* next = info->next;
55                 MEM_freeN(info->key);
56                 MEM_freeN(info->value);
57                 MEM_freeN(info);
58                 info = next;
59         }
60 }
61
62 int IMB_metadata_get_field(struct ImBuf* img, const char* key, char* field, int len)
63 {
64         ImMetaData *info;
65         int retval = 0;
66
67         if (!img)
68                 return 0;
69         if (!img->metadata) {
70                 return 0;
71         }
72         info = img->metadata;
73         while (info) {
74                 if (strcmp(key, info->key) == 0) {
75                         BLI_strncpy(field, info->value, len);
76                         retval = 1;
77                         break;
78                 }
79                 info = info->next;
80         }
81         return retval;
82 }
83
84 int IMB_metadata_add_field(struct ImBuf* img, const char* key, const char* field)
85 {
86         ImMetaData *info;
87         ImMetaData *last;
88
89         if (!img)
90                 return 0;
91
92         if (!img->metadata) {
93                 img->metadata = MEM_callocN(sizeof(ImMetaData), "ImMetaData");
94                 info = img->metadata;
95         } else {
96                 info = img->metadata;
97                 last = info;
98                 while (info) {
99                         last = info;
100                         info = info->next;
101                 }
102                 info = MEM_callocN(sizeof(ImMetaData), "ImMetaData");
103                 last->next = info;
104         }
105         info->key = BLI_strdup(key);
106         info->value = BLI_strdup(field);
107         return 1;
108 }
109
110 int IMB_metadata_del_field(struct ImBuf *img, const char *key)
111 {
112         ImMetaData *p, *p1;
113
114         if ((!img) || (!img->metadata))
115                 return (0);
116
117         p = img->metadata;
118         p1 = NULL;
119         while (p) {
120                 if (!strcmp (key, p->key)) {
121                         if (p1)
122                                 p1->next = p->next;
123                         else
124                                 img->metadata = p->next;
125
126                         MEM_freeN(p->key);
127                         MEM_freeN(p->value);
128                         MEM_freeN(p);
129                         return (1);
130                 }
131                 p1 = p;
132                 p = p->next;
133         }
134         return (0);
135 }
136
137 int IMB_metadata_change_field(struct ImBuf *img, const char *key, const char *field)
138 {
139         ImMetaData *p;
140
141         if (!img)
142                 return (0);
143
144         if (!img->metadata)
145                 return (IMB_metadata_add_field (img, key, field));
146
147         p = img->metadata;
148         while (p) {
149                 if (!strcmp (key, p->key)) {
150                         MEM_freeN (p->value);
151                         p->value = BLI_strdup (field);
152                         return (1);
153                 }
154                 p = p->next;
155         }
156
157         return (IMB_metadata_add_field (img, key, field));
158 }
159