Sha256: 6b25271e0042a99fbc72d3bc4f450870d85754f3dbe7f7ec50d006925f2b74d8

Contents?: true

Size: 1.47 KB

Versions: 5

Compression:

Stored size: 1.47 KB

Contents

#include "tst.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>


void *tst_search(const unsigned char *key, struct tst *tst, int option,
		 unsigned int *match_len)
{
    struct node *current_node;
    struct node *longest_match = NULL;
    unsigned int longest_match_len = 0;
    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 (match_len)
	*match_len = 0;

    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 (match_len)
		    *match_len = key_index;
		return current_node->middle;
	    } else {
		current_node = current_node->middle;
		key_index++;
		continue;
	    }
	} else {
	    if (current_node->value == 0) {
		if (option & TST_LONGEST_MATCH) {
		    longest_match = current_node->middle;
		    longest_match_len = key_index;
		}

		if (key[key_index] < 64) {
		    current_node = current_node->left;
		    continue;
		} else {
		    current_node = current_node->right;
		    continue;
		}
	    } else {
		if (key[key_index] < current_node->value) {
		    current_node = current_node->left;
		    continue;
		} else {
		    current_node = current_node->right;
		    continue;
		}
	    }
	}
    }

    if (match_len)
	*match_len = longest_match_len;

    return longest_match;

}

Version data entries

5 entries across 5 versions & 2 rubygems

Version Path
mongrel-1.0.4 ext/http11/tst_search.c
mongrel-1.0.2 ext/http11/tst_search.c
mongrel-1.0.3 ext/http11/tst_search.c
mongrel-1.0.5 ext/http11/tst_search.c
mongrel_experimental-1.1 ext/uri_classifier/tst_search.c