about summary refs log tree commit homepage
path: root/ext/http11/tst_search.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/http11/tst_search.c')
-rw-r--r--ext/http11/tst_search.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/ext/http11/tst_search.c b/ext/http11/tst_search.c
new file mode 100644
index 0000000..efa1cfa
--- /dev/null
+++ b/ext/http11/tst_search.c
@@ -0,0 +1,54 @@
+
+#include "tst.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+void *tst_search(unsigned char *key, struct tst *tst, int *prefix_len)
+{
+  struct node *current_node;
+  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;
+  
+  current_node = tst->head[(int)key[0]];
+  key_index = 1;
+  
+  while (current_node != NULL)
+    {
+      if(key[key_index] == current_node->value)
+        {
+          if(current_node->value == 0) {
+            if(prefix_len) *prefix_len = key_index;
+            return current_node->middle;
+          } else {
+            current_node = current_node->middle;
+            key_index++;
+            continue;
+          }
+        }
+      else if( ((current_node->value == 0) && (key[key_index] < 64)) ||
+               ((current_node->value != 0) && (key[key_index] <
+                                               current_node->value)) )
+        {
+          current_node = current_node->left;
+          continue;
+        }
+      else
+        {
+          current_node = current_node->right;
+          continue;
+        }
+    }
+  
+  if(prefix_len) *prefix_len = key_index;
+  return NULL;
+}