Added .gitignore
[SXSI/XMLTree.git] / XMLTree.cpp
index 174c94c..06aaba0 100644 (file)
@@ -941,18 +941,13 @@ bool XMLTree::IsOpen(treeNode x) { return fast_inspect(Par,x); }
 \r
 //WARNING this uses directly the underlying implementation for plain text\r
 \r
-void XMLTree::Print(int fd,treeNode x){\r
+\r
+\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_fd != fd){\r
-    if (stream != NULL)\r
-      fclose(stream);\r
-    int newfd = dup(fd);\r
-    stream = fdopen(newfd,"wa");\r
-    stream_fd = fd;\r
-    };\r
-  */\r
+\r
 \r
   FILE* fp = stream;\r
   treeNode fin = fast_find_close(Par,x);\r
@@ -979,47 +974,64 @@ void XMLTree::Print(int fd,treeNode x){
  std::stack<uchar*> st;\r
  while (n <= fin){\r
    if (fast_inspect(Par,n)){\r
-     if (tag == PCDATA_TAG_ID) {       \r
-       //       fputs((const char*) (GetText(MyTextUnsafe(n))),fp);\r
-      \r
+     if (tag == PCDATA_TAG_ID  ) {       \r
+       //       myfputs((const char*) (GetText(MyTextUnsafe(n))),fp);\r
+       if (no_text)\r
+        myfputs("<$/>",fp);\r
+       else{\r
        read = fprintf(fp,"%s",(const char*) current_text);\r
        current_text += (read + 1);\r
-\r
+       }\r
        n+=2; // skip closing $\r
        tag = Tag(n);\r
+      \r
      }\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
-            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
-            n+=3; //close @$ @@                     \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
           };\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){
    }\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