summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2017-01-28 04:47:40 +0100
committerGravatar Nikias Bassen2017-01-28 04:47:40 +0100
commit3131bdd3210b9fa2bfee66c63ce1144bea159823 (patch)
tree07770e4e64229f8c1b63b27f50f4f8ba6788852e /src
parentb937059c4dfb1f966cd835d456e91a625d27cf49 (diff)
downloadlibplist-3131bdd3210b9fa2bfee66c63ce1144bea159823.tar.gz
libplist-3131bdd3210b9fa2bfee66c63ce1144bea159823.tar.bz2
bplist: Improve writing of data, string, and unicode nodes
Diffstat (limited to 'src')
-rw-r--r--src/bplist.c25
1 files changed, 7 insertions, 18 deletions
diff --git a/src/bplist.c b/src/bplist.c
index 94b0793..f1bfcc0 100644
--- a/src/bplist.c
+++ b/src/bplist.c
@@ -884,22 +884,13 @@ static void write_date(bytearray_t * bplist, double val)
884 884
885static void write_raw_data(bytearray_t * bplist, uint8_t mark, uint8_t * val, uint64_t size) 885static void write_raw_data(bytearray_t * bplist, uint8_t mark, uint8_t * val, uint64_t size)
886{ 886{
887 uint8_t *buff = NULL;
888 uint8_t marker = mark | (size < 15 ? size : 0xf); 887 uint8_t marker = mark | (size < 15 ? size : 0xf);
889 byte_array_append(bplist, &marker, sizeof(uint8_t)); 888 byte_array_append(bplist, &marker, sizeof(uint8_t));
890 if (size >= 15) 889 if (size >= 15) {
891 { 890 write_int(bplist, size);
892 bytearray_t *int_buff = byte_array_new();
893 write_int(int_buff, size);
894 byte_array_append(bplist, int_buff->data, int_buff->len);
895 byte_array_free(int_buff);
896 } 891 }
897 //stupid unicode buffer length 892 if (BPLIST_UNICODE==mark) size <<= 1;
898 if (BPLIST_UNICODE==mark) size *= 2; 893 byte_array_append(bplist, val, size);
899 buff = (uint8_t *) malloc(size);
900 memcpy(buff, val, size);
901 byte_array_append(bplist, buff, size);
902 free(buff);
903} 894}
904 895
905static void write_data(bytearray_t * bplist, uint8_t * val, uint64_t size) 896static void write_data(bytearray_t * bplist, uint8_t * val, uint64_t size)
@@ -916,12 +907,10 @@ static void write_string(bytearray_t * bplist, char *val)
916static void write_unicode(bytearray_t * bplist, uint16_t * val, uint64_t size) 907static void write_unicode(bytearray_t * bplist, uint16_t * val, uint64_t size)
917{ 908{
918 uint64_t i = 0; 909 uint64_t i = 0;
919 uint64_t size2 = size * sizeof(uint16_t); 910 uint16_t *buff = (uint16_t*)malloc(size << 1);
920 uint8_t *buff = (uint8_t *) malloc(size2);
921 memcpy(buff, val, size2);
922 for (i = 0; i < size; i++) 911 for (i = 0; i < size; i++)
923 byte_convert(buff + i * sizeof(uint16_t), sizeof(uint16_t)); 912 buff[i] = be16toh(val[i]);
924 write_raw_data(bplist, BPLIST_UNICODE, buff, size); 913 write_raw_data(bplist, BPLIST_UNICODE, (uint8_t*)buff, size);
925 free(buff); 914 free(buff);
926} 915}
927 916