X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=XMLTree.cpp;h=db9814c7b2cc4a908e5ab83f7e3258bef4fce37a;hb=9c696a1b1a7034794b3768e4e1e40db86e87ebbb;hp=9be500ee993f4af9a0565a2513c64d23bf902531;hpb=b9205dab05e219c2ac3ce7cf5fe0107267d60535;p=SXSI%2FXMLTree.git diff --git a/XMLTree.cpp b/XMLTree.cpp index 9be500e..db9814c 100644 --- a/XMLTree.cpp +++ b/XMLTree.cpp @@ -3,7 +3,7 @@ #include #include "XMLTree.h" #include "timings.h" - +#include // functions to convert tag positions to the corresponding tree node and viceversa. // These are implemented in order to be able to change the tree and Tags representations, // without affecting the code so much. @@ -53,7 +53,7 @@ static treeNode fast_first_child(bp *Par, treeNode x) static treeNode fast_next_sibling(bp* Par,treeNode x) { - x = fwd_excess(Par,x,0); + x = fast_find_close(Par,x)+1; return (fast_inspect(Par,x) == OP) ? x : NULLT; } @@ -944,11 +944,15 @@ bool XMLTree::IsOpen(treeNode x) { return fast_inspect(Par,x); } //WARNING this uses directly the underlying implementation for plain text - void XMLTree::Print(int fd,treeNode x, bool no_text){ int newfd = dup(fd); stream = fdopen(newfd,"wa"); + if (stream == 0){ + perror(NULL); + return; + }; + if (buffer == 0) buffer = new string(); @@ -959,8 +963,8 @@ void XMLTree::Print(int fd,treeNode x, bool no_text){ uchar * tagstr; range r = DocIds(x); treeNode first_idx; - treeNode first_text = (tag == PCDATA_TAG_ID ? x : TaggedDescendant(x,PCDATA_TAG_ID)); - treeNode first_att = NULLT;//TaggedDesc(x,ATTRIBUTE_DATA_TAG_ID); + treeNode first_text = (tag == PCDATA_TAG_ID ? x : ParentNode(r.min-1)); + treeNode first_att = NULLT; if (first_att == NULLT) first_idx = first_text; @@ -972,18 +976,18 @@ void XMLTree::Print(int fd,treeNode x, bool no_text){ uchar * current_text=NULL; if (first_idx != NULLT) current_text = GetText(MyText(first_idx)); - int read = 0; + size_t read = 0; std::vector st; while (n <= fin){ if (fast_inspect(Par,n)){ if (tag == PCDATA_TAG_ID ) { - // myfputs((const char*) (GetText(MyTextUnsafe(n))),fp); + if (no_text) myfputs("<$/>",fp); else{ - read = fprintf(fp,"%s",(const char*) current_text); - current_text += (read + 1); - } + read = myfprintf((const char*) current_text, fp); + current_text += (read + 1); + }; n+=2; // skip closing $ tag = Tag(n); @@ -1002,11 +1006,10 @@ void XMLTree::Print(int fd,treeNode x, bool no_text){ while (fast_inspect(Par,n)){ if (no_text) { myfputc('<',fp); - const uchar * tmp = &(GetTagNameByRef(Tag(n))[3]); - myfputs((const char*) tmp,fp); + myfputs((const char*) &(GetTagNameByRef(Tag(n))[3]),fp); myfputc('>',fp); myfputs("<$@/>',fp); n+= 4; } @@ -1015,9 +1018,8 @@ void XMLTree::Print(int fd,treeNode x, bool no_text){ myfputs((const char*) &(GetTagNameByRef(Tag(n))[3]),fp); n++; myfputs("=\"",fp); - read = fprintf(fp,"%s",(const char*) current_text); + read = myfprintf((const char*) current_text,fp); current_text += (read + 1); - //myfputs((const char*) GetText(MyTextUnsafe(n)),fp); myfputc('"',fp); n+=3; } @@ -1049,8 +1051,8 @@ void XMLTree::Print(int fd,treeNode x, bool no_text){ }while (!fast_inspect(Par,n) && !st.empty()); tag=Tag(n); }; - //myfputc('\n',fp); + myfputc('\n',fp); mybufferflush(fp); - fflush(fp); + //fflush(fp); fclose(fp); }