- treeNode y;\r
- if (isleaf(Par,x))\r
- return NULLT;\r
-\r
- int s = (int) Tags->select_next(tag,node2tagpos(x));\r
- if (s==-1) return NULLT; // there is no such node\r
- y = tagpos2node(s); // transforms the tag position into a node position\r
- if (!is_ancestor(Par, x, y)) return NULLT; // the next node tagged tag (in preorder) is not within the subtree of x.\r
- else return y;\r
- }\r
-\r
-\r
-treeNode XMLTree::SelectDesc(treeNode x, TagType *tags, int ntags)\r
- {\r
- int i;\r
- treeNode min = NULLT;\r
- treeNode fc = first_child(Par,x);\r
- \r
- for (i=0; i<ntags; i++) {\r
- treeNode aux = TaggedDesc(x, tags[i]);\r
- if (aux == fc) \r
- return fc;\r
- else \r
- if ((min == (treeNode)NULLT) || (aux < min)) min = aux;\r
- }\r
- return min;\r
- }\r
-\r
-\r
-treeNode XMLTree::TaggedDescOnly(treeNode x,TagType *desctags, unsigned int dtlen)\r
- {\r
- treeNode res, y;\r
- if (isleaf(Par,x))\r
- return NULLT;\r
- \r
- res=NULLT;\r
- for (unsigned int i = 0; i < dtlen; i ++ ) {\r
- y = TaggedDesc(x,desctags[i]);\r
- res = (res == NULLT) || (( res != NULLT) && (y =! NULLT) && y < res) ? y : res; \r
- }\r
- \r
- return res;\r
- } \r
-\r
-\r
-treeNode XMLTree::TaggedBelow(treeNode x, TagType *childtags, unsigned int ctlen,\r
- TagType *desctags, unsigned int dtlen) \r
- {\r
- treeNode fs,y,res;\r
- TagType tag;\r
-\r
- if (isleaf(Par,x))\r
- return NULLT;\r
- \r
- res = NULLT;\r
- fs = first_child(Par,x);\r
- while (fs != NULLT) {\r
- tag = get_field(tags_fix,tags_blen,node2tagpos(fs));\r
- \r
- /* Check for first_child */\r
- for (unsigned int i = 0; i < ctlen; i++) {\r
- if (childtags[i] == tag)\r
- return fs;\r
- }\r
- \r
- for (unsigned int i = 0; i < dtlen; i++)\r
- if (desctags[i] == tag)\r
- return fs; \r
- \r
- /* check in the descendants */\r
- res = NULLT;\r
- for (unsigned int i = 0; i < dtlen; i ++ ) {\r
- /* maybe inline by hand */\r
- y = TaggedDesc(fs,desctags[i]);\r
- res = (res==NULLT || (y != NULLT) &&(y < res)) ? y : res; \r
- } \r
- if (res != NULLT)\r
- return res;\r
- \r
- fs = next_sibling(Par,fs);\r
- }\r
- \r
- return res;\r
-}\r