summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Jonathan Beck2008-12-13 16:16:58 +0100
committerGravatar Jonathan Beck2008-12-13 16:16:58 +0100
commitc39685d3a87858e7ad8ada0da2798aaf670969b4 (patch)
tree743a653c4e29209b851d9602912aa5a74e9ef687
parente220e2cf08809a6a8853a8c9c7b06cef4e90cb57 (diff)
downloadlibplist-c39685d3a87858e7ad8ada0da2798aaf670969b4.tar.gz
libplist-c39685d3a87858e7ad8ada0da2798aaf670969b4.tar.bz2
Refine API and fix some warnings.
-rw-r--r--include/plist/plist.h23
-rw-r--r--src/Makefile.am2
-rw-r--r--src/bplist.c14
-rw-r--r--src/plist.c166
-rw-r--r--src/plist.h4
-rw-r--r--src/xplist.c2
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