summaryrefslogtreecommitdiffstats
path: root/src/xplist.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xplist.c')
-rw-r--r--src/xplist.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/src/xplist.c b/src/xplist.c
index a87b259..3e975f6 100644
--- a/src/xplist.c
+++ b/src/xplist.c
@@ -89,7 +89,7 @@ struct xml_node {
89 * 89 *
90 * @return The plist XML document. 90 * @return The plist XML document.
91 */ 91 */
92xmlDocPtr new_plist() 92xmlDocPtr new_xml_plist()
93{ 93{
94 char *plist = strdup(plist_base); 94 char *plist = strdup(plist_base);
95 xmlDocPtr plist_xml = xmlReadMemory(plist, strlen(plist), NULL, NULL, 0); 95 xmlDocPtr plist_xml = xmlReadMemory(plist, strlen(plist), NULL, NULL, 0);
@@ -207,7 +207,7 @@ void node_to_xml(GNode * node, gpointer xml_struct)
207 return; 207 return;
208} 208}
209 209
210void xml_to_node(xmlNodePtr xml_node, GNode * plist_node) 210void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)
211{ 211{
212 xmlNodePtr node = NULL; 212 xmlNodePtr node = NULL;
213 213
@@ -220,7 +220,10 @@ void xml_to_node(xmlNodePtr xml_node, GNode * plist_node)
220 220
221 struct plist_data *data = (struct plist_data *) calloc(sizeof(struct plist_data), 1); 221 struct plist_data *data = (struct plist_data *) calloc(sizeof(struct plist_data), 1);
222 GNode *subnode = g_node_new(data); 222 GNode *subnode = g_node_new(data);
223 g_node_append(plist_node, subnode); 223 if (*plist_node)
224 g_node_append(*plist_node, subnode);
225 else
226 *plist_node = subnode;
224 227
225 if (!xmlStrcmp(node->name, "true")) { 228 if (!xmlStrcmp(node->name, "true")) {
226 data->boolval = 1; 229 data->boolval = 1;
@@ -236,7 +239,7 @@ void xml_to_node(xmlNodePtr xml_node, GNode * plist_node)
236 239
237 if (!xmlStrcmp(node->name, "integer")) { 240 if (!xmlStrcmp(node->name, "integer")) {
238 char *strval = xmlNodeGetContent(node); 241 char *strval = xmlNodeGetContent(node);
239 data->intval = atoi(strval); 242 data->intval = g_ascii_strtoull(strval, NULL, 0);
240 data->type = PLIST_UINT; 243 data->type = PLIST_UINT;
241 continue; 244 continue;
242 } 245 }
@@ -271,13 +274,13 @@ void xml_to_node(xmlNodePtr xml_node, GNode * plist_node)
271 274
272 if (!xmlStrcmp(node->name, "array")) { 275 if (!xmlStrcmp(node->name, "array")) {
273 data->type = PLIST_ARRAY; 276 data->type = PLIST_ARRAY;
274 xml_to_node(node, subnode); 277 xml_to_node(node, &subnode);
275 continue; 278 continue;
276 } 279 }
277 280
278 if (!xmlStrcmp(node->name, "dict")) { 281 if (!xmlStrcmp(node->name, "dict")) {
279 data->type = PLIST_DICT; 282 data->type = PLIST_DICT;
280 xml_to_node(node, subnode); 283 xml_to_node(node, &subnode);
281 continue; 284 continue;
282 } 285 }
283 } 286 }
@@ -287,10 +290,12 @@ void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length)
287{ 290{
288 if (!plist || !plist_xml || *plist_xml) 291 if (!plist || !plist_xml || *plist_xml)
289 return; 292 return;
290 xmlDocPtr plist_doc = new_plist(); 293 xmlDocPtr plist_doc = new_xml_plist();
291 xmlNodePtr root_node = xmlDocGetRootElement(plist_doc); 294 xmlNodePtr root_node = xmlDocGetRootElement(plist_doc);
292 struct xml_node root = { root_node, 0 }; 295 struct xml_node root = { root_node, 0 };
293 g_node_children_foreach(plist, G_TRAVERSE_ALL, node_to_xml, &root); 296
297 node_to_xml(plist, &root);
298
294 xmlDocDumpMemory(plist_doc, (xmlChar **) plist_xml, length); 299 xmlDocDumpMemory(plist_doc, (xmlChar **) plist_xml, length);
295} 300}
296 301
@@ -299,8 +304,5 @@ void xml_to_plist(const char *plist_xml, uint32_t length, plist_t * plist)
299 xmlDocPtr plist_doc = xmlReadMemory(plist_xml, length, NULL, NULL, 0); 304 xmlDocPtr plist_doc = xmlReadMemory(plist_xml, length, NULL, NULL, 0);
300 xmlNodePtr root_node = xmlDocGetRootElement(plist_doc); 305 xmlNodePtr root_node = xmlDocGetRootElement(plist_doc);
301 306
302 struct plist_data *data = (struct plist_data *) calloc(sizeof(struct plist_data), 1); 307 xml_to_node(root_node, plist);
303 *plist = g_node_new(data);
304 data->type = PLIST_DICT;
305 xml_to_node(root_node, *plist);
306} 308}