int trie_increment(Trie *trie, char *key) { TrieNode **rover; TrieNode *node; char *p; int c; /* Search to see if this is already in the tree */ node = trie_find_end(trie, key); /* Already in the tree? If so, replace the existing value and * return success. */ if (node != NULL && node->data != TRIE_NULL) { node->data = ++node->data; return 1; } /* Search down the trie until we reach the end of string, * creating nodes as necessary */ rover = &trie->root_node; p = key; for (;;) { node = *rover; if (node == NULL) { /* Node does not exist, so create it */ node = (TrieNode *) calloc(1, sizeof(TrieNode)); if (node == NULL) { /* Allocation failed. Go back and undo * what we have done so far. */ trie_insert_rollback(trie, key); return 0; } node->data = TRIE_NULL; /* Link in to the trie */ *rover = node; } /* Increase the node use count */ ++node->use_count; /* Current character */ c = *p; /* Reached the end of string? If so, we're finished. */ if (c == '\0') { /* Set the data at the node we have reached */ node->data = ++node->data; break; } /* Advance to the next node in the chain */ rover = &node->next[c]; ++p; } return 1; }
int trie_insert_binary(Trie *trie, unsigned char *key, int key_length, TrieValue value) { TrieNode **rover; TrieNode *node; int p,c; /* Cannot insert NULL values */ if (value == TRIE_NULL) { return 0; } /* Search to see if this is already in the tree */ node = trie_find_end_binary(trie, key, key_length); /* Already in the tree? If so, replace the existing value and * return success. */ if (node != NULL && node->data != TRIE_NULL) { node->data = value; return 1; } /* Search down the trie until we reach the end of string, * creating nodes as necessary */ rover = &trie->root_node; p = 0; for (;;) { node = *rover; if (node == NULL) { /* Node does not exist, so create it */ node = (TrieNode *) calloc(1, sizeof(TrieNode)); if (node == NULL) { /* Allocation failed. Go back and undo * what we have done so far. */ trie_insert_rollback(trie, key); return 0; } node->data = TRIE_NULL; /* Link in to the trie */ *rover = node; } /* Increase the node use count */ ++node->use_count; /* Current character */ c = (unsigned char) key[p]; /* Reached the end of string? If so, we're finished. */ if (p == key_length) { /* Set the data at the node we have reached */ node->data = value; break; } /* Advance to the next node in the chain */ rover = &node->next[c]; ++p; } return 1; }