]> granicus.if.org Git - libexpat/commitdiff
Improved fix for issues # 1515266 and # 1515600. Will now preserve the
authorKarl Waclawek <kwaclaw@users.sourceforge.net>
Mon, 10 Jul 2006 18:59:52 +0000 (18:59 +0000)
committerKarl Waclawek <kwaclaw@users.sourceforge.net>
Mon, 10 Jul 2006 18:59:52 +0000 (18:59 +0000)
"failover to default handler" logic. Note: clearing the character data handler
does not take effect immediately anymore.

expat/doc/reference.html
expat/lib/xmlparse.c

index e2ced9ad4399a1fbf2a841e439e0dd78f5b2ddd0..d3eff83aed7f518c4e132922c65cbf1c35d70bcc 100644 (file)
@@ -1290,7 +1290,10 @@ is <em>NOT nul-terminated</em>. You have to use the length argument
 to deal with the end of the string. A single block of contiguous text
 free of markup may still result in a sequence of calls to this handler.
 In other words, if you're searching for a pattern in the text, it may
-be split across calls to this handler.</p>
+be split across calls to this handler. Note: Setting this handler to NULL
+may <em>NOT immediately</em> terminate call-backs if the parser is currently
+processing such a single block of contiguous markup-free text, as the parser
+will continue calling back until the end of the block is reached.</p>
 </div>
 
 <div class="handler">
index faa841fa95ce25490fea5c10b41a3b46141489e8..db9c1744961ff022503f175f07d4aa9a06c6a797 100644 (file)
@@ -2544,29 +2544,30 @@ doContent(XML_Parser parser,
       }
       *nextPtr = end;
       return XML_ERROR_NONE;
-    case XML_TOK_DATA_CHARS:
-      if (MUST_CONVERT(enc, s)) {
-        for (;;) {
-          if (characterDataHandler) {
-            ICHAR *dataPtr = (ICHAR *)dataBuf;
-            XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
-            *eventEndPP = s;
-            characterDataHandler(handlerArg, dataBuf,
-                                 (int)(dataPtr - (ICHAR *)dataBuf));
-            if (s == next)
-              break;
-            *eventPP = s;
+    case XML_TOK_DATA_CHARS: 
+      {
+        XML_CharacterDataHandler charDataHandler = characterDataHandler;
+        if (charDataHandler) {
+          if (MUST_CONVERT(enc, s)) {
+            for (;;) {
+              ICHAR *dataPtr = (ICHAR *)dataBuf;
+              XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
+              *eventEndPP = s;
+              charDataHandler(handlerArg, dataBuf,
+                              (int)(dataPtr - (ICHAR *)dataBuf));
+              if (s == next)
+                break;
+              *eventPP = s;
+            }
           }
           else
-            break;
+            charDataHandler(handlerArg,
+                            (XML_Char *)s,
+                            (int)((XML_Char *)next - (XML_Char *)s));
         }
+        else if (defaultHandler)
+          reportDefault(parser, enc, s, next);
       }
-      else if (characterDataHandler)
-        characterDataHandler(handlerArg,
-                             (XML_Char *)s,
-                             (int)((XML_Char *)next - (XML_Char *)s));
-      else if (defaultHandler)
-        reportDefault(parser, enc, s, next);
       break;
     case XML_TOK_PI:
       if (!reportProcessingInstruction(parser, enc, s, next))
@@ -3127,28 +3128,29 @@ doCdataSection(XML_Parser parser,
         reportDefault(parser, enc, s, next);
       break;
     case XML_TOK_DATA_CHARS:
-      if (MUST_CONVERT(enc, s)) {
-        for (;;) {
-          if (characterDataHandler) {
-            ICHAR *dataPtr = (ICHAR *)dataBuf;
-            XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
-            *eventEndPP = next;
-            characterDataHandler(handlerArg, dataBuf,
-                                 (int)(dataPtr - (ICHAR *)dataBuf));
-            if (s == next)
-              break;
-            *eventPP = s;
+      {
+        XML_CharacterDataHandler charDataHandler = characterDataHandler;
+        if (charDataHandler) {
+          if (MUST_CONVERT(enc, s)) {
+            for (;;) {
+              ICHAR *dataPtr = (ICHAR *)dataBuf;
+              XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
+              *eventEndPP = next;
+              charDataHandler(handlerArg, dataBuf,
+                              (int)(dataPtr - (ICHAR *)dataBuf));
+              if (s == next)
+                break;
+              *eventPP = s;
+            }
           }
           else
-            break;
+            charDataHandler(handlerArg,
+                            (XML_Char *)s,
+                            (int)((XML_Char *)next - (XML_Char *)s));
         }
+        else if (defaultHandler)
+          reportDefault(parser, enc, s, next);
       }
-      else if (characterDataHandler)
-        characterDataHandler(handlerArg,
-                             (XML_Char *)s,
-                             (int)((XML_Char *)next - (XML_Char *)s));
-      else if (defaultHandler)
-        reportDefault(parser, enc, s, next);
       break;
     case XML_TOK_INVALID:
       *eventPP = next;