diff options
| -rw-r--r-- | configure.ac | 2 | ||||
| -rw-r--r-- | src/bplist.c | 66 | ||||
| -rw-r--r-- | src/plist.h | 2 | ||||
| -rw-r--r-- | src/xplist.c | 91 | 
4 files changed, 94 insertions, 67 deletions
| diff --git a/configure.ac b/configure.ac index 4af0e49..2f171e1 100644 --- a/configure.ac +++ b/configure.ac @@ -45,7 +45,7 @@ if test "$no_debug_code" = true; then  	AC_DEFINE(STRIP_DEBUG_CODE,1,[Strip debug reporting code])  fi -AS_COMPILER_FLAGS(GLOBAL_CFLAGS, "-Wall -Wextra -Wmissing-declarations -Wredundant-decls -Wshadow -Wpointer-arith  -Wwrite-strings -Wswitch-default") +AS_COMPILER_FLAGS(GLOBAL_CFLAGS, "-Wall -Wextra -Wmissing-declarations -Wredundant-decls -Wshadow -Wpointer-arith  -Wwrite-strings -Wswitch-default -Wno-unused-parameter")  AC_SUBST(GLOBAL_CFLAGS)  AC_OUTPUT(Makefile src/Makefile include/Makefile plutil/Makefile libplist-1.0.pc) diff --git a/src/bplist.c b/src/bplist.c index ed381db..7a7225d 100644 --- a/src/bplist.c +++ b/src/bplist.c @@ -27,10 +27,10 @@  #include <string.h>  /* Magic marker and size. */ -#define BPLIST_MAGIC		"bplist" +#define BPLIST_MAGIC		((uint8_t*)"bplist")  #define BPLIST_MAGIC_SIZE	6 -#define BPLIST_VERSION		"00" +#define BPLIST_VERSION		((uint8_t*)"00")  #define BPLIST_VERSION_SIZE	2 @@ -59,11 +59,11 @@ enum {  	BPLIST_MASK = 0xF0  }; -static void byte_convert(char *address, size_t size) +static void byte_convert(uint8_t *address, size_t size)  {  #if G_BYTE_ORDER == G_LITTLE_ENDIAN  	uint8_t i = 0, j = 0; -	char tmp = '\0'; +	uint8_t tmp = 0;  	for (i = 0; i < (size / 2); i++) {  		tmp = address[i]; @@ -75,13 +75,18 @@ static void byte_convert(char *address, size_t size)  }  #define swap_n_bytes(x, n) \ -		n == 8 ? GUINT64_FROM_BE( *(uint64_t *)(x) ) : \ +		(n == 8 ? GUINT64_FROM_BE( *(uint64_t *)(x) ) : \  		(n == 4 ? GUINT32_FROM_BE( *(uint32_t *)(x) ) : \ -		(n == 2 ? GUINT16_FROM_BE( *(uint16_t *)(x) ) : *(uint8_t *)(x) )) +		(n == 2 ? GUINT16_FROM_BE( *(uint16_t *)(x) ) : \ +		*(uint8_t *)(x) )))  #define be64dec(x) GUINT64_FROM_BE( *(uint64_t*)(x) ) -#define get_needed_bytes(x) (x <= 1<<8 ? 1 : ( x <= 1<<16 ? 2 : ( x <= (uint64_t)1<<32 ? 4 : 8))) +#define get_needed_bytes(x) \ +		( ((uint64_t)x) < (1ULL << 8) ? 1 : \ +		( ((uint64_t)x) < (1ULL << 16) ? 2 : \ +		( ((uint64_t)x) < (1ULL << 32) ? 4 : 8))) +  #define get_real_bytes(x) (x >> 32 ? 4 : 8) @@ -118,12 +123,8 @@ static plist_t parse_real_node(char *bnode, uint8_t size)  	size = 1 << size;			// make length less misleading  	switch (size) {  	case sizeof(float): -		memcpy(&data->realval, bnode, size); -		byte_convert((char *) &data->realval, size); -		break;  	case sizeof(double): -		memcpy(&data->realval, bnode, size); -		byte_convert((char *) &data->realval, size); +		data->realval = swap_n_bytes(bnode, size);  		break;  	default:  		free(data); @@ -163,8 +164,8 @@ static plist_t parse_data_node(char *bnode, uint64_t size)  	data->type = PLIST_DATA;  	data->length = size; -	data->buff = (char *) malloc(sizeof(char) * size); -	memcpy(data->buff, bnode, sizeof(char) * size); +	data->buff = (uint8_t *) malloc(sizeof(uint8_t) * size); +	memcpy(data->buff, bnode, sizeof(uint8_t) * size);  	return g_node_new(data);  } @@ -175,8 +176,8 @@ static plist_t parse_dict_node(char *bnode, uint64_t size, uint32_t ref_size)  	data->type = PLIST_DICT;  	data->length = size; -	data->buff = (char *) malloc(sizeof(char) * size * ref_size * 2); -	memcpy(data->buff, bnode, sizeof(char) * size * ref_size * 2); +	data->buff = (uint8_t *) malloc(sizeof(uint8_t) * size * ref_size * 2); +	memcpy(data->buff, bnode, sizeof(uint8_t) * size * ref_size * 2);  	return g_node_new(data);  } @@ -187,8 +188,8 @@ static plist_t parse_array_node(char *bnode, uint64_t size, uint32_t ref_size)  	data->type = PLIST_ARRAY;  	data->length = size; -	data->buff = (char *) malloc(sizeof(char) * size * ref_size); -	memcpy(data->buff, bnode, sizeof(char) * size * ref_size); +	data->buff = (uint8_t *) malloc(sizeof(uint8_t) * size * ref_size); +	memcpy(data->buff, bnode, sizeof(uint8_t) * size * ref_size);  	return g_node_new(data);  } @@ -321,12 +322,12 @@ static gpointer copy_plist_data(gconstpointer src, gpointer data)  		break;  	case PLIST_DATA:  	case PLIST_ARRAY: -		dstdata->buff = (char *) malloc(sizeof(char *) * srcdata->length); -		memcpy(dstdata->buff, srcdata->buff, sizeof(char *) * srcdata->length); +		dstdata->buff = (uint8_t *) malloc(sizeof(uint8_t *) * srcdata->length); +		memcpy(dstdata->buff, srcdata->buff, sizeof(uint8_t *) * srcdata->length);  		break;  	case PLIST_DICT: -		dstdata->buff = (char *) malloc(sizeof(char *) * srcdata->length * 2); -		memcpy(dstdata->buff, srcdata->buff, sizeof(char *) * srcdata->length * 2); +		dstdata->buff = (uint8_t *) malloc(sizeof(uint8_t *) * srcdata->length * 2); +		memcpy(dstdata->buff, srcdata->buff, sizeof(uint8_t *) * srcdata->length * 2);  		break;  	default:  		break; @@ -561,7 +562,9 @@ static void serialize_plist(GNode * node, gpointer data)  		return;  	}  	//insert new ref -	g_hash_table_insert(ser->ref_table, node, GUINT_TO_POINTER(current_index)); +	uint64_t* index_val = (uint64_t*) malloc(sizeof(uint64_t)); +	*index_val = current_index; +	g_hash_table_insert(ser->ref_table, node, index_val);  	//now append current node to object array  	g_ptr_array_add(ser->objects, node); @@ -571,6 +574,12 @@ static void serialize_plist(GNode * node, gpointer data)  	return;  } +static gboolean free_index (gpointer key, gpointer value, gpointer user_data) +{ +	free((uint64_t*)value); +	return TRUE; +} +  #define Log2(x) (x == 8 ? 3 : (x == 4 ? 2 : (x == 2 ? 1 : 0)))  static void write_int(GByteArray * bplist, uint64_t val) @@ -619,7 +628,7 @@ static void write_data(GByteArray * bplist, uint8_t * val, uint64_t size)  static void write_string(GByteArray * bplist, char *val)  {  	uint64_t size = strlen(val); -	write_raw_data(bplist, BPLIST_STRING, val, size); +	write_raw_data(bplist, BPLIST_STRING, (uint8_t*) val, size);  }  static void write_array(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint8_t dict_param_size) @@ -640,7 +649,7 @@ static void write_array(GByteArray * bplist, GNode * node, GHashTable * ref_tabl  	GNode *cur = NULL;  	uint64_t i = 0;  	for (i = 0, cur = node->children; cur && i < size; cur = cur->next, i++) { -		idx = GPOINTER_TO_UINT(g_hash_table_lookup(ref_table, cur)); +		idx = *(uint64_t*)(g_hash_table_lookup(ref_table, cur));  		memcpy(buff + i * dict_param_size, &idx, dict_param_size);  		byte_convert(buff + i * dict_param_size, dict_param_size);  	} @@ -747,7 +756,7 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length)  			//TODO  			break;  		case PLIST_DATA: -			write_data(bplist_buff, data->strval, data->length); +			write_data(bplist_buff, data->buff, data->length);  		case PLIST_ARRAY:  			write_array(bplist_buff, g_ptr_array_index(objects, i), ref_table, dict_param_size);  			break; @@ -762,6 +771,9 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length)  		}  	} +	//free intermediate objects +	g_hash_table_foreach_remove (ref_table, free_index, NULL); +  	//write offsets  	offset_size = get_needed_bytes(bplist_buff->len);  	offset_table_index = bplist_buff->len; @@ -778,7 +790,7 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length)  	root_object = GUINT64_FROM_BE(root_object);  	offset_table_index = GUINT64_FROM_BE(offset_table_index); -	char trailer[BPLIST_TRL_SIZE]; +	uint8_t trailer[BPLIST_TRL_SIZE];  	memcpy(trailer + BPLIST_TRL_OFFSIZE_IDX, &offset_size, sizeof(uint8_t));  	memcpy(trailer + BPLIST_TRL_PARMSIZE_IDX, &dict_param_size, sizeof(uint8_t));  	memcpy(trailer + BPLIST_TRL_NUMOBJ_IDX, &num_objects, sizeof(uint64_t)); diff --git a/src/plist.h b/src/plist.h index a637118..8428597 100644 --- a/src/plist.h +++ b/src/plist.h @@ -43,7 +43,7 @@ struct plist_data_s {  		double realval;  		char *strval;  		wchar_t *unicodeval; -		char *buff; +		uint8_t *buff;  	};  	uint64_t length;  	plist_type type; diff --git a/src/xplist.c b/src/xplist.c index abc448d..3487f96 100644 --- a/src/xplist.c +++ b/src/xplist.c @@ -32,6 +32,17 @@  #include <libxml/parser.h>  #include <libxml/tree.h> +#define XPLIST_TEXT	BAD_CAST("text") +#define XPLIST_KEY	BAD_CAST("key") +#define XPLIST_FALSE	BAD_CAST("false") +#define XPLIST_TRUE	BAD_CAST("true") +#define XPLIST_INT	BAD_CAST("integer") +#define XPLIST_REAL	BAD_CAST("real") +#define XPLIST_DATE	BAD_CAST("date") +#define XPLIST_DATA	BAD_CAST("data") +#define XPLIST_STRING	BAD_CAST("string") +#define XPLIST_ARRAY	BAD_CAST("array") +#define XPLIST_DICT	BAD_CAST("dict")  const char *plist_base = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\  <!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n\ @@ -125,56 +136,56 @@ static void node_to_xml(GNode * node, gpointer xml_struct)  	xmlNodePtr child_node = NULL;  	char isStruct = FALSE; -	const gchar *tag = NULL; -	const gchar *val = NULL; +	const xmlChar *tag = NULL; +	gchar *val = NULL;  	switch (node_data->type) {  	case PLIST_BOOLEAN:  		{  			if (node_data->boolval) -				tag = "true"; +				tag = XPLIST_TRUE;  			else -				tag = "false"; +				tag = XPLIST_FALSE;  		}  		break;  	case PLIST_UINT: -		tag = "integer"; +		tag = XPLIST_INT;  		val = g_strdup_printf("%lu", (long unsigned int) node_data->intval);  		break;  	case PLIST_REAL: -		tag = "real"; +		tag = XPLIST_REAL;  		val = g_strdup_printf("%Lf", (long double) node_data->realval);  		break;  	case PLIST_STRING: -		tag = "string"; +		tag = XPLIST_STRING;  		val = g_strdup(node_data->strval);  		break;  	case PLIST_UNICODE: -		tag = "string"; +		tag = XPLIST_STRING;  		val = g_strdup((gchar *) node_data->unicodeval);  		break;  	case PLIST_KEY: -		tag = "key"; +		tag = XPLIST_KEY;  		val = g_strdup((gchar *) node_data->strval);  		break;  	case PLIST_DATA: -		tag = "data"; +		tag = XPLIST_DATA;  		gchar *valtmp = g_base64_encode(node_data->buff, node_data->length);  		val = format_string(valtmp, 68, xstruct->depth);  		g_free(valtmp);  		break;  	case PLIST_ARRAY: -		tag = "array"; +		tag = XPLIST_ARRAY;  		isStruct = TRUE;  		break;  	case PLIST_DICT: -		tag = "dict"; +		tag = XPLIST_DICT;  		isStruct = TRUE;  		break;  	case PLIST_DATE:			//TODO : handle date tag @@ -182,17 +193,17 @@ static void node_to_xml(GNode * node, gpointer xml_struct)  		break;  	} -	int i = 0; +	uint32_t i = 0;  	for (i = 0; i < xstruct->depth; i++) { -		xmlNodeAddContent(xstruct->xml, "\t"); +		xmlNodeAddContent(xstruct->xml, BAD_CAST("\t"));  	} -	child_node = xmlNewChild(xstruct->xml, NULL, tag, val); -	xmlNodeAddContent(xstruct->xml, "\n"); +	child_node = xmlNewChild(xstruct->xml, NULL, tag, BAD_CAST(val)); +	xmlNodeAddContent(xstruct->xml, BAD_CAST("\n"));  	g_free(val);  	//add return for structured types  	if (node_data->type == PLIST_ARRAY || node_data->type == PLIST_DICT) -		xmlNodeAddContent(child_node, "\n"); +		xmlNodeAddContent(child_node, BAD_CAST("\n"));  	if (isStruct) {  		struct xml_node child = { child_node, xstruct->depth + 1 }; @@ -202,20 +213,20 @@ static void node_to_xml(GNode * node, gpointer xml_struct)  	if (node_data->type == PLIST_ARRAY || node_data->type == PLIST_DICT) {  		for (i = 0; i < xstruct->depth; i++) { -			xmlNodeAddContent(child_node, "\t"); +			xmlNodeAddContent(child_node, BAD_CAST("\t"));  		}  	}  	return;  } -void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node) +static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)  {  	xmlNodePtr node = NULL;  	for (node = xml_node->children; node; node = node->next) { -		while (node && !xmlStrcmp(node->name, "text")) +		while (node && !xmlStrcmp(node->name, XPLIST_TEXT))  			node = node->next;  		if (!node)  			break; @@ -227,68 +238,68 @@ void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)  		else  			*plist_node = subnode; -		if (!xmlStrcmp(node->name, "true")) { -			data->boolval = 1; +		if (!xmlStrcmp(node->name, XPLIST_TRUE)) { +			data->boolval = TRUE;  			data->type = PLIST_BOOLEAN;  			data->length = 1;  			continue;  		} -		if (!xmlStrcmp(node->name, "false")) { -			data->boolval = 0; +		if (!xmlStrcmp(node->name, XPLIST_FALSE)) { +			data->boolval = FALSE;  			data->type = PLIST_BOOLEAN;  			data->length = 1;  			continue;  		} -		if (!xmlStrcmp(node->name, "integer")) { -			char *strval = xmlNodeGetContent(node); +		if (!xmlStrcmp(node->name, XPLIST_INT)) { +			char *strval = (char*)xmlNodeGetContent(node);  			data->intval = g_ascii_strtoull(strval, NULL, 0);  			data->type = PLIST_UINT;  			data->length = 8;  			continue;  		} -		if (!xmlStrcmp(node->name, "real")) { -			char *strval = xmlNodeGetContent(node); +		if (!xmlStrcmp(node->name, XPLIST_REAL)) { +			char *strval = (char*)xmlNodeGetContent(node);  			data->realval = atof(strval);  			data->type = PLIST_REAL;  			data->length = 8;  			continue;  		} -		if (!xmlStrcmp(node->name, "date")) +		if (!xmlStrcmp(node->name, XPLIST_DATE))  			continue;			//TODO : handle date tag -		if (!xmlStrcmp(node->name, "string")) { -			data->strval = strdup(xmlNodeGetContent(node)); +		if (!xmlStrcmp(node->name, XPLIST_STRING)) { +			data->strval = strdup( (char*) xmlNodeGetContent(node));  			data->type = PLIST_STRING;  			data->length = strlen(data->strval);  			continue;  		} -		if (!xmlStrcmp(node->name, "key")) { -			data->strval = strdup(xmlNodeGetContent(node)); +		if (!xmlStrcmp(node->name, XPLIST_KEY)) { +			data->strval = strdup( (char*) xmlNodeGetContent(node));  			data->type = PLIST_KEY;  			data->length = strlen(data->strval);  			continue;  		} -		if (!xmlStrcmp(node->name, "data")) { +		if (!xmlStrcmp(node->name, XPLIST_DATA)) {  			gsize size = 0; -			data->buff = g_base64_decode(xmlNodeGetContent(node), &size); +			data->buff = g_base64_decode((char*)xmlNodeGetContent(node), &size);  			data->length = size;  			data->type = PLIST_DATA;  			continue;  		} -		if (!xmlStrcmp(node->name, "array")) { +		if (!xmlStrcmp(node->name, XPLIST_ARRAY)) {  			data->type = PLIST_ARRAY;  			xml_to_node(node, &subnode);  			continue;  		} -		if (!xmlStrcmp(node->name, "dict")) { +		if (!xmlStrcmp(node->name, XPLIST_DICT)) {  			data->type = PLIST_DICT;  			xml_to_node(node, &subnode);  			continue; @@ -306,7 +317,11 @@ void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length)  	node_to_xml(plist, &root); -	xmlDocDumpMemory(plist_doc, (xmlChar **) plist_xml, length); +	int size = 0; +	xmlDocDumpMemory(plist_doc, (xmlChar **) plist_xml, &size); +	if (size >=0 ) +		*length = size; +	free_plist(plist_doc);  }  void plist_from_xml(const char *plist_xml, uint32_t length, plist_t * plist) | 
