Rewrite printing function to make it faster. Now also handles
[SXSI/XMLTree.git] / XMLTree.cpp
index fd2c6de..5033877 100644 (file)
@@ -309,12 +309,13 @@ XMLTree *XMLTree::Load(int fd, char *filename, bool load_tc,int sample_factor)
 \r
 \r
 // SubtreeSize(x): the number of nodes (and attributes) in the subtree of node x.\r
-int XMLTree::SubtreeSize(treeNode x) \r
+/*int XMLTree::SubtreeSize(treeNode x) \r
  {\r
     return subtree_size(Par, x);\r
  }\r
-\r
+*/\r
 // SubtreeTags(x,tag): the number of occurrences of tag within the subtree of node x.\r
+/*\r
 int XMLTree::SubtreeTags(treeNode x, TagType tag) \r
  {\r
     if (x == Root())\r
@@ -325,6 +326,7 @@ int XMLTree::SubtreeTags(treeNode x, TagType tag)
  \r
     return (Tags->rank(tag, s) - Tags->rank(tag, node2tagpos(x)-1))+1;\r
  }\r
+*/\r
 int XMLTree::SubtreeElements(treeNode x) \r
  {\r
     \r
@@ -598,7 +600,7 @@ treeNode XMLTree::TaggedDescendant(treeNode x, TagType tag)
    return (fast_is_ancestor(Par,x,y) ? y : NULLT);\r
  }\r
 */\r
-\r
+/*\r
 treeNode XMLTree::SelectDescendant(treeNode x, TagIdSet *tags)\r
  {\r
    NULLT_IF (x ==NULLT || fast_isleaf(Par,x));\r
@@ -616,7 +618,7 @@ treeNode XMLTree::SelectDescendant(treeNode x, TagIdSet *tags)
    return min;\r
  }\r
 \r
-\r
+*/\r
 \r
 // TaggedPrec(x,tag): returns the first node tagged tag with smaller preorder than x and not an\r
 // ancestor of x. Returns NULLT if there is none.\r
@@ -707,7 +709,7 @@ treeNode XMLTree::SelectFollowingBelow(treeNode x, TagIdSet *tags, treeNode ance
    else return NULLT;\r
    \r
  }\r
-\r
+/*\r
 treeNode XMLTree::SelectFollowingBefore(treeNode x, TagIdSet *tags, treeNode ancestor_closing)\r
  {\r
 \r
@@ -738,7 +740,7 @@ treeNode XMLTree::SelectFollowingBefore(treeNode x, TagIdSet *tags, treeNode anc
    else return NULLT;\r
    \r
  }\r
-\r
+*/\r
 /*\r
 treeNode XMLTree::SelectFollowingBefore(treeNode x, TagIdSet *tags, treeNode closing)\r
  {\r
@@ -899,17 +901,9 @@ bool XMLTree::IsOpen(treeNode x) { return fast_inspect(Par,x); }
 \r
 void XMLTree::Print(int fd,treeNode x, bool no_text){\r
   \r
-  int newfd = dup(fd);\r
-  stream = fdopen(newfd,"wa");\r
-  if (stream == 0){\r
-    perror(NULL);\r
-    return;\r
-  };\r
-\r
   if (buffer == 0)\r
     buffer = new string();\r
-\r
-  FILE* fp = stream;\r
+  \r
   treeNode fin = fast_find_close(Par,x);\r
   treeNode n = x;\r
   TagType tag = Tag(n);\r
@@ -920,92 +914,90 @@ void XMLTree::Print(int fd,treeNode x, bool no_text){
   treeNode first_att =  NULLT;\r
   \r
   if (first_att  == NULLT)\r
-  first_idx = first_text;\r
+    first_idx = first_text;\r
   else if (first_text == NULLT)\r
-  first_idx = first_att;\r
+    first_idx = first_att;\r
   else\r
-   first_idx = min(first_att,first_text);\r
+    first_idx = min(first_att,first_text);\r
    \r
    uchar * current_text=NULL;\r
+\r
    if (first_idx != NULLT)\r
-   current_text = GetText(MyText(first_idx));\r
+     current_text = GetText(MyText(first_idx));\r
+  \r
    size_t read = 0;\r
    std::vector<uchar*> st;\r
- while (n <= fin){\r
-   if (fast_inspect(Par,n)){\r
-     if (tag == PCDATA_TAG_ID  ) {       \r
-\r
-       if (no_text)\r
-        myfputs("<$/>",fp);\r
-       else{\r
-        read = myfprintf((const char*) current_text, fp);\r
-        current_text += (read + 1);\r
-       };\r
-       n+=2; // skip closing $\r
-       tag = Tag(n);\r
-      \r
-     }\r
-     else {\r
-       myfputc('<',fp);\r
-       tagstr = (uchar*) GetTagNameByRef(tag);\r
-       myfputs((const char*) tagstr ,fp);\r
-       n++;\r
-       if (fast_inspect(Par,n)) {\r
-        st.push_back(tagstr);\r
-        tag = Tag(n);\r
-        if (tag == ATTRIBUTE_TAG_ID){\r
-          n++;\r
-          if (no_text) myfputs("><@@>",fp);\r
-          while (fast_inspect(Par,n)){\r
-            if (no_text) {\r
-              myfputc('<',fp);\r
-              myfputs((const char*) &(GetTagNameByRef(Tag(n))[3]),fp);\r
-              myfputc('>',fp);\r
-              myfputs("<$@/></",fp);\r
-              myfputs((const char*) &(GetTagNameByRef(Tag(n))[3]),fp);\r
-              myfputc('>',fp);\r
-              n+= 4;\r
-            }\r
-            else {\r
-              myfputc(' ',fp);\r
-              myfputs((const char*) &(GetTagNameByRef(Tag(n))[3]),fp);\r
-              n++;\r
-              myfputs("=\"",fp);\r
-              read = myfprintf((const char*) current_text,fp);\r
-              current_text += (read + 1);\r
-              myfputc('"',fp);\r
-              n+=3;\r
-            }\r
-          };\r
-          if (no_text) \r
-            myfputs("</@@>",fp);\r
-          else myfputc('>',fp);\r
-          n++;\r
-          tag=Tag(n);\r
-        }\r
+   while (n <= fin){\r
+     if (fast_inspect(Par,n)){\r
+       if (tag == PCDATA_TAG_ID) {       \r
+        \r
+        if (no_text)\r
+          _dputs("<$/>", fd);\r
         else {\r
-          myfputc('>',fp);\r
+          read = _dprintf((const char*) current_text, fd);\r
+          current_text += (read + 1);\r
         };\r
+        n+=2; // skip closing $\r
+        tag = Tag(n);\r
+        \r
        }\r
-       else {// <foo /> tag\r
-        myfputs("/>",fp);\r
+       else {\r
+        _dputc('<',fd);\r
+        tagstr = (uchar*) GetTagNameByRef(tag);\r
+        _dputs((const char*) tagstr, fd);\r
         n++;\r
-        tag=Tag(n);     \r
-       };     \r
-     };\r
-   }\r
-   else\r
-     do {\r
-       myfputs("</",fp);\r
-       myfputs((const char*)st.back(),fp);\r
-       myfputc('>', fp);\r
-       st.pop_back();\r
-       n++;\r
-     }while (!fast_inspect(Par,n) && !st.empty());\r
-   tag=Tag(n);\r
- };\r
- myfputc('\n',fp);\r
- mybufferflush(fp);\r
- //fflush(fp);\r
- fclose(fp);\r
+        if (fast_inspect(Par,n)) {\r
+          st.push_back(tagstr);\r
+          tag = Tag(n);\r
+          if (tag == ATTRIBUTE_TAG_ID){\r
+            n++;\r
+            if (no_text) _dputs("><@@>",fd);\r
+\r
+            while (fast_inspect(Par,n)){\r
+              if (no_text) {\r
+                _dputc('<', fd);\r
+                _dputs((const char*) &(GetTagNameByRef(Tag(n))[3]), fd);\r
+                _dputc('>', fd);\r
+                _dputs("<$@/></", fd);\r
+                _dputs((const char*) &(GetTagNameByRef(Tag(n))[3]), fd);\r
+                _dputc('>', fd);\r
+                n+= 4;\r
+              } else {\r
+                _dputc(' ', fd);\r
+                _dputs((const char*) &(GetTagNameByRef(Tag(n))[3]), fd);\r
+                n++;\r
+                _dputs("=\"", fd);\r
+                read = _dprintf((const char*) current_text, fd);\r
+                current_text += (read + 1);\r
+                _dputc('"', fd);\r
+                n+=3;\r
+              }\r
+            };\r
+            if (no_text) _dputs("</@@>", fd);\r
+            else _dputc('>', fd);\r
+            n++;\r
+            tag=Tag(n);\r
+          \r
+          } else \r
+            _dputc('>', fd);\r
+          \r
+        } else {// <foo /> tag\r
+          _dputs("/>", fd);\r
+          n++;\r
+          tag=Tag(n);   \r
+        };     \r
+       };\r
+     }\r
+     else\r
+       do {\r
+        _dputs("</", fd);\r
+        _dputs((const char*)st.back(), fd);\r
+        _dputc('>', fd);\r
+        st.pop_back();\r
+        n++;\r
+       } while (!(fast_inspect(Par,n) || st.empty()));\r
+     tag = Tag(n);\r
+   };\r
+   _dputc('\n', fd);\r
+   _flush(fd);\r
 }\r