gwenhywfar 5.12.0
keyvaluepair.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Mon Feb 08 2021
3 copyright : (C) 2021 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10#ifdef HAVE_CONFIG_H
11# include <config.h>
12#endif
13
14
15#include "gwenbuild/types/keyvaluepair_p.h"
16
17#include <gwenhywfar/debug.h>
18#include <gwenhywfar/memory.h>
19
20#include <stdlib.h>
21
22
23
25
26
27
28
29static GWB_KEYVALUEPAIR *_getByKey(GWB_KEYVALUEPAIR *kvp, const char *key);
30
31
32
33
34GWB_KEYVALUEPAIR *GWB_KeyValuePair_new(const char *key, const char *value)
35{
37
40
41 if (key)
43 if (value)
44 GWB_KeyValuePair_SetValue(kvp, value);
45
46 return kvp;
47}
48
49
50
52{
54
57
58 if (originalKvp->key)
59 GWB_KeyValuePair_SetKey(kvp, originalKvp->key);
60 if (originalKvp->value)
61 GWB_KeyValuePair_SetValue(kvp, originalKvp->value);
62
63 return kvp;
64}
65
66
67
69{
70 if (kvp) {
71 free(kvp->value);
72 free(kvp->key);
74 }
75}
76
77
78
80{
81 return kvp->key;
82}
83
84
85
87{
88 free(kvp->key);
89 if (s)
90 kvp->key=strdup(s);
91 else
92 kvp->key=NULL;
93}
94
95
96
98{
99 return kvp->value;
100}
101
102
103
105{
106 free(kvp->value);
107 if (s)
108 kvp->value=strdup(s);
109 else
110 kvp->value=NULL;
111}
112
113
114
115GWB_KEYVALUEPAIR_LIST *GWB_KeyValuePair_List_dup(const GWB_KEYVALUEPAIR_LIST *oldKvpList)
116{
117 GWB_KEYVALUEPAIR_LIST *kvpList;
118 GWB_KEYVALUEPAIR *kvp;
119
120 kvpList=GWB_KeyValuePair_List_new();
121 kvp=GWB_KeyValuePair_List_First(oldKvpList);
122 while(kvp) {
123 GWB_KeyValuePair_List_Add(GWB_KeyValuePair_dup(kvp), kvpList);
124 kvp=GWB_KeyValuePair_List_Next(kvp);
125 }
126
127 return kvpList;
128}
129
130
131
132const char *GWB_KeyValuePair_List_GetValue(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *key)
133{
134 GWB_KEYVALUEPAIR *kvp;
135
136 kvp=GWB_KeyValuePair_List_GetFirstByKey(kvpList, key);
137 if (kvp==NULL)
138 return NULL;
139 return kvp->value;
140}
141
142
143
144GWB_KEYVALUEPAIR *GWB_KeyValuePair_List_GetFirstByKey(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *key)
145{
146 return _getByKey(GWB_KeyValuePair_List_First(kvpList), key);
147}
148
149
150
152{
153 if (kvp)
154 return _getByKey(GWB_KeyValuePair_List_Next(kvp), key);
155 return NULL;
156}
157
158
159
161{
162 while(kvp) {
163 if (kvp->key && strcmp(kvp->key, key)==0)
164 return kvp;
165 kvp=GWB_KeyValuePair_List_Next(kvp);
166 }
167
168 return NULL;
169}
170
171
172
173int GWB_KeyValuePair_List_SampleValuesByKey(const GWB_KEYVALUEPAIR_LIST *kvpList,
174 const char *key,
175 const char *prefix,
176 const char *delim,
177 GWEN_BUFFER *destBuf)
178{
179 const GWB_KEYVALUEPAIR *kvp;
180 int entriesAdded=0;
181
182 kvp=GWB_KeyValuePair_List_GetFirstByKey(kvpList, key);
183 while(kvp) {
184 if (kvp->value && *(kvp->value)) {
185 if (entriesAdded && delim)
186 GWEN_Buffer_AppendString(destBuf, delim);
187 if (prefix)
188 GWEN_Buffer_AppendString(destBuf, prefix);
189 GWEN_Buffer_AppendString(destBuf, kvp->value);
190 entriesAdded++;
191 }
193 }
194 return entriesAdded;
195}
196
197
198
199int GWB_KeyValuePair_List_WriteAllPairsToBuffer(const GWB_KEYVALUEPAIR_LIST *kvpList,
200 const char *prefix,
201 const char *assignmentString,
202 const char *delim,
203 GWEN_BUFFER *destBuf)
204{
205 const GWB_KEYVALUEPAIR *kvp;
206 int entriesAdded=0;
207
208 kvp=GWB_KeyValuePair_List_First(kvpList);
209 while(kvp) {
210 if (kvp->key && *(kvp->key)) {
211 if (entriesAdded && delim)
212 GWEN_Buffer_AppendString(destBuf, delim);
213 if (prefix)
214 GWEN_Buffer_AppendString(destBuf, prefix);
215 GWEN_Buffer_AppendString(destBuf, kvp->key);
216 if (kvp->value && *(kvp->value)) {
217 if (assignmentString)
218 GWEN_Buffer_AppendString(destBuf, assignmentString);
219 GWEN_Buffer_AppendString(destBuf, kvp->value);
220 }
221 entriesAdded++;
222 }
223 kvp=GWB_KeyValuePair_List_Next(kvp);
224 }
225 return entriesAdded;
226}
227
228
229
231{
232 if (kvp->key)
233 GWEN_XMLNode_SetCharValue(xmlNode, "key", kvp->key);
234 if (kvp->value)
235 GWEN_XMLNode_SetCharValue(xmlNode, "value", kvp->value);
236}
237
238
239
240void GWB_KeyValuePair_List_WriteXml(const GWB_KEYVALUEPAIR_LIST *kvpList, GWEN_XMLNODE *xmlNode, const char *groupName)
241{
242 GWB_KEYVALUEPAIR *kvp;
243
244 kvp=GWB_KeyValuePair_List_First(kvpList);
245 while(kvp) {
246 GWEN_XMLNODE *entryNode;
247
248 entryNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, groupName);
249 GWB_KeyValuePair_toXml(kvp, entryNode);
250 GWEN_XMLNode_AddChild(xmlNode, entryNode);
251 kvp=GWB_KeyValuePair_List_Next(kvp);
252 }
253}
254
255
#define NULL
Definition binreloc.c:300
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
const char * GWB_KeyValuePair_GetValue(const GWB_KEYVALUEPAIR *kvp)
void GWB_KeyValuePair_toXml(const GWB_KEYVALUEPAIR *kvp, GWEN_XMLNODE *xmlNode)
static GWB_KEYVALUEPAIR * _getByKey(GWB_KEYVALUEPAIR *kvp, const char *key)
void GWB_KeyValuePair_SetKey(GWB_KEYVALUEPAIR *kvp, const char *s)
void GWB_KeyValuePair_List_WriteXml(const GWB_KEYVALUEPAIR_LIST *kvpList, GWEN_XMLNODE *xmlNode, const char *groupName)
const char * GWB_KeyValuePair_GetKey(const GWB_KEYVALUEPAIR *kvp)
GWB_KEYVALUEPAIR * GWB_KeyValuePair_List_GetNextByKey(const GWB_KEYVALUEPAIR *kvp, const char *key)
GWB_KEYVALUEPAIR * GWB_KeyValuePair_new(const char *key, const char *value)
int GWB_KeyValuePair_List_SampleValuesByKey(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *key, const char *prefix, const char *delim, GWEN_BUFFER *destBuf)
void GWB_KeyValuePair_free(GWB_KEYVALUEPAIR *kvp)
GWB_KEYVALUEPAIR * GWB_KeyValuePair_dup(const GWB_KEYVALUEPAIR *originalKvp)
int GWB_KeyValuePair_List_WriteAllPairsToBuffer(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *prefix, const char *assignmentString, const char *delim, GWEN_BUFFER *destBuf)
const char * GWB_KeyValuePair_List_GetValue(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *key)
GWB_KEYVALUEPAIR * GWB_KeyValuePair_List_GetFirstByKey(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *key)
void GWB_KeyValuePair_SetValue(GWB_KEYVALUEPAIR *kvp, const char *s)
GWB_KEYVALUEPAIR_LIST * GWB_KeyValuePair_List_dup(const GWB_KEYVALUEPAIR_LIST *oldKvpList)
struct GWB_KEYVALUEPAIR GWB_KEYVALUEPAIR
#define GWEN_LIST_FUNCTIONS(t, pr)
Definition list1.h:367
#define GWEN_LIST_INIT(t, element)
Definition list1.h:466
#define GWEN_FREE_OBJECT(varname)
Definition memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition memory.h:55
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition xml.c:144
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition xml.c:423
void GWEN_XMLNode_SetCharValue(GWEN_XMLNODE *n, const char *name, const char *value)
Definition xml.c:897
struct GWEN__XMLNODE GWEN_XMLNODE
Definition xml.h:156
@ GWEN_XMLNodeTypeTag
Definition xml.h:145