Module: wine Branch: master Commit: bb849dc9c39b2f3647e957cb2951fbb5d2a8b6bb URL: http://source.winehq.org/git/wine.git/?a=commit;h=bb849dc9c39b2f3647e957cb29...
Author: Piotr Caban piotr.caban@gmail.com Date: Wed Jul 23 16:39:04 2008 +0200
msxml3: Change ISAXXMLReader_getLine and ISAXXMLReader_getColumn functions.
---
dlls/msxml3/saxreader.c | 84 +++++++++++++++++++++++++++++------------------ 1 files changed, 52 insertions(+), 32 deletions(-)
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 9ea2aa2..2c0873f 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -64,8 +64,9 @@ typedef struct _saxlocator xmlParserCtxtPtr pParserCtxt; WCHAR *publicId; WCHAR *systemId; - int lastLine; - int lastColumn; + xmlChar *lastCur; + int line; + int column; } saxlocator;
static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface ) @@ -83,6 +84,7 @@ static inline saxlocator *impl_from_ISAXLocator( ISAXLocator *iface ) return (saxlocator *)((char*)iface - FIELD_OFFSET(saxlocator, lpSAXLocatorVtbl)); }
+ static void format_error_message_from_id(saxlocator *This, HRESULT hr) { xmlStopParser(This->pParserCtxt); @@ -103,6 +105,35 @@ static void format_error_message_from_id(saxlocator *This, HRESULT hr) } }
+static void update_position(saxlocator *This, xmlChar *end) +{ + if(This->lastCur == NULL) + { + This->lastCur = (xmlChar*)This->pParserCtxt->input->base; + This->line = 1; + This->column = 1; + } + + if(!end) end = (xmlChar*)This->pParserCtxt->input->cur; + + while(This->lastCur < end) + { + if(*(This->lastCur) == '\n') + { + This->line++; + This->column = 1; + } + else if(*(This->lastCur) == '\r' && (This->lastCur==This->pParserCtxt->input->end || *(This->lastCur+1)!='\n')) + { + This->line++; + This->column = 1; + } + else This->column++; + + This->lastCur++; + } +} + /*** LibXML callbacks ***/ static void libxmlStartDocument(void *ctx) { @@ -116,8 +147,7 @@ static void libxmlStartDocument(void *ctx) format_error_message_from_id(This, hr); }
- This->lastColumn = xmlSAX2GetColumnNumber(This->pParserCtxt); - This->lastLine = xmlSAX2GetLineNumber(This->pParserCtxt); + update_position(This, NULL); }
static void libxmlEndDocument(void *ctx) @@ -125,8 +155,8 @@ static void libxmlEndDocument(void *ctx) saxlocator *This = ctx; HRESULT hr;
- This->lastColumn = 0; - This->lastLine = 0; + This->column = 0; + This->line = 0;
if(This->ret != S_OK) return;
@@ -155,8 +185,7 @@ static void libxmlStartElementNS(
FIXME("Arguments processing not yet implemented.\n");
- This->lastColumn = xmlSAX2GetColumnNumber(This->pParserCtxt)+1; - This->lastLine = xmlSAX2GetLineNumber(This->pParserCtxt); + update_position(This, (xmlChar*)This->pParserCtxt->input->cur+1);
if(This->saxreader->contentHandler) { @@ -189,9 +218,11 @@ static void libxmlEndElementNS( BSTR NamespaceUri, LocalName, QName; saxlocator *This = ctx; HRESULT hr; + xmlChar *end;
- This->lastColumn = xmlSAX2GetColumnNumber(This->pParserCtxt); - This->lastLine = xmlSAX2GetLineNumber(This->pParserCtxt); + end = This->lastCur; + while(*end != '<' && *(end+1) != '/') end++; + update_position(This, end+2);
if(This->saxreader->contentHandler) { @@ -221,28 +252,14 @@ static void libxmlCharacters( { BSTR Chars; saxlocator *This = ctx; - const xmlChar *cur; - int pos; HRESULT hr; + xmlChar *end;
- This->lastColumn = 1; - This->lastLine = xmlSAX2GetLineNumber(This->pParserCtxt); - - cur = This->pParserCtxt->input->cur; - if(*cur != '<') + if(*(This->lastCur-1) != '>') { - for(pos=0; pos<len; pos++) - if(*(cur+pos) == '\n') This->lastLine--; - cur--; + end = (xmlChar*)This->pParserCtxt->input->cur-len; + update_position(This, end); } - else - { - for(pos=0; pos<len; pos++) - if(*(cur-pos-1) == '\n') This->lastLine--; - cur = cur-len-1; - } - for(; *cur!='\n' && cur!=This->pParserCtxt->input->base; cur--) - This->lastColumn++;
if(This->saxreader->contentHandler) { @@ -253,6 +270,8 @@ static void libxmlCharacters( if(hr != S_OK) format_error_message_from_id(This, hr); } + + update_position(This, NULL); }
static void libxmlSetDocumentLocator( @@ -366,7 +385,7 @@ static HRESULT WINAPI isaxlocator_getColumnNumber( { saxlocator *This = impl_from_ISAXLocator( iface );
- *pnColumn = This->lastColumn; + *pnColumn = This->column; return S_OK; }
@@ -376,7 +395,7 @@ static HRESULT WINAPI isaxlocator_getLineNumber( { saxlocator *This = impl_from_ISAXLocator( iface );
- *pnLine = This->lastLine; + *pnLine = This->line; return S_OK; }
@@ -452,8 +471,9 @@ static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator) locator->pParserCtxt = NULL; locator->publicId = NULL; locator->systemId = NULL; - locator->lastLine = 0; - locator->lastColumn = 0; + locator->lastCur = NULL; + locator->line = 0; + locator->column = 0; locator->ret = S_OK;
*ppsaxlocator = locator;