/** * If current is set set its link to point to the next node, then clear it * @param st the suffixtree in question * @param v the link to point current to */ void update_current_link( suffixtree *st, node *v ) { if ( st->current != NULL ) { node_set_link( st->current, v ); #ifdef DEBUG verify_link( current ); #endif st->current = NULL; } }
/** * If current is set set its link to point to the next node, then clear it * @param v the link to point current to */ static void update_current_link( node *v ) { if ( current != NULL ) { node_set_link( current, v ); #ifdef DEBUG verify_link( current ); #endif current = NULL; } }
/** * Extend the implicit suffix tree by adding one suffix of the current prefix * @param st the current suffixtree * @param j the offset into str of the suffix's start * @param i the offset into str at the end of the current prefix * @param log the log to record errors in * @return 1 if the phase continues else 0 */ static int extension( suffixtree *st, int j, int i, plugin_log *log ) { int res = 1; pos *p = find_beta( st, j, i-1, log ); // rule 1 (once a leaf always a leaf) if ( node_is_leaf(p->v) && pos_at_edge_end(st,p) ) res = 1; // rule 2 else if ( !continues(st,p,st->str[i]) ) { //printf("applying rule 2 at j=%d for phase %d\n",j,i); node *leaf = node_create_leaf( i, log ); if ( p->v==st->root || pos_at_edge_end(st,p) ) { node_add_child( p->v, leaf, st->str, log ); update_current_link( st, p->v ); } else { node *u = node_split( p->v, p->loc, st->str, log ); update_current_link( st, u ); if ( i-j==1 ) { node_set_link( u, st->root ); #ifdef DEBUG verify_link( current ); #endif } else st->current = u; node_add_child( u, leaf, st->str, log ); } update_old_beta( st, p, i ); } // rule 3 else { //printf("applying rule 3 at j=%d for phase %d\n",j,i); update_current_link( st, p->v ); update_old_beta( st, p, i ); res = 0; } free( p ); return res; }
/** * Extend the implicit suffix tree by adding one suffix of the current prefix * @param j the offset into str of the suffix's start * @param i the offset into str at the end of the current prefix * @return 1 if the phase continues else 0 */ static int extension( int j, int i ) { int res = 1; pos *p = find_beta( j, i-1 ); // rule 1 (once a leaf always a leaf) if ( node_is_leaf(p->v) && pos_at_edge_end(p) ) res = 1; // rule 2 else if ( !continues(p,str[i]) ) { //printf("applying rule 2 at j=%d for phase %d\n",j,i); node *leaf = node_create_leaf( i ); if ( p->v==root || pos_at_edge_end(p) ) { node_add_child( p->v, leaf ); update_current_link( p->v ); } else { node *u = node_split( p->v, p->loc ); update_current_link( u ); if ( i-j==1 ) { node_set_link( u, root ); #ifdef DEBUG verify_link( current ); #endif } else current = u; node_add_child( u, leaf ); } update_old_beta( p, i ); } // rule 3 else { //printf("applying rule 3 at j=%d for phase %d\n",j,i); update_current_link( p->v ); update_old_beta( p, i ); res = 0; } free( p ); return res; }