struct hash * hash_leaf_node( struct hash_search_state search_state, void * value ) {
    struct hash * new_node = new_hash();
    char * unmatched = search_state.str + search_state.num_matched;
    char decision_char = *(unmatched++); // Unmatched portion starts after decision char.
    char * new_sigstr = malloc( ( strlen(unmatched) + 1 ) * sizeof(char) );
    strcpy( new_sigstr, unmatched );
    new_node->sigstr = new_sigstr;
    new_node->data = value;
    add_to_charhash( search_state.node->child, decision_char, new_node );
    search_state.node->num_children++;
    return new_node;
}
struct hash * hash_branch_node( struct hash_search_state search_state ) {

    // Construct a new branch node with the matched portion as its sigstr.
    char * new_sigstr = malloc( ( search_state.num_matched + 1 ) * sizeof(char) );
    sub_strcpy( new_sigstr, search_state.node->sigstr, search_state.num_matched );
    struct hash * new_node = new_hash();
    new_node->sigstr = new_sigstr;
    char * unmatched = search_state.node->sigstr + search_state.num_matched;
    char decision_char = *(unmatched++); // Unmatched portion starts after decision char.

    // Change the search_state node's sigstr to the unmatched portion.
    new_sigstr = malloc( ( strlen(unmatched) + 1 ) * sizeof(char) );
    strcpy( new_sigstr, unmatched );
    free(search_state.node->sigstr);
    search_state.node->sigstr = new_sigstr;

    // Insert new branch node between search_state.parent and search_state.node.
    add_to_charhash( search_state.parent->child, search_state.parent_choice, (void*) new_node );
    add_to_charhash( new_node->child, decision_char, search_state.node );
    new_node->num_children++;
    return new_node;
}
示例#3
0
void add_to_trie( struct trie_node * trie, char * path, char * accepting_type ) {
    struct trie_node * current_node = trie;
    struct trie_node * next_node = NULL;
    char c;
    int i;
    int path_len = strlen( path );
    for ( i = 0; i < path_len; i++ ) {
        c = path[i];
        struct  charhash * looked_up = charhashlookup( current_node->child, c );
        if ( ! looked_up ) {
            next_node = new_trie_node();
            add_to_charhash( current_node->child, c, (void *) next_node );
        }
        else {
            next_node = looked_up->data;
        }
        if ( i == path_len - 1 ) { // Last char gets accepting type.
            next_node->accepting_type = accepting_type;
        }
        current_node = next_node;
    }
    return;
}