Fix printing
authorkim <kim@3cdefd35-fc62-479d-8e8d-bae585ffb9ca>
Tue, 27 Apr 2010 08:05:27 +0000 (08:05 +0000)
committerkim <kim@3cdefd35-fc62-479d-8e8d-bae585ffb9ca>
Tue, 27 Apr 2010 08:05:27 +0000 (08:05 +0000)
git-svn-id: svn+ssh://idea.nguyen.vg/svn/sxsi/trunk/XMLTree@789 3cdefd35-fc62-479d-8e8d-bae585ffb9ca

XMLTree.cpp
XMLTree.h

index e23a06a..06aaba0 100644 (file)
@@ -941,6 +941,8 @@ bool XMLTree::IsOpen(treeNode x) { return fast_inspect(Par,x); }
 \r
 //WARNING this uses directly the underlying implementation for plain text\r
 \r
+\r
+\r
 void XMLTree::Print(int fd,treeNode x, bool no_text){\r
   \r
   int newfd = dup(fd);\r
@@ -973,9 +975,9 @@ void XMLTree::Print(int fd,treeNode x, bool no_text){
  while (n <= fin){\r
    if (fast_inspect(Par,n)){\r
      if (tag == PCDATA_TAG_ID  ) {       \r
-       //       fputs((const char*) (GetText(MyTextUnsafe(n))),fp);\r
+       //       myfputs((const char*) (GetText(MyTextUnsafe(n))),fp);\r
        if (no_text)\r
-        fputs("<$/>",fp);\r
+        myfputs("<$/>",fp);\r
        else{\r
        read = fprintf(fp,"%s",(const char*) current_text);\r
        current_text += (read + 1);\r
@@ -986,40 +988,50 @@ void XMLTree::Print(int fd,treeNode x, bool no_text){
      }\r
      else {\r
 \r
-       fputc('<',fp);\r
+       myfputc('<',fp);\r
        tagstr = (uchar*) GetTagNameByRef(tag);\r
-       fputs((const char*) tagstr ,fp);\r
+       myfputs((const char*) tagstr ,fp);\r
        n++;\r
        if (fast_inspect(Par,n)) {\r
         st.push(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
-            fputc(' ',fp);\r
-            fputs((const char*) &(GetTagNameByRef(Tag(n))[3]),fp);\r
-            fputs("=\"",fp);\r
-            n++;\r
-            if (no_text)\r
-              fputs("<$@/>",fp);\r
-            else{\r
-            read = fprintf(fp,"%s",(const char*) current_text);\r
-            current_text += (read + 1);\r
-            //fputs((const char*) GetText(MyTextUnsafe(n)),fp);\r
-            fputc('"',fp);\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 = fprintf(fp,"%s",(const char*) current_text);\r
+              current_text += (read + 1);\r
+              //myfputs((const char*) GetText(MyTextUnsafe(n)),fp);\r
+              myfputc('"',fp);\r
+              n+=3;\r
             }\r
-            n+=3; //close @$ @@                             \r
           };\r
-          fputc('>',fp);\r
+          if (no_text) \r
+            myfputs("</@@>",fp);\r
+          else myfputc('>',fp);\r
           n++;\r
           tag=Tag(n);\r
         }\r
         else {\r
-          fputc('>',fp);\r
+          myfputc('>',fp);\r
         };\r
        }\r
        else {// <foo /> tag\r
-        fputs("/>",fp);\r
+        myfputs("/>",fp);\r
         n++;\r
         tag=Tag(n);     \r
        };     \r
@@ -1027,15 +1039,16 @@ void XMLTree::Print(int fd,treeNode x, bool no_text){
    }\r
    else\r
      do {\r
-       fputs("</",fp);\r
-       fputs((const char*)st.top(),fp);\r
-       fputc('>', fp);\r
+       myfputs("</",fp);\r
+       myfputs((const char*)st.top(),fp);\r
+       myfputc('>', fp);\r
        st.pop();\r
        n++;\r
      }while (!fast_inspect(Par,n) && !st.empty());\r
    tag=Tag(n);\r
  };\r
- fputc('\n',fp);\r
+ myfputc('\n',fp);\r
+ mybufferflush(fp);\r
  fflush(fp);\r
  fclose(fp);\r
 }\r
index 00ad143..c2a0210 100644 (file)
--- a/XMLTree.h
+++ b/XMLTree.h
@@ -141,8 +141,27 @@ class XMLTree {
    bool disable_tc;\r
    \r
    FILE* stream;\r
-   int   stream_fd;\r
+   int   stream_fd; \r
+   string buffer;\r
+   void myfputs(const char* s, FILE * fp){\r
+     buffer.append(s);\r
+     if (buffer.size() >= 1000000){\r
+       fputs(buffer.c_str(),fp);\r
+       buffer.clear();\r
+     };\r
 \r
+   }\r
+   void myfputc(const char c, FILE*fp){\r
+     buffer.append(1,c);\r
+     if (buffer.size() >= 1000000){\r
+       fputs(buffer.c_str(),fp);\r
+       buffer.clear();\r
+     };\r
+   }\r
+   void mybufferflush(FILE* fp){\r
+     fputs(buffer.c_str(), fp);\r
+     buffer.clear();\r
+   }\r
    /** Data structure constructors */\r
    XMLTree(){;};\r
 \r