diff options
Diffstat (limited to 'ext/http11/tst_search.c')
-rw-r--r-- | ext/http11/tst_search.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/ext/http11/tst_search.c b/ext/http11/tst_search.c index efa1cfa..4cfe6ff 100644 --- a/ext/http11/tst_search.c +++ b/ext/http11/tst_search.c @@ -7,18 +7,20 @@ void *tst_search(unsigned char *key, struct tst *tst, int *prefix_len) { struct node *current_node; + void *longest_match = NULL; int key_index; assert(key != NULL && "key can't be NULL"); assert(tst != NULL && "tst can't be NULL"); - if(key[0] == 0) return NULL; if(tst->head[(int)key[0]] == NULL) return NULL; + + if(prefix_len) *prefix_len = 0; current_node = tst->head[(int)key[0]]; key_index = 1; @@ -30,7 +32,13 @@ void *tst_search(unsigned char *key, struct tst *tst, int *prefix_len) if(prefix_len) *prefix_len = key_index; return current_node->middle; } else { + current_node = current_node->middle; + if(current_node && current_node->value == 0) { + if(prefix_len) *prefix_len = key_index+1; + longest_match = current_node->middle; + } + key_index++; continue; } @@ -39,16 +47,23 @@ void *tst_search(unsigned char *key, struct tst *tst, int *prefix_len) ((current_node->value != 0) && (key[key_index] < current_node->value)) ) { + if(current_node->left && current_node->value == 0) { + if(prefix_len) *prefix_len = key_index; + longest_match = current_node->middle; + } current_node = current_node->left; continue; } else { + if(current_node->right && current_node->value == 0) { + if(prefix_len) *prefix_len = key_index; + longest_match = current_node->middle; + } current_node = current_node->right; continue; } } - if(prefix_len) *prefix_len = key_index; - return NULL; + return longest_match; } |