summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2018-12-17 01:50:11 +0100
committerGravatar Nikias Bassen2018-12-17 01:50:11 +0100
commit92e5c858c246f3a01104f511c23217fd75c272f4 (patch)
treeca8463112104d2a91fcff2dfebbf3b3bebbdf080
parent9c8d7a6c44b0eb22ac77ca6ca5c7c29edd5f685e (diff)
downloadlibplist-92e5c858c246f3a01104f511c23217fd75c272f4.tar.gz
libplist-92e5c858c246f3a01104f511c23217fd75c272f4.tar.bz2
xplist: Write base64 directly to output buffer to improve memory usage
Now that we grow the output buffer enough before writing XML output we can just write the base64 encoded data directly to the ouput buffer instead of using a heap buffer that will then be copied to the output buffer. This makes writing XML output more memory efficient (and slightly faster).
-rw-r--r--src/xplist.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/src/xplist.c b/src/xplist.c
index 2eeccf9..c89b143 100644
--- a/src/xplist.c
+++ b/src/xplist.c
@@ -290,12 +290,10 @@ static void node_to_xml(node_t* node, bytearray_t **outbuf, uint32_t depth)
tagOpen = TRUE;
str_buf_append(*outbuf, "\n", 1);
if (node_data->length > 0) {
- char *buf = malloc(80);
uint32_t j = 0;
uint32_t indent = (depth > 8) ? 8 : depth;
uint32_t maxread = MAX_DATA_BYTES_PER_LINE(indent);
size_t count = 0;
- size_t b64count = 0;
size_t amount = (node_data->length / 3 * 4) + 4 + (((node_data->length / maxread) + 1) * (indent+1));
if ((*outbuf)->len + amount > (*outbuf)->capacity) {
str_buf_grow(*outbuf, amount);
@@ -305,12 +303,11 @@ static void node_to_xml(node_t* node, bytearray_t **outbuf, uint32_t depth)
str_buf_append(*outbuf, "\t", 1);
}
count = (node_data->length-j < maxread) ? node_data->length-j : maxread;
- b64count = base64encode(buf, node_data->buff + j, count);
- str_buf_append(*outbuf, buf, b64count);
+ assert((*outbuf)->len + count < (*outbuf)->capacity);
+ (*outbuf)->len += base64encode((char*)(*outbuf)->data + (*outbuf)->len, node_data->buff + j, count);
str_buf_append(*outbuf, "\n", 1);
j+=count;
}
- free(buf);
}
for (i = 0; i < depth; i++) {
str_buf_append(*outbuf, "\t", 1);