+ return fast_find_close(Par,x); \r
+}\r
+bool XMLTree::IsOpen(treeNode x) { return fast_inspect(Par,x); }\r
+\r
+//WARNING this uses directly the underlying implementation for plain text\r
+\r
+void XMLTree::Print(int fd,treeNode x){\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
+ FILE* fp = stream;\r
+ treeNode fin = fast_find_close(Par,x);\r
+ treeNode n = x;\r
+ TagType tag = Tag(n);\r
+ uchar * tagstr;\r
+ range r = DocIds(x);\r
+ treeNode first_idx;\r
+ treeNode first_text = (tag == PCDATA_TAG_ID ? x : TaggedDescendant(x,PCDATA_TAG_ID));\r
+ treeNode first_att = NULLT;//TaggedDesc(x,ATTRIBUTE_DATA_TAG_ID);\r
+ \r
+ if (first_att == NULLT)\r
+ first_idx = first_text;\r
+ else if (first_text == NULLT)\r
+ first_idx = first_att;\r
+ else\r
+ first_idx = min(first_att,first_text);\r
+ \r
+ uchar * current_text=NULL;\r
+ if (first_idx != NULLT)\r
+ current_text = GetText(MyText(first_idx));\r
+ int read = 0;\r
+\r
+ 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
+ read = fprintf(fp,"%s",(const char*) current_text);\r
+ current_text += (read + 1);\r
+\r
+ n+=2; // skip closing $\r
+ tag = Tag(n);\r
+ }\r
+ else {\r
+\r
+ fputc('<',fp);\r
+ tagstr = (uchar*) GetTagNameByRef(tag);\r
+ fputs((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
+ 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
+ };\r
+ fputc('>',fp);\r
+ n++;\r
+ tag=Tag(n);\r
+ }\r
+ else {\r
+ fputc('>',fp);\r
+ };\r
+ }\r
+ else {// <foo /> tag\r
+ fputs("/>",fp);\r
+ n++;\r
+ tag=Tag(n); \r
+ }; \r
+ };\r
+ }\r
+ else\r
+ do {\r
+ fputs("</",fp);\r
+ fputs((const char*)st.top(),fp);\r
+ fputc('>', fp);\r
+ st.pop();\r
+ n++;\r
+ }while (!fast_inspect(Par,n) && !st.empty());\r
+ tag=Tag(n);\r
+ };\r
+ fputc('\n',fp);\r
+ fflush(fp);\r
+ fclose(fp);\r