diff options
| -rw-r--r-- | include/plist/plist.h | 23 | ||||
| -rw-r--r-- | src/Makefile.am | 2 | ||||
| -rw-r--r-- | src/bplist.c | 14 | ||||
| -rw-r--r-- | src/plist.c | 166 | ||||
| -rw-r--r-- | src/plist.h | 4 | ||||
| -rw-r--r-- | 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 | 
