Piotr Caban : msxml3: Change ISAXXMLReader_characters implementation so it works correctly on files with '\r' characters.

Alexandre Julliard julliard at winehq.org
Thu Jul 24 06:59:54 CDT 2008


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

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Wed Jul 23 16:39:12 2008 +0200

msxml3: Change ISAXXMLReader_characters implementation so it works correctly on files with '\r' characters.

---

 dlls/msxml3/saxreader.c |   62 +++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 55 insertions(+), 7 deletions(-)

diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 2c0873f..ef3c7e8 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -254,24 +254,72 @@ static void libxmlCharacters(
     saxlocator *This = ctx;
     HRESULT hr;
     xmlChar *end;
+    xmlChar *lastCurCopy;
+    xmlChar *chEnd;
+    int columnCopy;
+    int lineCopy;
+
+    if(*(This->lastCur-1) != '>' && *(This->lastCur-1) != '/') return;
 
     if(*(This->lastCur-1) != '>')
     {
         end = (xmlChar*)This->pParserCtxt->input->cur-len;
+        while(*(end-1) != '>') end--;
         update_position(This, end);
     }
 
+    chEnd = This->lastCur+len;
+    while(*chEnd != '<') chEnd++;
+
+    Chars = bstr_from_xmlChar(ch);
+
+    lastCurCopy = This->lastCur;
+    columnCopy = This->column;
+    lineCopy = This->line;
+    end = This->lastCur;
+
     if(This->saxreader->contentHandler)
     {
-        Chars = bstr_from_xmlChar(ch);
-        hr = ISAXContentHandler_characters(This->saxreader->contentHandler, Chars, len);
-        SysFreeString(Chars);
+        while(This->lastCur < chEnd)
+        {
+            end = This->lastCur;
+            while(end < chEnd-1)
+            {
+                if(*end == '\r') break;
+                end++;
+            }
 
-        if(hr != S_OK)
-            format_error_message_from_id(This, hr);
-    }
+            Chars = bstr_from_xmlChar(This->lastCur);
 
-    update_position(This, NULL);
+            if(*end == '\r' && *(end+1) == '\n')
+            {
+                memmove((WCHAR*)Chars+(end-This->lastCur),
+                        (WCHAR*)Chars+(end-This->lastCur)+1,
+                        (SysStringLen(Chars)-(end-This->lastCur))*sizeof(WCHAR));
+                SysReAllocStringLen(&Chars, Chars, SysStringLen(Chars)-1);
+            }
+            else if(*end == '\r') Chars[end-This->lastCur] = '\n';
+
+            hr = ISAXContentHandler_characters(This->saxreader->contentHandler, Chars, end-This->lastCur+1);
+            SysFreeString(Chars);
+            if(hr != S_OK)
+            {
+                format_error_message_from_id(This, hr);
+                return;
+            }
+
+            if(*(end+1) == '\n') end++;
+            if(end < chEnd) end++;
+
+            This->column += end-This->lastCur;
+            This->lastCur = end;
+        }
+
+        This->lastCur = lastCurCopy;
+        This->column = columnCopy;
+        This->line = lineCopy;
+        update_position(This, chEnd);
+    }
 }
 
 static void libxmlSetDocumentLocator(




More information about the wine-cvs mailing list