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; }
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; }