From beffac006ce867c51da145ec28648432eaa9fb66 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Fri, 21 Dec 2012 09:35:30 +0400 Subject: [PATCH] xmllite: Shrink buffer when enough data processed. --- dlls/xmllite/reader.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c index 9e32216ca62..38c7a5ec4dd 100644 --- a/dlls/xmllite/reader.c +++ b/dlls/xmllite/reader.c @@ -481,6 +481,7 @@ static void readerinput_switchencoding(xmlreaderinput *readerinput, xml_encoding { readerinput_grow(readerinput, len); memcpy(dest->data, src->cur, len); + dest->written += len*sizeof(WCHAR); readerinput->buffer->code_page = cp; return; } @@ -491,6 +492,22 @@ static void readerinput_switchencoding(xmlreaderinput *readerinput, xml_encoding MultiByteToWideChar(cp, 0, src->cur, len, ptr, dest_len); ptr[dest_len] = 0; readerinput->buffer->code_page = cp; + dest->written += dest_len*sizeof(WCHAR); +} + +/* shrinks parsed data a buffer begins with */ +static void reader_shrink(xmlreader *reader) +{ + encoded_buffer *buffer = &reader->input->buffer->utf16; + + /* avoid to move too often using threshold shrink length */ + if (buffer->cur - buffer->data > buffer->written / 2) + { + buffer->written -= buffer->cur - buffer->data; + memmove(buffer->data, buffer->cur, buffer->written); + buffer->cur = buffer->data; + *(WCHAR*)&buffer->cur[buffer->written] = 0; + } } static inline const WCHAR *reader_get_cur(xmlreader *reader) @@ -772,6 +789,7 @@ static HRESULT reader_parse_comment(xmlreader *reader) /* skip '