/* * plist.c * Builds plist XML structures. * Written by FxChiP */ #include #include #include #include "plist.h" const char *plist_base = "\n\ \n\ \n\ \0"; xmlDocPtr new_plist() { char *plist = strdup(plist_base); xmlDocPtr plist_xml = xmlReadMemory(plist, strlen(plist), NULL, NULL, 0); if (!plist_xml) return NULL; free(plist); return plist_xml; } void free_plist(xmlDocPtr plist) { if (!plist) return; xmlFreeDoc(plist); } xmlNode *add_child_to_plist(xmlDocPtr plist, const char *name, const char *content, xmlNode *to_node, int depth) { if (!plist) return NULL; int i = 0; xmlNode *child; if (!to_node) to_node = xmlDocGetRootElement(plist); for (i = 0; i < depth; i++) { xmlNodeAddContent(to_node, "\t"); } child = xmlNewChild(to_node, NULL, name, content); xmlNodeAddContent(to_node, "\n"); return child; } xmlNode *add_key_str_dict_element(xmlDocPtr plist, xmlNode *dict, const char *key, const char *value, int depth) { xmlNode *keyPtr; keyPtr = add_child_to_plist(plist, "key", key, dict, depth); add_child_to_plist(plist, "string", value, dict, depth); return keyPtr; } char **read_dict_element_strings(xmlNode *dict) { // reads a set of keys and strings into an array where each even number is a key and odd numbers are values. // if the odd number is \0, that's the end of the list. char **return_me = NULL, **old = NULL; int current_length = 0; int current_pos = 0; xmlNode *dict_walker; for (dict_walker = dict->children; dict_walker; dict_walker = dict_walker->next) { if (!xmlStrcmp(dict_walker->name, "key")) { current_length += 2; old = return_me; return_me = realloc(return_me, sizeof(char*) * current_length); if (!return_me) { free(old); return NULL; } return_me[current_pos++] = xmlNodeGetContent(dict_walker); return_me[current_pos++] = xmlNodeGetContent(dict_walker->next->next); } } // one last thing... old = return_me; return_me = realloc(return_me, sizeof(char*) * current_length+1); return_me[current_pos] = strdup(""); return return_me; } void free_dictionary(char **dictionary) { if (!dictionary) return; int i = 0; for (i = 0; strcmp(dictionary[i], ""); i++) { free(dictionary[i]); } free(dictionary[i]); free(dictionary); }