+// void xml_tree::print(xml_tree::node_t x, int fd, bool no_text)
+// {
+
+// if (print_buffer == 0) {
+// print_buffer = new std::string(BUFFER_SIZE, 0);
+// print_buffer->clear();
+// print_stack = new std::vector<std::string>();
+// print_stack->reserve(256);
+// };
+
+// xml_tree::node_t fin = bp_find_close(par, x);
+// xml_tree::node_t n = x;
+// xml_tree::tag_t label = tag(n);
+// unsigned char * orig_text;
+// unsigned char * current_text;
+
+// auto r = text_id_range(x);
+// if (r.first == xml_tree::NIL)
+// current_text = 0;
+// else
+// current_text = text_collection->GetText(r.first, r.second);
+// current_text += (current_text[0] == 1);
+
+// orig_text = current_text;
+
+// size_t read = 0;
+
+// while (n <= fin) {
+
+// if (bp_inspect(par, n)) {
+// if (label == xml_tree::PCDATA_OPEN_TAG_ID){
+// if (no_text) {
+// uputs("<$/>", fd);
+// } else {
+// read = uprintf( (const char*) current_text, fd);
+// current_text += read + 1;
+// };
+// n += 2; // skip closin $
+// label = tag(n);
+// } else {
+
+// uputc('<', fd);
+// uput_str((*tag_names)[label], fd);
+// n++;
+// if (bp_inspect(par, n)) {
+// print_stack->push_back((*tag_names)[label]);
+// label = tag(n);
+// if (label == xml_tree::ATTRIBUTE_OPEN_TAG_ID) {
+// n++;
+// if (no_text) uputs("><@@>", fd);
+
+// while (bp_inspect(par, n))
+// if (no_text) {
+// uputc('<', fd);
+// uputs((const char*) &(get_tag_name_by_ref(tag(n))[3]), fd);
+// uputc('>', fd);
+// uputs("<$@/></", fd);
+// uputs((const char*) &(get_tag_name_by_ref(tag(n))[3]), fd);
+// uputc('>', fd);
+// n += 4;
+// } else {
+// uputc(' ', fd);
+// uputs((const char*) &(get_tag_name_by_ref(tag(n))[3]), fd);
+// n++;
+// uputs("=\"", fd);
+// read = uprintf((const char*) current_text, fd);
+// current_text += read + 1;
+// uputc('"', fd);
+// n += 3;
+// };
+
+// if (no_text)
+// uputs("</@@>", fd);
+// else uputc('>', fd);
+// n++;
+// label = tag(n);
+// } else
+// uputc('>', fd);
+// } else {
+// uputs("/>", fd);
+// n++;
+// label = tag(n);
+// };
+// };
+// } else do {
+// uputs("</", fd);
+// uput_str(print_stack->back(), fd);
+// uputc('>', fd);
+// print_stack->pop_back();
+// n++;
+// } while (!bp_inspect(par, n) && !print_stack->empty());
+// label = tag(n);
+// };
+// uputc('\n', fd);
+// if (orig_text && text_index_type != TextCollectionBuilder::index_type_default)
+// if (*orig_text == '\0')
+// text_collection->DeleteText(orig_text - 1);
+// else
+// text_collection->DeleteText(orig_text);
+
+// }