diff options
author | Nikias Bassen | 2018-12-17 01:50:11 +0100 |
---|---|---|
committer | Nikias Bassen | 2018-12-17 01:50:11 +0100 |
commit | 92e5c858c246f3a01104f511c23217fd75c272f4 (patch) | |
tree | ca8463112104d2a91fcff2dfebbf3b3bebbdf080 | |
parent | 9c8d7a6c44b0eb22ac77ca6ca5c7c29edd5f685e (diff) | |
download | libplist-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.c | 7 |
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); |