]> git.mxchange.org Git - flightgear.git/commitdiff
Skip one recursive function call for leaf nodes at the cost of a bit of code size...
authorehofman <ehofman>
Fri, 8 May 2009 09:10:56 +0000 (09:10 +0000)
committerTim Moore <timoore@redhat.com>
Mon, 18 May 2009 10:24:16 +0000 (12:24 +0200)
utils/xmlgrep/sample.xml
utils/xmlgrep/testxml.c
utils/xmlgrep/xml.c

index 7fec2d03eaa034e0c06cb09d3a29c398d9aab8c7..e22060cebb317de0a517acc20a6b50fa48376e62 100644 (file)
@@ -60,7 +60,7 @@
   <YF23>
    <script><![CDATA[
     # If the ground-roll-heading-hold has been reset (<-999) set:
-    if(agl > 50) {
+    if(agl > 50) {};
    ]]></script>
   </YF23>
  </nasal>
index dd22d457ed8ae436df9dd43ea239ae6fc4a9a659..42fd5d3bf1a63227b5a4dfc29a093dff77300cc3 100644 (file)
@@ -14,28 +14,41 @@ int main()
    if (root_id)
    {
       void *path_id, *node_id;
+      char *s;
 
-      path_id = xmlNodeGet(root_id, PATH);
-      node_id = xmlNodeGet(root_id, ROOTNODE);
-
-      if (path_id && node_id)
+      printf("\nTesting xmlNodeGetString for /Configuration/output/test:\t\t");
+      s = xmlNodeGetString(root_id , "/Configuration/output/test");
+      if (s)
       {
-         char buf[BUFLEN];
-         size_t len;
-         char *s;
-     
-         len = xmlNodeCopyString(root_id, PATH, buf, BUFLEN);
-         printf("%s = '%s'\n", PATH, buf);
+         printf("failed.\n\t'%s' should be empty\n", s);
+         free(s);
+      }
+      else
+         printf("succes.\n");
 
-         printf("Testing value of /Configuration/output/test:\t\t\t\t");
-         s = xmlNodeGetString(root_id , "/Configuration/output/test");
+      printf("Testing xmlGetString for Configuration/output/test:\t\t\t");
+      path_id = xmlNodeGet(root_id, "*/*/test");
+      if (path_id)
+      {
+         s = xmlGetString(path_id);
          if (s)
          {
-            printf("failed.\n\t'%s' shoudl be empty\n", s);
+            printf("failed.\n\t'%s' should be empty\n", s);
             free(s);
          }
          else
             printf("succes.\n");
+      }
+
+      path_id = xmlNodeGet(root_id, PATH);
+      node_id = xmlNodeGet(root_id, ROOTNODE);
+
+      if (path_id && node_id)
+      {
+         char buf[BUFLEN];
+         size_t len;
+        
+         xmlCopyString(path_id, buf, BUFLEN);
 
          printf("Testing xmlNodeCopyString against xmlGetString:\t\t\t\t");
          if ((s = xmlGetString(path_id)) != 0)
@@ -150,6 +163,7 @@ int main()
 
       xmlClose(root_id);
    }
+   printf("\n");
 
    return 0;
 }
index 9ee3ff6ac03ad5b45a583d8af4245560c6f769b9..16df5f977e696b00a861edfb4e17ae1f57b66eaf 100644 (file)
@@ -1511,6 +1511,38 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t *
             cur = new;
         }
 
+        if (*cur == '/')               /* closing tag of leaf node found */
+        {
+            if (!strncasecmp(new+1, element, elementlen))
+            {
+                if (*(new+elementlen+1) != '>')
+                    SET_ERROR_AND_RETURN(new+1, XML_ELEMENT_NO_CLOSING_TAG);
+
+                if (found == num)
+                {
+                    if (start_tag)
+                    {
+                        *len = new-ret-1;
+                        open_element = start_tag;
+                        cdata = (char *)start;
+                        start_tag = 0;
+                    }
+                    else /* report error */
+                        SET_ERROR_AND_RETURN(new, XML_ELEMENT_NO_OPENING_TAG);
+                }
+                found++;
+            }
+
+            new = memchr(cur, '>', restlen);
+            if (!new)
+                SET_ERROR_AND_RETURN(cur, XML_ELEMENT_NO_CLOSING_TAG);
+
+            restlen -= new-cur;
+            cur = new;
+            continue;
+        }
+
+        /* no leaf node, continue */
         if (*cur != '/')                       /* cascading tag found */
         {
             char *node = "*";
@@ -1617,8 +1649,8 @@ __xmlProcessCDATA(char **start, size_t *len)
         new = __xmlCommentSkip(cur, restlen);
         if (new)
         {
-            *start += 3;                               /* !-- */
-            *len = (*start-cur)-3;                     /* --> */
+            *start = new;
+            *len = 0;
         }
         return new;
     }
@@ -1640,7 +1672,7 @@ __xmlProcessCDATA(char **start, size_t *len)
             {
                 if ((restlen > 3) && (memcmp(new, "]]>", 3) == 0))
                 {
-                    *len = new - *start;
+                    *len = new-1 - *start;
                     restlen -= 3;
                     new += 3;
                     break;
@@ -1678,14 +1710,15 @@ __xmlCommentSkip(const char *start, size_t len)
             new = memchr(cur, '-', len);
             if (new)
             {
-                len -= new - cur;
+                len -= new-cur;
                 if ((len >= 3) && (memcmp(new, "-->", 3) == 0))
                 {
                     new += 3;
-                    len -= 3;
+                    /* len -= 3; */
                     break;
                 }
                 cur = new+1;
+                len -= cur-new;
             }
             else break;
         }
@@ -1737,11 +1770,10 @@ __xmlPrepareData(char **start, size_t *blocklen)
         size_t blocklen = len-1;
         if (blocklen >= 6)                  /* !-- --> */
         {
-            char *new = __xmlProcessCDATA(&start, &blocklen);
+            char *new = __xmlProcessCDATA(&start, &len);
             if (new)
             {
                 ps = start;
-                len = blocklen;
                 pe = ps + len;
 
                 while ((ps<pe) && isspace(*ps)) ps++;