diff options
| -rw-r--r-- | Makefile.am | 2 | ||||
| -rw-r--r-- | include/plist/plist.h | 21 | ||||
| -rw-r--r-- | src/bplist.c | 26 | ||||
| -rw-r--r-- | src/plist.c | 173 | ||||
| -rw-r--r-- | src/plist.h | 1 | ||||
| -rw-r--r-- | src/xplist.c | 14 | 
6 files changed, 176 insertions, 61 deletions
| diff --git a/Makefile.am b/Makefile.am index e88e9be..264b0a3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -9,4 +9,4 @@ doc:  	doxygen doxygen.cfg  indent: -	indent -kr -ut -ts4 -l120 src/*.c src/*.h dev/*.c +	indent -kr -ut -ts4 -l120 src/*.c src/*.h plutil/*.c diff --git a/include/plist/plist.h b/include/plist/plist.h index b6335f5..b496d6f 100644 --- a/include/plist/plist.h +++ b/include/plist/plist.h @@ -52,6 +52,17 @@ 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 edition, only work for dict and array node +void plist_add_sub_node(plist_t node, plist_t subnode); + +void plist_add_sub_key_el(plist_t node, char* val); +void plist_add_sub_string_el(plist_t node, char* val); +void plist_add_sub_bool_el(plist_t node, uint8_t val); +void plist_add_sub_uint_el(plist_t node, uint64_t val); +void plist_add_sub_real_el(plist_t node, double val); +void plist_add_sub_data_el(plist_t node, char* val, uint64_t length); + +  //plist free  void plist_free(plist_t plist); @@ -63,6 +74,16 @@ plist_t plist_get_prev_sibling(plist_t node);  plist_t plist_find_node(plist_t plist, plist_type type, void *value, uint64_t length);  void plist_get_type_and_value(plist_t node, plist_type * type, void *value, uint64_t * length); +//Plist reading +plist_type plist_get_node_type(plist_t node); + +void plist_get_key_val(plist_t node, char** val); +void plist_get_string_val(plist_t node, char** val); +void plist_get_bool_val(plist_t node, uint8_t* val); +void plist_get_uint_val(plist_t node, uint64_t* val); +void plist_get_real_val(plist_t node, double* val); +void plist_get_data_val(plist_t node, char** val, 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); diff --git a/src/bplist.c b/src/bplist.c index cbe53cd..b633535 100644 --- a/src/bplist.c +++ b/src/bplist.c @@ -59,7 +59,7 @@ enum {  	BPLIST_MASK = 0xF0  }; -static void byte_convert(uint8_t *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; @@ -124,7 +124,7 @@ static plist_t parse_real_node(char *bnode, uint8_t size)  	switch (size) {  	case sizeof(float):  	case sizeof(double): -		data->intval = UINT_TO_HOST(bnode, size); //use the fact that we have an union to cheat byte swapping +		data->intval = UINT_TO_HOST(bnode, size);	//use the fact that we have an union to cheat byte swapping  		break;  	default:  		free(data); @@ -140,8 +140,8 @@ static plist_t parse_date_node(char *bnode, uint8_t size)  	plist_data_t data = plist_get_data(node);  	double time_real = data->realval; -	data->timeval.tv_sec = (glong)time_real; -	data->timeval.tv_usec = (time_real - (glong)time_real) * G_USEC_PER_SEC; +	data->timeval.tv_sec = (glong) time_real; +	data->timeval.tv_usec = (time_real - (glong) time_real) * G_USEC_PER_SEC;  	data->type = PLIST_DATE;  	return node;  } @@ -475,7 +475,7 @@ static guint plist_data_hash(gconstpointer key)  	case PLIST_BOOLEAN:  	case PLIST_UINT:  	case PLIST_REAL: -		buff = (char *) &data->intval; //works also for real as we use an union +		buff = (char *) &data->intval;	//works also for real as we use an union  		size = 8;  		break;  	case PLIST_KEY: @@ -574,7 +574,7 @@ static void serialize_plist(GNode * node, gpointer data)  		return;  	}  	//insert new ref -	uint64_t* index_val = (uint64_t*) malloc(sizeof(uint64_t)); +	uint64_t *index_val = (uint64_t *) malloc(sizeof(uint64_t));  	*index_val = current_index;  	g_hash_table_insert(ser->ref_table, node, index_val); @@ -586,9 +586,9 @@ static void serialize_plist(GNode * node, gpointer data)  	return;  } -static gboolean free_index (gpointer key, gpointer value, gpointer user_data) +static gboolean free_index(gpointer key, gpointer value, gpointer user_data)  { -	free((uint64_t*)value); +	free((uint64_t *) value);  	return TRUE;  } @@ -618,7 +618,7 @@ static void write_real(GByteArray * bplist, double val)  static void write_date(GByteArray * bplist, double val)  { -	uint64_t size = 8;	//dates always use 8 bytes +	uint64_t size = 8;			//dates always use 8 bytes  	uint8_t *buff = (uint8_t *) malloc(sizeof(uint8_t) + size);  	buff[0] = BPLIST_DATE | Log2(size);  	memcpy(buff + 1, &val, size); @@ -651,7 +651,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, (uint8_t*) 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) @@ -672,7 +672,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 = *(uint64_t*)(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);  	} @@ -787,7 +787,7 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length)  			write_dict(bplist_buff, g_ptr_array_index(objects, i), ref_table, dict_param_size);  			break;  		case PLIST_DATE: -			write_date(bplist_buff, data->timeval.tv_sec + (double)data->timeval.tv_usec / G_USEC_PER_SEC ); +			write_date(bplist_buff, data->timeval.tv_sec + (double) data->timeval.tv_usec / G_USEC_PER_SEC);  			break;  		default:  			break; @@ -795,7 +795,7 @@ 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); +	g_hash_table_foreach_remove(ref_table, free_index, NULL);  	//write offsets  	offset_size = get_needed_bytes(bplist_buff->len); diff --git a/src/plist.c b/src/plist.c index d737ab8..640bbe5 100644 --- a/src/plist.c +++ b/src/plist.c @@ -74,46 +74,50 @@ plist_t plist_new_array()  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 || (!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_KEY: -		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; -		} +	//only structured types can have children +	plist_type node_type = plist_get_node_type(node); +	if (node_type == PLIST_DICT || node_type == PLIST_ARRAY) { +		//only structured types are allowed to have nulll value +		if (value || (!value && (type == PLIST_DICT || type == PLIST_ARRAY))) { +			//now handle value +			plist_data_t data = plist_new_plist_data(); +			data->type = type; +			data->length = length; -		plist_t subnode = plist_new_node(data); -		if (node) -			g_node_append(node, subnode); -		return subnode; -	} else -		return NULL; +			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_KEY: +			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; +			} + +			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) @@ -243,3 +247,94 @@ uint64_t plist_get_node_uint_val(plist_t node)  	else  		return 0;  } + +void plist_add_sub_node(plist_t node, plist_t subnode) +{ +	if (node && subnode) { +		plist_type type = plist_get_node_type(node); +		if (type == PLIST_DICT || type == PLIST_ARRAY) +			g_node_append(node, subnode); +	} +} + +void plist_add_sub_key_el(plist_t node, char *val) +{ +	plist_add_sub_element(node, PLIST_KEY, val, strlen(val)); +} + +void plist_add_sub_string_el(plist_t node, char *val) +{ +	plist_add_sub_element(node, PLIST_STRING, val, strlen(val)); +} + +void plist_add_sub_bool_el(plist_t node, uint8_t val) +{ +	plist_add_sub_element(node, PLIST_BOOLEAN, &val, sizeof(uint8_t)); +} + +void plist_add_sub_uint_el(plist_t node, uint64_t val) +{ +	plist_add_sub_element(node, PLIST_UINT, &val, sizeof(uint64_t)); +} + +void plist_add_sub_real_el(plist_t node, double val) +{ +	plist_add_sub_element(node, PLIST_REAL, &val, sizeof(double)); +} + +void plist_add_sub_data_el(plist_t node, char *val, uint64_t length) +{ +	plist_add_sub_element(node, PLIST_DATA, val, length); +} + +void plist_get_key_val(plist_t node, char **val) +{ +	plist_type type = plist_get_node_type(node); +	uint64_t length = 0; +	if (PLIST_KEY == type) +		plist_get_type_and_value(node, &type, (void *) val, &length); +	assert(length == strlen(*val)); +} + +void plist_get_string_val(plist_t node, char **val) +{ +	plist_type type = plist_get_node_type(node); +	uint64_t length = 0; +	if (PLIST_STRING == type) +		plist_get_type_and_value(node, &type, (void *) val, &length); +	assert(length == strlen(*val)); +} + +void plist_get_bool_val(plist_t node, uint8_t * val) +{ +	plist_type type = plist_get_node_type(node); +	uint64_t length = 0; +	if (PLIST_BOOLEAN == type) +		plist_get_type_and_value(node, &type, (void *) val, &length); +	assert(length == sizeof(uint8_t)); +} + +void plist_get_uint_val(plist_t node, uint64_t * val) +{ +	plist_type type = plist_get_node_type(node); +	uint64_t length = 0; +	if (PLIST_UINT == type) +		plist_get_type_and_value(node, &type, (void *) val, &length); +	assert(length == sizeof(uint64_t)); +} + +void plist_get_real_val(plist_t node, double *val) +{ +	plist_type type = plist_get_node_type(node); +	uint64_t length = 0; +	if (PLIST_REAL == type) +		plist_get_type_and_value(node, &type, (void *) val, &length); +	assert(length == sizeof(double)); +} + +void plist_get_data_val(plist_t node, char **val, uint64_t * length) +{ +	plist_type type = plist_get_node_type(node); +	if (PLIST_UINT == type) +		plist_get_type_and_value(node, &type, (void *) val, length); +} diff --git a/src/plist.h b/src/plist.h index bd12e3a..449a3f7 100644 --- a/src/plist.h +++ b/src/plist.h @@ -56,7 +56,6 @@ plist_t plist_new_node(plist_data_t data);  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); -plist_type plist_get_node_type(plist_t node);  uint64_t plist_get_node_uint_val(plist_t node); diff --git a/src/xplist.c b/src/xplist.c index 3a019a9..e0d3768 100644 --- a/src/xplist.c +++ b/src/xplist.c @@ -256,7 +256,7 @@ static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)  		}  		if (!xmlStrcmp(node->name, XPLIST_INT)) { -			char *strval = (char*)xmlNodeGetContent(node); +			char *strval = (char *) xmlNodeGetContent(node);  			data->intval = g_ascii_strtoull(strval, NULL, 0);  			data->type = PLIST_UINT;  			data->length = 8; @@ -264,7 +264,7 @@ static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)  		}  		if (!xmlStrcmp(node->name, XPLIST_REAL)) { -			char *strval = (char*)xmlNodeGetContent(node); +			char *strval = (char *) xmlNodeGetContent(node);  			data->realval = atof(strval);  			data->type = PLIST_REAL;  			data->length = 8; @@ -272,21 +272,21 @@ static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)  		}  		if (!xmlStrcmp(node->name, XPLIST_DATE)) { -			g_time_val_from_iso8601((char*)xmlNodeGetContent(node), &data->timeval); +			g_time_val_from_iso8601((char *) xmlNodeGetContent(node), &data->timeval);  			data->type = PLIST_DATE;  			data->length = sizeof(GTimeVal);  			continue;			//TODO : handle date tag  		}  		if (!xmlStrcmp(node->name, XPLIST_STRING)) { -			data->strval = strdup( (char*) xmlNodeGetContent(node)); +			data->strval = strdup((char *) xmlNodeGetContent(node));  			data->type = PLIST_STRING;  			data->length = strlen(data->strval);  			continue;  		}  		if (!xmlStrcmp(node->name, XPLIST_KEY)) { -			data->strval = strdup( (char*) xmlNodeGetContent(node)); +			data->strval = strdup((char *) xmlNodeGetContent(node));  			data->type = PLIST_KEY;  			data->length = strlen(data->strval);  			continue; @@ -294,7 +294,7 @@ static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)  		if (!xmlStrcmp(node->name, XPLIST_DATA)) {  			gsize size = 0; -			data->buff = g_base64_decode((char*)xmlNodeGetContent(node), &size); +			data->buff = g_base64_decode((char *) xmlNodeGetContent(node), &size);  			data->length = size;  			data->type = PLIST_DATA;  			continue; @@ -326,7 +326,7 @@ void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length)  	int size = 0;  	xmlDocDumpMemory(plist_doc, (xmlChar **) plist_xml, &size); -	if (size >=0 ) +	if (size >= 0)  		*length = size;  	free_plist(plist_doc);  } | 
