+treeNode XMLTree::Closing(treeNode x) {\r
+ 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
+\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
+ 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 : ParentNode(r.min-1));\r
+ treeNode first_att = NULLT;\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
+ 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
+ else {\r
+ myfputc('>',fp);\r
+ };\r
+ }\r
+ else {// <foo /> tag\r
+ myfputs("/>",fp);\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
+}\r