xmllite: Shrink buffer when enough data processed
Nikolay Sivov
nsivov at codeweavers.com
Fri Dec 21 05:40:19 CST 2012
Shrink buffer when enough data processed
-------------- next part --------------
>From 7e2b67610748d9e846986bbe9eeb16bbeafc9ffe Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri, 21 Dec 2012 09:35:30 +0400
Subject: [PATCH 1/1] 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 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)
--
1.7.10.4
More information about the wine-patches
mailing list