+treeNode XMLTree::Closing(treeNode x) {\r
+ return bp_find_close(Par,x);\r
+}\r
+bool XMLTree::IsOpen(treeNode x) { return bp_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
+ if (buffer == 0) {\r
+ buffer = new string(BUFFER_ALLOC, 0);\r
+ buffer->clear();\r
+ print_stack = new std::vector<string *>();\r
+ print_stack->reserve(256);\r
+ };\r
+\r
+ treeNode fin = bp_find_close(Par,x);\r
+ treeNode n = x;\r
+ TagType tag = Tag(n);\r
+\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
+\r
+ if (first_idx != NULLT)\r
+ current_text = GetText(MyTextUnsafe(first_idx));\r
+\r
+ size_t read = 0;\r
+\r
+ while (n <= fin){\r
+ if (bp_inspect(Par,n)){\r
+ if (tag == PCDATA_TAG_ID) {\r
+\r
+ if (no_text)\r
+ _dputs("<$/>", fd);\r
+ else {\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
+ } else {\r
+\r
+ _dputc('<',fd);\r
+ _dput_str((*TagName)[tag], fd);\r
+ n++;\r
+ if (bp_inspect(Par,n)) {\r
+ print_stack->push_back(&((*TagName)[tag]));\r
+ tag = Tag(n);\r
+ if (tag == ATTRIBUTE_TAG_ID){\r
+ n++;\r
+ if (no_text) _dputs("><@@>",fd);\r
+\r
+ while (bp_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
+ } else do {\r
+ _dputs("</", fd);\r
+ _dput_str(*(print_stack->back()), fd);\r
+ _dputc('>', fd);\r
+ print_stack->pop_back();\r
+ n++;\r
+ } while (!(bp_inspect(Par,n) || print_stack->empty()));\r
+ tag = Tag(n);\r
+ };\r
+ _dputc('\n', fd);\r
+ //_flush(fd);\r
+}\r