Nikolay Sivov : xmllite: Shrink buffer when enough data processed.

Alexandre Julliard julliard at winehq.org
Wed Dec 26 14:05:17 CST 2012


Module: wine
Branch: master
Commit: beffac006ce867c51da145ec28648432eaa9fb66
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=beffac006ce867c51da145ec28648432eaa9fb66

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Dec 21 09:35:30 2012 +0400

xmllite: Shrink buffer when enough data processed.

---

 dlls/xmllite/reader.c |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 9e32216..38c7a5e 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 '<!--' */
     reader_skipn(reader, 4);
+    reader_shrink(reader);
     ptr = start = reader_get_cur(reader);
 
     while (*ptr)




More information about the wine-cvs mailing list