gwenhywfar  5.10.1
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 
24 GWEN_LIST_FUNCTIONS(GWB_KEYVALUEPAIR, GWB_KeyValuePair)
25 
26 
27 
28 
29 static GWB_KEYVALUEPAIR *_getByKey(GWB_KEYVALUEPAIR *kvp, const char *key);
30 
31 
32 
33 
34 GWB_KEYVALUEPAIR *GWB_KeyValuePair_new(const char *key, const char *value)
35 {
36  GWB_KEYVALUEPAIR *kvp;
37 
40 
41  if (key)
42  GWB_KeyValuePair_SetKey(kvp, key);
43  if (value)
44  GWB_KeyValuePair_SetValue(kvp, value);
45 
46  return kvp;
47 }
48 
49 
50 
52 {
53  GWB_KEYVALUEPAIR *kvp;
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);
73  GWEN_FREE_OBJECT(kvp);
74  }
75 }
76 
77 
78 
80 {
81  return kvp->key;
82 }
83 
84 
85 
86 void GWB_KeyValuePair_SetKey(GWB_KEYVALUEPAIR *kvp, const char *s)
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 
115 GWB_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 
132 const 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 
144 GWB_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 
173 int 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 
199 int 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 
240 void 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 
int GWB_KeyValuePair_List_SampleValuesByKey(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *key, const char *prefix, const char *delim, GWEN_BUFFER *destBuf)
Definition: keyvaluepair.c:173
void GWB_KeyValuePair_toXml(const GWB_KEYVALUEPAIR *kvp, GWEN_XMLNODE *xmlNode)
Definition: keyvaluepair.c:230
void GWB_KeyValuePair_List_WriteXml(const GWB_KEYVALUEPAIR_LIST *kvpList, GWEN_XMLNODE *xmlNode, const char *groupName)
Definition: keyvaluepair.c:240
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
void GWB_KeyValuePair_SetValue(GWB_KEYVALUEPAIR *kvp, const char *s)
Definition: keyvaluepair.c:104
void GWEN_XMLNode_SetCharValue(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:897
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
static GWB_KEYVALUEPAIR * _getByKey(GWB_KEYVALUEPAIR *kvp, const char *key)
Definition: keyvaluepair.c:160
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
GWB_KEYVALUEPAIR * GWB_KeyValuePair_List_GetNextByKey(const GWB_KEYVALUEPAIR *kvp, const char *key)
Definition: keyvaluepair.c:151
GWB_KEYVALUEPAIR * GWB_KeyValuePair_new(const char *key, const char *value)
Definition: keyvaluepair.c:34
void GWB_KeyValuePair_free(GWB_KEYVALUEPAIR *kvp)
Definition: keyvaluepair.c:68
struct GWB_KEYVALUEPAIR GWB_KEYVALUEPAIR
Definition: keyvaluepair.h:19
const char * GWB_KeyValuePair_List_GetValue(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *key)
Definition: keyvaluepair.c:132
void GWB_KeyValuePair_SetKey(GWB_KEYVALUEPAIR *kvp, const char *s)
Definition: keyvaluepair.c:86
#define GWEN_LIST_INIT(t, element)
Definition: list1.h:465
GWB_KEYVALUEPAIR * GWB_KeyValuePair_dup(const GWB_KEYVALUEPAIR *originalKvp)
Definition: keyvaluepair.c:51
GWB_KEYVALUEPAIR * GWB_KeyValuePair_List_GetFirstByKey(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *key)
Definition: keyvaluepair.c:144
#define GWEN_LIST_FUNCTIONS(t, pr)
Definition: list1.h:366
int GWB_KeyValuePair_List_WriteAllPairsToBuffer(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *prefix, const char *assignmentString, const char *delim, GWEN_BUFFER *destBuf)
Definition: keyvaluepair.c:199
const char * GWB_KeyValuePair_GetValue(const GWB_KEYVALUEPAIR *kvp)
Definition: keyvaluepair.c:97
const char * GWB_KeyValuePair_GetKey(const GWB_KEYVALUEPAIR *kvp)
Definition: keyvaluepair.c:79
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
GWB_KEYVALUEPAIR_LIST * GWB_KeyValuePair_List_dup(const GWB_KEYVALUEPAIR_LIST *oldKvpList)
Definition: keyvaluepair.c:115
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:423