summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2017-01-28 04:54:24 +0100
committerGravatar Nikias Bassen2017-01-28 04:54:24 +0100
commit369d72bb954d0112c47af341ffff15d84228d3bb (patch)
tree159e6e62199cdf7d9f40f30dafdd61c1f7d3d40d
parent3131bdd3210b9fa2bfee66c63ce1144bea159823 (diff)
downloadlibplist-369d72bb954d0112c47af341ffff15d84228d3bb.tar.gz
libplist-369d72bb954d0112c47af341ffff15d84228d3bb.tar.bz2
bplist: Improve writing of array and dictionary nodes
-rw-r--r--src/bplist.c71
1 files changed, 17 insertions, 54 deletions
diff --git a/src/bplist.c b/src/bplist.c
index f1bfcc0..2121ef9 100644
--- a/src/bplist.c
+++ b/src/bplist.c
@@ -916,83 +916,46 @@ static void write_unicode(bytearray_t * bplist, uint16_t * val, uint64_t size)
static void write_array(bytearray_t * bplist, node_t* node, hashtable_t* ref_table, uint8_t ref_size)
{
- uint64_t idx = 0;
- uint8_t *buff = NULL;
-
node_t* cur = NULL;
uint64_t i = 0;
uint64_t size = node_n_children(node);
uint8_t marker = BPLIST_ARRAY | (size < 15 ? size : 0xf);
byte_array_append(bplist, &marker, sizeof(uint8_t));
- if (size >= 15)
- {
- bytearray_t *int_buff = byte_array_new();
- write_int(int_buff, size);
- byte_array_append(bplist, int_buff->data, int_buff->len);
- byte_array_free(int_buff);
+ if (size >= 15) {
+ write_int(bplist, size);
}
- buff = (uint8_t *) malloc(size * ref_size);
-
- for (i = 0, cur = node_first_child(node); cur && i < size; cur = node_next_sibling(cur), i++)
- {
- idx = *(uint64_t *) (hash_table_lookup(ref_table, cur));
-#ifdef __BIG_ENDIAN__
- idx = idx << ((sizeof(uint64_t) - ref_size) * 8);
-#endif
- memcpy(buff + i * ref_size, &idx, ref_size);
- byte_convert(buff + i * ref_size, ref_size);
+ for (i = 0, cur = node_first_child(node); cur && i < size; cur = node_next_sibling(cur), i++) {
+ uint64_t idx = *(uint64_t *) (hash_table_lookup(ref_table, cur));
+ idx = be64toh(idx);
+ byte_array_append(bplist, (uint8_t*)&idx + (sizeof(uint64_t) - ref_size), ref_size);
}
-
- //now append to bplist
- byte_array_append(bplist, buff, size * ref_size);
- free(buff);
-
}
static void write_dict(bytearray_t * bplist, node_t* node, hashtable_t* ref_table, uint8_t ref_size)
{
- uint64_t idx1 = 0;
- uint64_t idx2 = 0;
- uint8_t *buff = NULL;
-
node_t* cur = NULL;
uint64_t i = 0;
uint64_t size = node_n_children(node) / 2;
uint8_t marker = BPLIST_DICT | (size < 15 ? size : 0xf);
byte_array_append(bplist, &marker, sizeof(uint8_t));
- if (size >= 15)
- {
- bytearray_t *int_buff = byte_array_new();
- write_int(int_buff, size);
- byte_array_append(bplist, int_buff->data, int_buff->len);
- byte_array_free(int_buff);
+ if (size >= 15) {
+ write_int(bplist, size);
}
- buff = (uint8_t *) malloc(size * 2 * ref_size);
- for (i = 0, cur = node_first_child(node); cur && i < size; cur = node_next_sibling(node_next_sibling(cur)), i++)
- {
- idx1 = *(uint64_t *) (hash_table_lookup(ref_table, cur));
-#ifdef __BIG_ENDIAN__
- idx1 = idx1 << ((sizeof(uint64_t) - ref_size) * 8);
-#endif
- memcpy(buff + i * ref_size, &idx1, ref_size);
- byte_convert(buff + i * ref_size, ref_size);
-
- idx2 = *(uint64_t *) (hash_table_lookup(ref_table, cur->next));
-#ifdef __BIG_ENDIAN__
- idx2 = idx2 << ((sizeof(uint64_t) - ref_size) * 8);
-#endif
- memcpy(buff + (i + size) * ref_size, &idx2, ref_size);
- byte_convert(buff + (i + size) * ref_size, ref_size);
+ for (i = 0, cur = node_first_child(node); cur && i < size; cur = node_next_sibling(node_next_sibling(cur)), i++) {
+ uint64_t idx1 = *(uint64_t *) (hash_table_lookup(ref_table, cur));
+ idx1 = be64toh(idx1);
+ byte_array_append(bplist, (uint8_t*)&idx1 + (sizeof(uint64_t) - ref_size), ref_size);
}
- //now append to bplist
- byte_array_append(bplist, buff, size * 2 * ref_size);
- free(buff);
-
+ for (i = 0, cur = node_first_child(node); cur && i < size; cur = node_next_sibling(node_next_sibling(cur)), i++) {
+ uint64_t idx2 = *(uint64_t *) (hash_table_lookup(ref_table, cur->next));
+ idx2 = be64toh(idx2);
+ byte_array_append(bplist, (uint8_t*)&idx2 + (sizeof(uint64_t) - ref_size), ref_size);
+ }
}
static void write_uid(bytearray_t * bplist, uint64_t val)