void succlocationsstree(Suffixtree *stree,bool nosentinel,Simpleloc *loc, ArraySimpleloc *ll) { Uint succdepth, succ, leafindex, distance, depth, headpos, remain, *succptr, *largeptr, *nodeptr; Simpleloc *llptr; fprintf(stderr,"succlocationsstree\n"); ll->nextfreeSimpleloc = 0; CHECKARRAYSPACE(ll,Simpleloc,stree->alphasize+1); if(loc->remain > 0) { if(nosentinel && loc->nextnode.toleaf && loc->remain <= UintConst(1)) { // at the end of leaf edge: only a\$ remains return; } llptr = ll->spaceSimpleloc + ll->nextfreeSimpleloc++; llptr->textpos = loc->textpos + 1; llptr->remain = loc->remain - 1; llptr->nextnode.address = loc->nextnode.address; llptr->nextnode.toleaf = loc->nextnode.toleaf; CHECKADDR(stree,llptr->nextnode); return; } nodeptr = loc->nextnode.address; GETONLYDEPTH(depth,nodeptr); succ = GETCHILD(nodeptr); do // traverse the list of successors { if(ISLEAF(succ)) // successor is leaf { leafindex = GETLEAFINDEX(succ); remain = stree->textlen - (depth + leafindex); if(!nosentinel || remain >= UintConst(1)) { llptr = ll->spaceSimpleloc + ll->nextfreeSimpleloc++; llptr->remain = remain; llptr->textpos = depth + leafindex; llptr->nextnode.address = stree->leaftab + leafindex; llptr->nextnode.toleaf = true; CHECKADDR(stree,llptr->nextnode); } succ = LEAFBROTHERVAL(stree->leaftab[leafindex]); } else // successor is branch node { succptr = stree->branchtab + GETBRANCHINDEX(succ); GETBOTH(succdepth,headpos,succptr); // get info for branch node llptr = ll->spaceSimpleloc + ll->nextfreeSimpleloc++; llptr->textpos = depth + headpos; llptr->remain = succdepth - depth - 1; llptr->nextnode.toleaf = false; llptr->nextnode.address = succptr; CHECKADDR(stree,llptr->nextnode); succ = GETBROTHER(succptr); } } while(!NILPTR(succ)); }
static void rescan (Suffixtree *stree) { Uint *nodeptr, *largeptr = NULL, distance = 0, node, prevnode, nodedepth, edgelen, wlen, leafindex, headposition; SYMBOL headchar, edgechar; if(stree->headnodedepth == 0) { // head is the root headchar = *(stree->headstart); // headstart is assumed to be not empty node = stree->rootchildren[(Uint) headchar]; if(ISLEAF(node)) { // stop if s.cppessor is leaf stree->insertnode = node; return; } nodeptr = stree->branchtab + GETBRANCHINDEX(node); GETONLYDEPTH(nodedepth,nodeptr); wlen = (Uint) (stree->headend - stree->headstart + 1); if(nodedepth > wlen) { // cannot reach the s.cppessor node stree->insertnode = node; return; } stree->headnode = nodeptr; // go to s.cppessor node stree->headnodedepth = nodedepth; if(nodedepth == wlen) { // location has been scanned stree->headend = NULL; return; } (stree->headstart) += nodedepth; } while(True) { // \emph{headnode} is not the root headchar = *(stree->headstart); // \emph{headstart} is assumed to be nonempty prevnode = 0; node = GETCHILD(stree->headnode); while(True) { // traverse the list of s.cppessors if(ISLEAF(node)) { // s.cppessor is leaf leafindex = GETLEAFINDEX(node); edgechar = stree->text[stree->headnodedepth + leafindex]; if(edgechar == headchar) { // correct edge found stree->insertnode = node; stree->insertprev = prevnode; return; } prevnode = node; node = LEAFBROTHERVAL(stree->leaftab[leafindex]); } else { // s.cppessor is branch node nodeptr = stree->branchtab + GETBRANCHINDEX(node); GETONLYHEADPOS(headposition,nodeptr); edgechar = stree->text[stree->headnodedepth + headposition]; if(edgechar == headchar) { // correct edge found break; } prevnode = node; node = GETBROTHER(nodeptr); } } GETDEPTHAFTERHEADPOS(nodedepth,nodeptr); // get info about s.cpp node edgelen = nodedepth - stree->headnodedepth; wlen = (Uint) (stree->headend - stree->headstart + 1); if(edgelen > wlen) { // cannot reach the s.cpp node stree->insertnode = node; stree->insertprev = prevnode; return; } stree->headnode = nodeptr; // go to the s.cppessor node stree->headnodedepth = nodedepth; if(edgelen == wlen) { // location is found stree->headend = NULL; return; } (stree->headstart) += edgelen; } }