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