From c39685d3a87858e7ad8ada0da2798aaf670969b4 Mon Sep 17 00:00:00 2001 From: Jonathan Beck Date: Sat, 13 Dec 2008 16:16:58 +0100 Subject: Refine API and fix some warnings. --- include/plist/plist.h | 23 ++++--- src/Makefile.am | 2 +- src/bplist.c | 14 ++--- src/plist.c | 166 ++++++++++++++++++-------------------------------- src/plist.h | 4 +- src/xplist.c | 2 +- 6 files changed, 82 insertions(+), 129 deletions(-) diff --git a/include/plist/plist.h b/include/plist/plist.h index 49d978c..4469f06 100644 --- a/include/plist/plist.h +++ b/include/plist/plist.h @@ -45,11 +45,14 @@ typedef enum { PLIST_NONE } plist_type; -//Plist edition -void plist_new_dict(plist_t * plist); -void plist_new_array(plist_t * plist); -void plist_new_dict_in_plist(plist_t plist, plist_t * dict); -void plist_add_dict_element(plist_t dict, char *key, plist_type type, void *value, uint64_t length); +//Plist creation and edition +//utilitary functions to create root nodes (supposed to be dict or array) +plist_t plist_new_dict(); +plist_t plist_new_array(); +//Plist edition, create a new root if node is NULL +plist_t plist_add_sub_element( plist_t node, plist_type type, void* value, uint64_t length); + +//plist free void plist_free(plist_t plist); //plist navigation @@ -57,20 +60,16 @@ plist_t plist_get_first_child(plist_t node); plist_t plist_get_next_sibling(plist_t node); plist_t plist_get_prev_sibling(plist_t node); +plist_t plist_find_node(plist_t plist, plist_type type, void *value); +void plist_get_type_and_value(plist_t node, plist_type * type, void *value, uint64_t * length); +//import and export functions void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length); void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length); void plist_from_xml(const char *plist_xml, uint32_t length, plist_t * plist); void plist_from_bin(const char *plist_bin, uint32_t length, plist_t * plist); -plist_t plist_find_query_node(plist_t plist, char *key, char *request); -plist_t plist_find_node(plist_t plist, plist_type type, void *value); -void plist_get_type_and_value(plist_t node, plist_type * type, void *value, uint64_t * length); - - - - #ifdef __cplusplus } #endif diff --git a/src/Makefile.am b/src/Makefile.am index 1b81710..07143b6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ INCLUDES = -I$(top_srcdir)/include -AM_CFLAGS = $(libxml2_CFLAGS) $(libglib2_CFLAGS) +AM_CFLAGS = $(libxml2_CFLAGS) $(libglib2_CFLAGS) -D_GNU_SOURCE AM_LDFLAGS = $(libxml2_LIBS) $(libglib2_LIBS) lib_LTLIBRARIES = libplist.la diff --git a/src/bplist.c b/src/bplist.c index 48b996d..741a92c 100644 --- a/src/bplist.c +++ b/src/bplist.c @@ -80,7 +80,7 @@ void byte_convert(char *address, size_t size) #define be64dec(x) bswap_64( *(uint64_t*)(x) ) -#define get_needed_bytes(x) (x <= 1<<8 ? 1 : ( x <= 1<<16 ? 2 : ( x <= 1<<32 ? 4 : 8))) +#define get_needed_bytes(x) (x <= 1<<8 ? 1 : ( x <= 1<<16 ? 2 : ( x <= (uint64_t)1<<32 ? 4 : 8))) #define get_real_bytes(x) (x >> 32 ? 4 : 8) plist_t parse_uint_node(char *bnode, uint8_t size, char **next_object) @@ -446,7 +446,7 @@ void plist_from_bin(const char *plist_bin, uint32_t length, plist_t * plist) guint plist_data_hash(gconstpointer key) { - plist_data_t data = plist_get_data(key); + plist_data_t data = plist_get_data((plist_t) key); guint hash = data->type; guint i = 0; @@ -467,14 +467,14 @@ guint plist_data_hash(gconstpointer key) size = strlen(buff); break; case PLIST_UNICODE: - buff = data->unicodeval; + buff = (char *) data->unicodeval; size = strlen(buff) * sizeof(wchar_t); break; case PLIST_DATA: case PLIST_ARRAY: case PLIST_DICT: //for these types only hash pointer - buff = &key; + buff = (char *) &key; size = sizeof(gconstpointer); break; case PLIST_DATE: @@ -497,8 +497,8 @@ gboolean plist_data_compare(gconstpointer a, gconstpointer b) if (!((GNode *) a)->data || !((GNode *) b)->data) return FALSE; - plist_data_t val_a = plist_get_data(a); - plist_data_t val_b = plist_get_data(b); + plist_data_t val_a = plist_get_data((plist_t) a); + plist_data_t val_b = plist_get_data((plist_t) b); if (val_a->type != val_b->type) return FALSE; @@ -519,7 +519,7 @@ gboolean plist_data_compare(gconstpointer a, gconstpointer b) else return FALSE; case PLIST_UNICODE: - if (!strcmp(val_a->unicodeval, val_b->unicodeval)) + if (!wcscmp(val_a->unicodeval, val_b->unicodeval)) return TRUE; else return FALSE; diff --git a/src/plist.c b/src/plist.c index 172eceb..ca80c74 100644 --- a/src/plist.c +++ b/src/plist.c @@ -30,14 +30,14 @@ plist_t plist_new_node(plist_data_t data) { - return (plist_t)g_node_new(data); + return (plist_t) g_node_new(data); } -plist_data_t plist_get_data(plist_t node) +plist_data_t plist_get_data(const plist_t node) { if (!node) return NULL; - return ((GNode*)node)->data; + return ((GNode *) node)->data; } plist_data_t plist_new_plist_data() @@ -48,90 +48,71 @@ plist_data_t plist_new_plist_data() void plist_free_plist_data(plist_data_t data) { - free(data); -} - -void plist_new_dict(plist_t * plist) -{ - if (*plist != NULL) - return; - plist_data_t data = plist_new_plist_data(); - data->type = PLIST_DICT; - *plist = plist_new_node(data); -} + if (data) { + switch (data->type) { -void plist_new_array(plist_t * plist) -{ - if (*plist != NULL) - return; - plist_data_t data = plist_new_plist_data(); - data->type = PLIST_ARRAY; - *plist = plist_new_node(data); + default: + break; + } + free(data); + } } -void plist_new_dict_in_plist(plist_t plist, plist_t * dict) +plist_t plist_new_dict() { - if (!plist || *dict) - return; - plist_data_t data = plist_new_plist_data(); data->type = PLIST_DICT; - *dict = plist_new_node(data); - g_node_append(plist, *dict); + return plist_new_node(data); } - -/** Adds a new key pair to a dict. - * - * @param dict The dict node in the plist. - * @param key the key name of the key pair. - * @param type The the type of the value in the key pair. - * @param value a pointer to the actual buffer containing the value. WARNING : the buffer is supposed to match the type of the value - * - */ -void plist_add_dict_element(plist_t dict, char *key, plist_type type, void *value, uint64_t length) +plist_t plist_new_array() { - if (!dict || !key || !value) - return; - plist_data_t data = plist_new_plist_data(); - data->type = PLIST_KEY; - data->strval = strdup(key); - plist_t keynode = plist_new_node(data); - g_node_append(dict, keynode); - - //now handle value - plist_data_t val = plist_new_plist_data(); - val->type = type; - val->length = length; + data->type = PLIST_ARRAY; + return plist_new_node(data); +} + +plist_t plist_add_sub_element(plist_t node, plist_type type, void *value, uint64_t length) +{ + //only structured types are allowed to have nulll value + if (!value && (type == PLIST_DICT || type == PLIST_ARRAY)) { + //now handle value + plist_data_t data = plist_new_plist_data(); + data->type = type; + data->length = length; + + switch (type) { + case PLIST_BOOLEAN: + data->boolval = *((char *) value); + break; + case PLIST_UINT: + data->intval = *((uint64_t *) value); + break; + case PLIST_REAL: + data->realval = *((double *) value); + break; + case PLIST_STRING: + data->strval = strdup((char *) value); + break; + case PLIST_UNICODE: + data->unicodeval = wcsdup((wchar_t *) value); + break; + case PLIST_DATA: + memcpy(data->buff, value, length); + break; + case PLIST_ARRAY: + case PLIST_DICT: + case PLIST_DATE: + default: + break; + } - switch (type) { - case PLIST_BOOLEAN: - val->boolval = *((char *) value); - break; - case PLIST_UINT: - val->intval = *((uint64_t *) value); - break; - case PLIST_REAL: - val->realval = *((double *) value); - break; - case PLIST_STRING: - val->strval = strdup((char *) value); - break; - case PLIST_UNICODE: - val->unicodeval = wcsdup((wchar_t *) value); - break; - case PLIST_DATA: - memcpy(val->buff, value, length); - break; - case PLIST_ARRAY: - case PLIST_DICT: - case PLIST_DATE: - default: - break; - } - plist_t valnode = plist_new_node(val); - g_node_append(dict, valnode); + plist_t subnode = plist_new_node(data); + if (node) + g_node_append(node, subnode); + return subnode; + } else + return NULL; } void plist_free(plist_t plist) @@ -141,44 +122,17 @@ void plist_free(plist_t plist) plist_t plist_get_first_child(plist_t node) { - return (plist_t)g_node_first_child( (GNode*)node ); + return (plist_t) g_node_first_child((GNode *) node); } plist_t plist_get_next_sibling(plist_t node) { - return (plist_t)g_node_next_sibling( (GNode*)node ); + return (plist_t) g_node_next_sibling((GNode *) node); } plist_t plist_get_prev_sibling(plist_t node) { - return (plist_t)g_node_prev_sibling( (GNode*)node ); -} - -plist_t plist_find_query_node(plist_t plist, char *key, char *request) -{ - if (!plist) - return NULL; - - plist_t current = NULL; - plist_t next = NULL; - for (current = plist_get_first_child(plist); current; current = next) { - - next = plist_get_next_sibling(current); - plist_data_t data = plist_get_data(current); - - if (data->type == PLIST_KEY && !strcmp(data->strval, key) && next) { - - data = plist_get_data(next); - if (data->type == PLIST_STRING && !strcmp(data->strval, request)) - return next; - } - if (data->type == PLIST_DICT || data->type == PLIST_ARRAY) { - plist_t sub = plist_find_query_node(current, key, request); - if (sub) - return sub; - } - } - return NULL; + return (plist_t) g_node_prev_sibling((GNode *) node); } char compare_node_value(plist_type type, plist_data_t data, void *value) diff --git a/src/plist.h b/src/plist.h index ca3201a..b7c74d9 100644 --- a/src/plist.h +++ b/src/plist.h @@ -49,10 +49,10 @@ struct plist_data_s { plist_type type; }; -typedef struct plist_data_s* plist_data_t; +typedef struct plist_data_s *plist_data_t; plist_t plist_new_node(plist_data_t data); -plist_data_t plist_get_data(plist_t node); +plist_data_t plist_get_data(const plist_t node); plist_data_t plist_new_plist_data(); void plist_free_plist_data(plist_data_t node); diff --git a/src/xplist.c b/src/xplist.c index 4f81e1b..6c27375 100644 --- a/src/xplist.c +++ b/src/xplist.c @@ -221,7 +221,7 @@ void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node) break; plist_data_t data = plist_new_plist_data(); - GNode *subnode = g_node_new(data); + plist_t subnode = plist_new_node(data); if (*plist_node) g_node_append(*plist_node, subnode); else -- cgit v1.1-32-gdbae