/** * Walk down the tree from the given node following the given path * @param st the suffixtree in question * @param v the node to start from its children * @param p the path to walk down and then free * @return a position corresponding to end */ static pos *walk_down( suffixtree *st, node *v, path *p ) { pos *q=NULL; int start = path_start( p ); int len = path_len( p ); v = node_find_child( v, st->str, st->str[start] ); while ( len > 0 ) { if ( len <= node_len(v) ) { q = pos_create(); q->loc = node_start(v)+len-1; q->v = v; break; } else { start += node_len(v); len -= node_len(v); v = node_find_child( v, st->str, st->str[start] ); } } path_dispose( p ); return q; }
/** * Find a location of the suffix in the tree. * @param j the extension number counting from 0 * @param i the current phase - 1 * @return the position (combined node and edge-offset) */ static pos *find_beta( int j, int i ) { pos *p; if ( old_j > 0 && old_j == j ) { p = pos_create(); p->loc = old_beta.loc; p->v = old_beta.v; } else if ( j>i ) // empty string { p = pos_create(); p->loc = 0; p->v = root; } else if ( j==0 ) // entire string { p = pos_create(); p->loc = i; p->v = f; } else // walk across tree { node *v = last.v; int len = last.loc-node_start(last.v)+1; path *q = path_create( node_start(v), len ); v = node_parent( v ); while ( v != root && node_link(v)==NULL ) { path_prepend( q, node_len(v) ); v = node_parent( v ); } if ( v != root ) { v = node_link( v ); p = walk_down( v, q ); } else { path_dispose( q ); p = walk_down( root, path_create(j,i-j+1) ); } } last = *p; return p; }
/** * Find a location of the suffix in the tree. * @param st the suffixtree in question * @param j the extension number counting from 0 * @param i the current phase - 1 * @param log the log to record errors in * @return the position (combined node and edge-offset) */ static pos *find_beta( suffixtree *st, int j, int i, plugin_log *log ) { pos *p; if ( st->old_j > 0 && st->old_j == j ) { p = pos_create(); p->loc = st->old_beta.loc; p->v = st->old_beta.v; } else if ( j>i ) // empty string { p = pos_create(); p->loc = 0; p->v = st->root; } else if ( j==0 ) // entire string { p = pos_create(); p->loc = i; p->v = st->f; } else // walk across tree { node *v = st->last.v; int len = st->last.loc-node_start(st->last.v)+1; path *q = path_create( node_start(v), len, log ); v = node_parent( v ); while ( v != st->root && node_link(v)==NULL ) { path_prepend( q, node_len(v) ); v = node_parent( v ); } if ( v != st->root ) { v = node_link( v ); p = walk_down( st, v, q ); } else { path_dispose( q ); p = walk_down( st, st->root, path_create(j,i-j+1,log) ); } } st->last = *p; return p; }
void item_dispose( item *it ) { path *p = it->paths; while ( p != NULL ) { path *next = path_next( p ); path_dispose( p ); p = next; } if ( it->cf != NULL ) config_dispose( it->cf ); if ( it->docid != NULL ) free( it->docid ); if ( it->db != NULL ) free( it->db ); if ( it->versionID != NULL ) free( it->versionID ); free( it ); }