Piotr Caban : msxml3: Change ISAXXMLReader_getLine and ISAXXMLReader_getColumn functions.

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


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

Author: Piotr Caban <piotr.caban at 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;




More information about the wine-cvs mailing list