inline function optimization
This commit is contained in:
parent
134a849ecd
commit
ebe4c008fb
5 changed files with 512 additions and 525 deletions
16
README.md
16
README.md
|
@ -18,25 +18,25 @@ C API
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// create a router tree with 10 children capacity (this capacity can grow dynamically)
|
// create a router tree with 10 children capacity (this capacity can grow dynamically)
|
||||||
n = rtree_create(10);
|
n = r3_tree_create(10);
|
||||||
|
|
||||||
int route_data = 3;
|
int route_data = 3;
|
||||||
|
|
||||||
// insert the route path into the router tree
|
// insert the route path into the router tree
|
||||||
rtree_insert_pathn(n , "/zoo" , strlen("/zoo") , &route_data );
|
r3_tree_insert_pathn(n , "/zoo" , strlen("/zoo") , &route_data );
|
||||||
rtree_insert_pathn(n , "/foo/bar" , strlen("/foo/bar") , &route_data );
|
r3_tree_insert_pathn(n , "/foo/bar" , strlen("/foo/bar") , &route_data );
|
||||||
rtree_insert_pathn(n , "/bar" , strlen("/bar") , &route_data );
|
r3_tree_insert_pathn(n , "/bar" , strlen("/bar") , &route_data );
|
||||||
rtree_insert_pathn(n , "/post/{id}" , strlen("/post/{id}") , &route_data );
|
r3_tree_insert_pathn(n , "/post/{id}" , strlen("/post/{id}") , &route_data );
|
||||||
|
|
||||||
// let's compile the tree!
|
// let's compile the tree!
|
||||||
rtree_compile(n);
|
r3_tree_compile(n);
|
||||||
|
|
||||||
|
|
||||||
// dump the compiled tree
|
// dump the compiled tree
|
||||||
rtree_dump(n, 0);
|
r3_tree_dump(n, 0);
|
||||||
|
|
||||||
// match a route
|
// match a route
|
||||||
node *matched_node = rtree_match(n, "/foo/bar", strlen("/foo/bar") );
|
node *matched_node = r3_tree_match(n, "/foo/bar", strlen("/foo/bar") );
|
||||||
matched_node->endpoint; // make sure there is a route end at here.
|
matched_node->endpoint; // make sure there is a route end at here.
|
||||||
int ret = *( (*int) matched_node->route_ptr );
|
int ret = *( (*int) matched_node->route_ptr );
|
||||||
```
|
```
|
||||||
|
|
|
@ -2,5 +2,5 @@
|
||||||
arr = ["foo", "bar", "baz", "qux", "quux", "corge", "grault", "garply"]
|
arr = ["foo", "bar", "baz", "qux", "quux", "corge", "grault", "garply"]
|
||||||
paths = arr.permutation(3).map { |a| "/#{a.join '/'}" }
|
paths = arr.permutation(3).map { |a| "/#{a.join '/'}" }
|
||||||
paths.each do |path|
|
paths.each do |path|
|
||||||
puts "rtree_insert_path(n, \"#{path}\", NULL);"
|
puts "r3_tree_insert_path(n, \"#{path}\", NULL);"
|
||||||
end
|
end
|
||||||
|
|
|
@ -23,8 +23,8 @@ typedef struct _node node;
|
||||||
|
|
||||||
struct _node {
|
struct _node {
|
||||||
edge ** edges;
|
edge ** edges;
|
||||||
int edge_len;
|
int r3_edge_len;
|
||||||
int edge_cap;
|
int r3_edge_cap;
|
||||||
|
|
||||||
/* the combined regexp pattern string from pattern_tokens */
|
/* the combined regexp pattern string from pattern_tokens */
|
||||||
char * combined_pattern;
|
char * combined_pattern;
|
||||||
|
@ -55,44 +55,44 @@ typedef struct {
|
||||||
} match_entry;
|
} match_entry;
|
||||||
|
|
||||||
|
|
||||||
node * rtree_create(int cap);
|
node * r3_tree_create(int cap);
|
||||||
|
|
||||||
node * node_create();
|
node * r3_node_create();
|
||||||
|
|
||||||
void rtree_free(node * tree);
|
void r3_tree_free(node * tree);
|
||||||
|
|
||||||
void edge_free(edge * edge);
|
void r3_edge_free(edge * edge);
|
||||||
|
|
||||||
edge * rtree_add_child(node * n, char * pat , node *child);
|
edge * r3_tree_add_child(node * n, char * pat , node *child);
|
||||||
|
|
||||||
edge * node_find_edge(node * n, char * pat);
|
edge * r3_node_find_edge(node * n, char * pat);
|
||||||
|
|
||||||
void rtree_append_edge(node *n, edge *child);
|
void r3_tree_append_edge(node *n, edge *child);
|
||||||
|
|
||||||
node * rtree_insert_path(node *tree, char *route, void * route_ptr);
|
node * r3_tree_insert_path(node *tree, char *route, void * route_ptr);
|
||||||
|
|
||||||
node * rtree_insert_pathn(node *tree, char *route, int route_len, void * route_ptr);
|
node * r3_tree_insert_pathn(node *tree, char *route, int route_len, void * route_ptr);
|
||||||
|
|
||||||
void rtree_dump(node * n, int level);
|
void r3_tree_dump(node * n, int level);
|
||||||
|
|
||||||
edge * node_find_edge_str(node * n, char * str, int str_len);
|
edge * r3_node_find_edge_str(node * n, char * str, int str_len);
|
||||||
|
|
||||||
|
|
||||||
void rtree_compile(node *n);
|
void r3_tree_compile(node *n);
|
||||||
|
|
||||||
void rtree_compile_patterns(node * n);
|
void r3_tree_compile_patterns(node * n);
|
||||||
|
|
||||||
node * rtree_match(node * n, char * path, int path_len, match_entry * entry);
|
node * r3_tree_match(node * n, char * path, int path_len, match_entry * entry);
|
||||||
|
|
||||||
bool node_has_slug_edges(node *n);
|
bool r3_node_has_slug_edges(node *n);
|
||||||
|
|
||||||
node * rtree_lookup(node * tree, char * path, int path_len);
|
node * r3_tree_lookup(node * tree, char * path, int path_len);
|
||||||
|
|
||||||
edge * edge_create(char * pattern, int pattern_len, node * child);
|
edge * r3_edge_create(char * pattern, int pattern_len, node * child);
|
||||||
|
|
||||||
void edge_branch(edge *e, int dl);
|
void r3_edge_branch(edge *e, int dl);
|
||||||
|
|
||||||
void edge_free(edge * edge);
|
void r3_edge_free(edge * edge);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
191
src/node.c
191
src/node.c
|
@ -23,21 +23,21 @@
|
||||||
/**
|
/**
|
||||||
* Create a node object
|
* Create a node object
|
||||||
*/
|
*/
|
||||||
node * rtree_create(int cap) {
|
node * r3_tree_create(int cap) {
|
||||||
node * n = (node*) malloc( sizeof(node) );
|
node * n = (node*) malloc( sizeof(node) );
|
||||||
|
|
||||||
n->edges = (edge**) malloc( sizeof(edge*) * 10 );
|
n->edges = (edge**) malloc( sizeof(edge*) * 10 );
|
||||||
n->edge_len = 0;
|
n->r3_edge_len = 0;
|
||||||
n->edge_cap = 10;
|
n->r3_edge_cap = 10;
|
||||||
n->endpoint = 0;
|
n->endpoint = 0;
|
||||||
n->combined_pattern = NULL;
|
n->combined_pattern = NULL;
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtree_free(node * tree) {
|
void r3_tree_free(node * tree) {
|
||||||
for (int i = 0 ; i < tree->edge_len ; i++ ) {
|
for (int i = 0 ; i < tree->r3_edge_len ; i++ ) {
|
||||||
if (tree->edges[i]) {
|
if (tree->edges[i]) {
|
||||||
edge_free(tree->edges[ i ]);
|
r3_edge_free(tree->edges[ i ]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ void rtree_free(node * tree) {
|
||||||
free(tree->combined_pattern);
|
free(tree->combined_pattern);
|
||||||
|
|
||||||
free(tree->edges);
|
free(tree->edges);
|
||||||
// str_array_free(tree->edge_patterns);
|
// str_array_free(tree->r3_edge_patterns);
|
||||||
free(tree);
|
free(tree);
|
||||||
tree = NULL;
|
tree = NULL;
|
||||||
}
|
}
|
||||||
|
@ -53,42 +53,42 @@ void rtree_free(node * tree) {
|
||||||
|
|
||||||
|
|
||||||
/* parent node, edge pattern, child */
|
/* parent node, edge pattern, child */
|
||||||
edge * rtree_add_child(node * n, char * pat , node *child) {
|
edge * r3_tree_add_child(node * n, char * pat , node *child) {
|
||||||
// find the same sub-pattern, if it does not exist, create one
|
// find the same sub-pattern, if it does not exist, create one
|
||||||
|
|
||||||
edge * e;
|
edge * e;
|
||||||
|
|
||||||
e = node_find_edge(n, pat);
|
e = r3_node_find_edge(n, pat);
|
||||||
if (e) {
|
if (e) {
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
e = edge_create( pat, strlen(pat), child);
|
e = r3_edge_create( pat, strlen(pat), child);
|
||||||
rtree_append_edge(n, e);
|
r3_tree_append_edge(n, e);
|
||||||
// str_array_append(n->edge_patterns, pat);
|
// str_array_append(n->r3_edge_patterns, pat);
|
||||||
// assert( str_array_len(n->edge_patterns) == n->edge_len );
|
// assert( str_array_len(n->r3_edge_patterns) == n->r3_edge_len );
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void rtree_append_edge(node *n, edge *e) {
|
void r3_tree_append_edge(node *n, edge *e) {
|
||||||
|
|
||||||
if (!n->edges) {
|
if (!n->edges) {
|
||||||
n->edge_cap = 3;
|
n->r3_edge_cap = 3;
|
||||||
n->edges = malloc(sizeof(edge) * n->edge_cap);
|
n->edges = malloc(sizeof(edge) * n->r3_edge_cap);
|
||||||
}
|
}
|
||||||
if (n->edge_len >= n->edge_cap) {
|
if (n->r3_edge_len >= n->r3_edge_cap) {
|
||||||
n->edge_cap *= 2;
|
n->r3_edge_cap *= 2;
|
||||||
n->edges = realloc(n->edges, sizeof(edge) * n->edge_cap);
|
n->edges = realloc(n->edges, sizeof(edge) * n->r3_edge_cap);
|
||||||
}
|
}
|
||||||
n->edges[ n->edge_len++ ] = e;
|
n->edges[ n->r3_edge_len++ ] = e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
edge * node_find_edge(node * n, char * pat) {
|
edge * r3_node_find_edge(node * n, char * pat) {
|
||||||
edge * e;
|
edge * e;
|
||||||
for (int i = 0 ; i < n->edge_len ; i++ ) {
|
for (int i = 0 ; i < n->r3_edge_len ; i++ ) {
|
||||||
e = n->edges[i];
|
e = n->edges[i];
|
||||||
if ( strcmp(e->pattern, pat) == 0 ) {
|
if ( strcmp(e->pattern, pat) == 0 ) {
|
||||||
return e;
|
return e;
|
||||||
|
@ -97,18 +97,18 @@ edge * node_find_edge(node * n, char * pat) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtree_compile(node *n)
|
void r3_tree_compile(node *n)
|
||||||
{
|
{
|
||||||
bool use_slug = node_has_slug_edges(n);
|
bool use_slug = r3_node_has_slug_edges(n);
|
||||||
if ( use_slug ) {
|
if ( use_slug ) {
|
||||||
rtree_compile_patterns(n);
|
r3_tree_compile_patterns(n);
|
||||||
} else {
|
} else {
|
||||||
// use normal text matching...
|
// use normal text matching...
|
||||||
n->combined_pattern = NULL;
|
n->combined_pattern = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0 ; i < n->edge_len ; i++ ) {
|
for (int i = 0 ; i < n->r3_edge_len ; i++ ) {
|
||||||
rtree_compile(n->edges[i]->child);
|
r3_tree_compile(n->edges[i]->child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,7 +117,7 @@ void rtree_compile(node *n)
|
||||||
* This function combines ['/foo', '/bar', '/{slug}'] into (/foo)|(/bar)|/([^/]+)}
|
* This function combines ['/foo', '/bar', '/{slug}'] into (/foo)|(/bar)|/([^/]+)}
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void rtree_compile_patterns(node * n) {
|
void r3_tree_compile_patterns(node * n) {
|
||||||
char * cpat;
|
char * cpat;
|
||||||
char * p;
|
char * p;
|
||||||
|
|
||||||
|
@ -127,9 +127,11 @@ void rtree_compile_patterns(node * n) {
|
||||||
|
|
||||||
p = cpat;
|
p = cpat;
|
||||||
|
|
||||||
|
strncat(p, "^", 1);
|
||||||
|
p++;
|
||||||
|
|
||||||
edge *e = NULL;
|
edge *e = NULL;
|
||||||
for ( int i = 0 ; i < n->edge_len ; i++ ) {
|
for ( int i = 0 ; i < n->r3_edge_len ; i++ ) {
|
||||||
e = n->edges[i];
|
e = n->edges[i];
|
||||||
if ( e->has_slug ) {
|
if ( e->has_slug ) {
|
||||||
char * slug_pat = compile_slug(e->pattern, e->pattern_len);
|
char * slug_pat = compile_slug(e->pattern, e->pattern_len);
|
||||||
|
@ -143,7 +145,7 @@ void rtree_compile_patterns(node * n) {
|
||||||
strncat(p++,")", 1);
|
strncat(p++,")", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( i + 1 < n->edge_len ) {
|
if ( i + 1 < n->r3_edge_len ) {
|
||||||
strncat(p++,"|",1);
|
strncat(p++,"|",1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -181,18 +183,23 @@ void rtree_compile_patterns(node * n) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
node * rtree_match(node * n, char * path, int path_len, match_entry * entry) {
|
node * r3_tree_match(node * n, char * path, int path_len, match_entry * entry) {
|
||||||
// info("try matching: %s\n", path);
|
// info("try matching: %s\n", path);
|
||||||
|
|
||||||
|
edge *e;
|
||||||
if (n->combined_pattern && n->pcre_pattern) {
|
if (n->combined_pattern && n->pcre_pattern) {
|
||||||
info("pcre matching %s on %s\n", n->combined_pattern, path);
|
info("pcre matching %s on %s\n", n->combined_pattern, path);
|
||||||
// int ovector_count = (n->edge_len + 1) * 2;
|
// int ovector_count = (n->r3_edge_len + 1) * 2;
|
||||||
int ovector_count = 30;
|
int ovector_count = 30;
|
||||||
int ovector[ovector_count];
|
int ovector[ovector_count];
|
||||||
int rc;
|
int rc;
|
||||||
|
int i;
|
||||||
|
|
||||||
rc = pcre_exec(
|
rc = pcre_exec(
|
||||||
n->pcre_pattern, /* the compiled pattern */
|
n->pcre_pattern, /* the compiled pattern */
|
||||||
NULL, /* no extra data - we didn't study the pattern */
|
|
||||||
|
// PCRE Study makes this slow
|
||||||
|
NULL, // n->pcre_extra, /* no extra data - we didn't study the pattern */
|
||||||
path, /* the subject string */
|
path, /* the subject string */
|
||||||
path_len, /* the length of the subject */
|
path_len, /* the length of the subject */
|
||||||
0, /* start at offset 0 in the subject */
|
0, /* start at offset 0 in the subject */
|
||||||
|
@ -214,8 +221,6 @@ node * rtree_match(node * n, char * path, int path_len, match_entry * entry) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int i;
|
|
||||||
edge *e;
|
|
||||||
for (i = 1; i < rc; i++)
|
for (i = 1; i < rc; i++)
|
||||||
{
|
{
|
||||||
char *substring_start = path + ovector[2*i];
|
char *substring_start = path + ovector[2*i];
|
||||||
|
@ -224,75 +229,57 @@ node * rtree_match(node * n, char * path, int path_len, match_entry * entry) {
|
||||||
|
|
||||||
if ( substring_length > 0) {
|
if ( substring_length > 0) {
|
||||||
int restlen = path_len - ovector[2*i+1]; // fully match to the end
|
int restlen = path_len - ovector[2*i+1]; // fully match to the end
|
||||||
info("matched item => restlen:%d edges:%d i:%d\n", restlen, n->edge_len, i);
|
info("matched item => restlen:%d edges:%d i:%d\n", restlen, n->r3_edge_len, i);
|
||||||
|
|
||||||
e = n->edges[i - 1];
|
e = n->edges[i - 1];
|
||||||
|
|
||||||
if (entry && e->has_slug) {
|
if (entry && e->has_slug) {
|
||||||
// entry->
|
// entry->
|
||||||
}
|
}
|
||||||
|
|
||||||
if (restlen == 0) {
|
if (restlen == 0) {
|
||||||
return e->child;
|
return e->child;
|
||||||
}
|
}
|
||||||
return rtree_match( e->child, substring_start + substring_length, restlen, entry);
|
return r3_tree_match( e->child, substring_start + substring_length, restlen, entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// does not match
|
// does not match
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
edge *e = node_find_edge_str(n, path, path_len);
|
e = r3_node_find_edge_str(n, path, path_len);
|
||||||
if (e) {
|
if (e) {
|
||||||
int len = path_len - e->pattern_len;
|
int restlen = path_len - e->pattern_len;
|
||||||
if(len == 0) {
|
if(restlen) {
|
||||||
return e->child;
|
return r3_tree_match(e->child, path + e->pattern_len, restlen, entry);
|
||||||
} else {
|
} else {
|
||||||
return rtree_match(e->child, path + e->pattern_len, len, entry);
|
return e->child;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
edge * node_find_edge_str(node * n, char * str, int str_len) {
|
#define node_edge_pattern(node,i) node->edges[i]->pattern
|
||||||
edge *e;
|
#define node_edge_pattern_len(node,i) node->edges[i]->pattern_len
|
||||||
char *p;
|
|
||||||
char *s;
|
|
||||||
for ( int i = 0 ; i < n->edge_len ; i++ ) {
|
|
||||||
e = n->edges[i];
|
|
||||||
p = e->pattern;
|
|
||||||
s = str;
|
|
||||||
|
|
||||||
info("matching '%s' with '%s'\n", str, e->pattern);
|
inline edge * r3_node_find_edge_str(node * n, char * str, int str_len) {
|
||||||
if ( str_len < e->pattern_len ) {
|
int i = 0;
|
||||||
continue;
|
for (; i < n->r3_edge_len ; i++ ) {
|
||||||
|
info("matching '%s' with '%s'\n", str, node_edge_pattern(n,i) );
|
||||||
|
if ( strncmp( node_edge_pattern(n,i), str, node_edge_pattern_len(n,i) ) == 0 ) {
|
||||||
|
return n->edges[i];
|
||||||
}
|
}
|
||||||
if ( strncmp(e->pattern, str, e->pattern_len) == 0 ) {
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
while ( *p == *s ) {
|
|
||||||
p++;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
|
|
||||||
info("matched len: %d == pattern len %d\n", (int)(p - e->pattern) , e->pattern_len);
|
|
||||||
if ( p - e->pattern == e->pattern_len ) {
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
node * rtree_lookup(node * tree, char * path, int path_len) {
|
node * r3_tree_lookup(node * tree, char * path, int path_len) {
|
||||||
str_array * tokens = split_route_pattern(path, path_len);
|
str_array * tokens = split_route_pattern(path, path_len);
|
||||||
|
|
||||||
node * n = tree;
|
node * n = tree;
|
||||||
edge * e = NULL;
|
edge * e = NULL;
|
||||||
for ( int i = 0 ; i < tokens->len ; i++ ) {
|
for ( int i = 0 ; i < tokens->len ; i++ ) {
|
||||||
e = node_find_edge(n, str_array_fetch(tokens, i) );
|
e = r3_node_find_edge(n, str_array_fetch(tokens, i) );
|
||||||
if (!e) {
|
if (!e) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -304,11 +291,11 @@ node * rtree_lookup(node * tree, char * path, int path_len) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
node * node_create() {
|
node * r3_node_create() {
|
||||||
node * n = (node*) malloc( sizeof(node) );
|
node * n = (node*) malloc( sizeof(node) );
|
||||||
n->edges = NULL;
|
n->edges = NULL;
|
||||||
n->edge_len = 0;
|
n->r3_edge_len = 0;
|
||||||
n->edge_cap = 0;
|
n->r3_edge_cap = 0;
|
||||||
n->endpoint = 0;
|
n->endpoint = 0;
|
||||||
n->combined_pattern = NULL;
|
n->combined_pattern = NULL;
|
||||||
n->pcre_pattern = NULL;
|
n->pcre_pattern = NULL;
|
||||||
|
@ -316,12 +303,12 @@ node * node_create() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
node * rtree_insert_path(node *tree, char *route, void * route_ptr)
|
node * r3_tree_insert_path(node *tree, char *route, void * route_ptr)
|
||||||
{
|
{
|
||||||
return rtree_insert_pathn(tree, route, strlen(route) , route_ptr);
|
return r3_tree_insert_pathn(tree, route, strlen(route) , route_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
node * rtree_insert_pathn(node *tree, char *route, int route_len, void * route_ptr)
|
node * r3_tree_insert_pathn(node *tree, char *route, int route_len, void * route_ptr)
|
||||||
{
|
{
|
||||||
node * n = tree;
|
node * n = tree;
|
||||||
edge * e = NULL;
|
edge * e = NULL;
|
||||||
|
@ -330,7 +317,7 @@ node * rtree_insert_pathn(node *tree, char *route, int route_len, void * route_p
|
||||||
|
|
||||||
/* length of common prefix */
|
/* length of common prefix */
|
||||||
int dl = 0;
|
int dl = 0;
|
||||||
for( int i = 0 ; i < n->edge_len ; i++ ) {
|
for( int i = 0 ; i < n->r3_edge_len ; i++ ) {
|
||||||
dl = strndiff(route, n->edges[i]->pattern, n->edges[i]->pattern_len);
|
dl = strndiff(route, n->edges[i]->pattern, n->edges[i]->pattern_len);
|
||||||
|
|
||||||
// printf("dl: %d %s vs %s\n", dl, route, n->edges[i]->pattern );
|
// printf("dl: %d %s vs %s\n", dl, route, n->edges[i]->pattern );
|
||||||
|
@ -354,8 +341,8 @@ node * rtree_insert_pathn(node *tree, char *route, int route_len, void * route_p
|
||||||
|
|
||||||
if ( dl == 0 ) {
|
if ( dl == 0 ) {
|
||||||
// not found, we should just insert a whole new edge
|
// not found, we should just insert a whole new edge
|
||||||
node * child = rtree_create(3);
|
node * child = r3_tree_create(3);
|
||||||
rtree_add_child(n, strndup(route, route_len) , child);
|
r3_tree_add_child(n, strndup(route, route_len) , child);
|
||||||
info("edge not found, insert one: %s\n", route);
|
info("edge not found, insert one: %s\n", route);
|
||||||
child->route_ptr = route_ptr;
|
child->route_ptr = route_ptr;
|
||||||
child->endpoint++;
|
child->endpoint++;
|
||||||
|
@ -367,7 +354,7 @@ node * rtree_insert_pathn(node *tree, char *route, int route_len, void * route_p
|
||||||
|
|
||||||
// there are something more we can insert
|
// there are something more we can insert
|
||||||
if ( subroute_len > 0 ) {
|
if ( subroute_len > 0 ) {
|
||||||
return rtree_insert_pathn(e->child, subroute, subroute_len, route_ptr);
|
return r3_tree_insert_pathn(e->child, subroute, subroute_len, route_ptr);
|
||||||
} else {
|
} else {
|
||||||
// no more,
|
// no more,
|
||||||
e->child->endpoint++; // make it as an endpoint, TODO: put the route value
|
e->child->endpoint++; // make it as an endpoint, TODO: put the route value
|
||||||
|
@ -387,14 +374,14 @@ node * rtree_insert_pathn(node *tree, char *route, int route_len, void * route_p
|
||||||
char * s2 = route + dl;
|
char * s2 = route + dl;
|
||||||
int s2_len = 0;
|
int s2_len = 0;
|
||||||
|
|
||||||
edge_branch(e, dl);
|
r3_edge_branch(e, dl);
|
||||||
|
|
||||||
// here is the new edge from.
|
// here is the new edge from.
|
||||||
c2 = rtree_create(3);
|
c2 = r3_tree_create(3);
|
||||||
s2_len = route_len - dl;
|
s2_len = route_len - dl;
|
||||||
e2 = edge_create(strndup(s2, s2_len), s2_len, c2);
|
e2 = r3_edge_create(strndup(s2, s2_len), s2_len, c2);
|
||||||
// printf("edge right: %s\n", e2->pattern);
|
// printf("edge right: %s\n", e2->pattern);
|
||||||
rtree_append_edge(e->child, e2);
|
r3_tree_append_edge(e->child, e2);
|
||||||
|
|
||||||
// truncate the original edge pattern
|
// truncate the original edge pattern
|
||||||
free(e->pattern);
|
free(e->pattern);
|
||||||
|
@ -412,10 +399,10 @@ node * rtree_insert_pathn(node *tree, char *route, int route_len, void * route_p
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool node_has_slug_edges(node *n) {
|
bool r3_node_has_slug_edges(node *n) {
|
||||||
bool found = FALSE;
|
bool found = FALSE;
|
||||||
edge *e;
|
edge *e;
|
||||||
for ( int i = 0 ; i < n->edge_len ; i++ ) {
|
for ( int i = 0 ; i < n->r3_edge_len ; i++ ) {
|
||||||
e = n->edges[i];
|
e = n->edges[i];
|
||||||
e->has_slug = contains_slug(e->pattern);
|
e->has_slug = contains_slug(e->pattern);
|
||||||
if (e->has_slug)
|
if (e->has_slug)
|
||||||
|
@ -429,37 +416,37 @@ bool node_has_slug_edges(node *n) {
|
||||||
* branch the edge pattern at "dl" offset
|
* branch the edge pattern at "dl" offset
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void edge_branch(edge *e, int dl) {
|
void r3_edge_branch(edge *e, int dl) {
|
||||||
node *c1; // child 1, child 2
|
node *c1; // child 1, child 2
|
||||||
edge *e1; // edge 1, edge 2
|
edge *e1; // edge 1, edge 2
|
||||||
char * s1 = e->pattern + dl;
|
char * s1 = e->pattern + dl;
|
||||||
int s1_len = 0;
|
int s1_len = 0;
|
||||||
|
|
||||||
edge **tmp_edges = e->child->edges;
|
edge **tmp_edges = e->child->edges;
|
||||||
int tmp_edge_len = e->child->edge_len;
|
int tmp_r3_edge_len = e->child->r3_edge_len;
|
||||||
|
|
||||||
// the suffix edge of the leaf
|
// the suffix edge of the leaf
|
||||||
c1 = rtree_create(3);
|
c1 = r3_tree_create(3);
|
||||||
s1_len = e->pattern_len - dl;
|
s1_len = e->pattern_len - dl;
|
||||||
e1 = edge_create(strndup(s1, s1_len), s1_len, c1);
|
e1 = r3_edge_create(strndup(s1, s1_len), s1_len, c1);
|
||||||
// printf("edge left: %s\n", e1->pattern);
|
// printf("edge left: %s\n", e1->pattern);
|
||||||
|
|
||||||
// Migrate the child edges to the new edge we just created.
|
// Migrate the child edges to the new edge we just created.
|
||||||
for ( int i = 0 ; i < tmp_edge_len ; i++ ) {
|
for ( int i = 0 ; i < tmp_r3_edge_len ; i++ ) {
|
||||||
rtree_append_edge(c1, tmp_edges[i]);
|
r3_tree_append_edge(c1, tmp_edges[i]);
|
||||||
e->child->edges[i] = NULL;
|
e->child->edges[i] = NULL;
|
||||||
}
|
}
|
||||||
e->child->edge_len = 0;
|
e->child->r3_edge_len = 0;
|
||||||
e->child->endpoint--;
|
e->child->endpoint--;
|
||||||
|
|
||||||
info("branched pattern: %s\n", e1->pattern);
|
info("branched pattern: %s\n", e1->pattern);
|
||||||
|
|
||||||
rtree_append_edge(e->child, e1);
|
r3_tree_append_edge(e->child, e1);
|
||||||
c1->endpoint++;
|
c1->endpoint++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
edge * edge_create(char * pattern, int pattern_len, node * child) {
|
edge * r3_edge_create(char * pattern, int pattern_len, node * child) {
|
||||||
edge * e = (edge*) malloc( sizeof(edge) );
|
edge * e = (edge*) malloc( sizeof(edge) );
|
||||||
e->pattern = pattern;
|
e->pattern = pattern;
|
||||||
e->pattern_len = pattern_len;
|
e->pattern_len = pattern_len;
|
||||||
|
@ -467,27 +454,27 @@ edge * edge_create(char * pattern, int pattern_len, node * child) {
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
void edge_free(edge * e) {
|
void r3_edge_free(edge * e) {
|
||||||
if (e->pattern) {
|
if (e->pattern) {
|
||||||
free(e->pattern);
|
free(e->pattern);
|
||||||
}
|
}
|
||||||
if ( e->child ) {
|
if ( e->child ) {
|
||||||
rtree_free(e->child);
|
r3_tree_free(e->child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void rtree_dump(node * n, int level) {
|
void r3_tree_dump(node * n, int level) {
|
||||||
if ( n->edge_len ) {
|
if ( n->r3_edge_len ) {
|
||||||
if ( n->combined_pattern ) {
|
if ( n->combined_pattern ) {
|
||||||
printf(" regexp:%s", n->combined_pattern);
|
printf(" regexp:%s", n->combined_pattern);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(" endpoint:%d\n", n->endpoint);
|
printf(" endpoint:%d\n", n->endpoint);
|
||||||
|
|
||||||
for ( int i = 0 ; i < n->edge_len ; i++ ) {
|
for ( int i = 0 ; i < n->r3_edge_len ; i++ ) {
|
||||||
edge * e = n->edges[i];
|
edge * e = n->edges[i];
|
||||||
print_indent(level);
|
print_indent(level);
|
||||||
printf(" |-\"%s\"", e->pattern);
|
printf(" |-\"%s\"", e->pattern);
|
||||||
|
@ -498,7 +485,7 @@ void rtree_dump(node * n, int level) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( e->child && e->child->edges ) {
|
if ( e->child && e->child->edges ) {
|
||||||
rtree_dump( e->child, level + 1);
|
r3_tree_dump( e->child, level + 1);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
@ -506,7 +493,7 @@ void rtree_dump(node * n, int level) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
char * node_trace(node * n) {
|
char * r3_node_trace(node * n) {
|
||||||
|
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -44,31 +44,31 @@ START_TEST (test_ltrim_slash)
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
START_TEST (test_node_construct_uniq)
|
START_TEST (test_r3_node_construct_uniq)
|
||||||
{
|
{
|
||||||
node * n = rtree_create(10);
|
node * n = r3_tree_create(10);
|
||||||
|
|
||||||
node * child = rtree_create(3);
|
node * child = r3_tree_create(3);
|
||||||
|
|
||||||
// fail_if( rtree_add_child(n, strdup("/add") , child) != NULL );
|
// fail_if( r3_tree_add_child(n, strdup("/add") , child) != NULL );
|
||||||
// fail_if( rtree_add_child(n, strdup("/add") , child) != NULL );
|
// fail_if( r3_tree_add_child(n, strdup("/add") , child) != NULL );
|
||||||
|
|
||||||
rtree_free(n);
|
r3_tree_free(n);
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
START_TEST (test_node_find_edge)
|
START_TEST (test_r3_node_find_edge)
|
||||||
{
|
{
|
||||||
node * n = rtree_create(10);
|
node * n = r3_tree_create(10);
|
||||||
|
|
||||||
node * child = rtree_create(3);
|
node * child = r3_tree_create(3);
|
||||||
|
|
||||||
fail_if( rtree_add_child(n, strdup("/add") , child) == FALSE );
|
fail_if( r3_tree_add_child(n, strdup("/add") , child) == FALSE );
|
||||||
|
|
||||||
fail_if( node_find_edge(n, "/add") == NULL );
|
fail_if( r3_node_find_edge(n, "/add") == NULL );
|
||||||
fail_if( node_find_edge(n, "/bar") != NULL );
|
fail_if( r3_node_find_edge(n, "/bar") != NULL );
|
||||||
|
|
||||||
rtree_free(n);
|
r3_tree_free(n);
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
@ -77,35 +77,35 @@ START_TEST (test_compile)
|
||||||
{
|
{
|
||||||
str_array *t;
|
str_array *t;
|
||||||
node * n;
|
node * n;
|
||||||
n = rtree_create(10);
|
n = r3_tree_create(10);
|
||||||
|
|
||||||
|
|
||||||
match_entry * entry;
|
match_entry * entry;
|
||||||
node *m;
|
node *m;
|
||||||
edge *e ;
|
edge *e ;
|
||||||
|
|
||||||
rtree_insert_pathn(n, "/zoo", strlen("/zoo"), NULL);
|
r3_tree_insert_pathn(n, "/zoo", strlen("/zoo"), NULL);
|
||||||
rtree_insert_pathn(n, "/foo", strlen("/foo"), NULL);
|
r3_tree_insert_pathn(n, "/foo", strlen("/foo"), NULL);
|
||||||
rtree_insert_pathn(n, "/bar", strlen("/bar"), NULL);
|
r3_tree_insert_pathn(n, "/bar", strlen("/bar"), NULL);
|
||||||
rtree_compile(n);
|
r3_tree_compile(n);
|
||||||
fail_if( n->combined_pattern );
|
fail_if( n->combined_pattern );
|
||||||
fail_if( NULL == node_find_edge_str(n, "/", strlen("/") ) );
|
fail_if( NULL == r3_node_find_edge_str(n, "/", strlen("/") ) );
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
rtree_dump(n, 0);
|
r3_tree_dump(n, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rtree_insert_pathn(n, "/foo/{id}", strlen("/foo/{id}"), NULL);
|
r3_tree_insert_pathn(n, "/foo/{id}", strlen("/foo/{id}"), NULL);
|
||||||
rtree_insert_pathn(n, "/{id}", strlen("/{id}"), NULL);
|
r3_tree_insert_pathn(n, "/{id}", strlen("/{id}"), NULL);
|
||||||
rtree_compile(n);
|
r3_tree_compile(n);
|
||||||
rtree_compile(n); // test double compile
|
r3_tree_compile(n); // test double compile
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
rtree_dump(n, 0);
|
r3_tree_dump(n, 0);
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
fail_if(n->edges[0]->child->combined_pattern == NULL);
|
fail_if(n->edges[0]->child->combined_pattern == NULL);
|
||||||
|
|
||||||
e = node_find_edge_str(n, "/", strlen("/") );
|
e = r3_node_find_edge_str(n, "/", strlen("/") );
|
||||||
fail_if( NULL == e );
|
fail_if( NULL == e );
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
|
@ -118,22 +118,22 @@ START_TEST (test_compile)
|
||||||
entry = calloc( sizeof(entry) , 1 );
|
entry = calloc( sizeof(entry) , 1 );
|
||||||
|
|
||||||
|
|
||||||
m = rtree_match( n , "/foo", strlen("/foo"), entry);
|
m = r3_tree_match( n , "/foo", strlen("/foo"), entry);
|
||||||
fail_if( NULL == m );
|
fail_if( NULL == m );
|
||||||
|
|
||||||
m = rtree_match( n , "/zoo", strlen("/zoo"), entry);
|
m = r3_tree_match( n , "/zoo", strlen("/zoo"), entry);
|
||||||
fail_if( NULL == m );
|
fail_if( NULL == m );
|
||||||
|
|
||||||
m = rtree_match( n , "/bar", strlen("/bar"), entry);
|
m = r3_tree_match( n , "/bar", strlen("/bar"), entry);
|
||||||
fail_if( NULL == m );
|
fail_if( NULL == m );
|
||||||
|
|
||||||
m = rtree_match( n , "/xxx", strlen("/xxx"), entry);
|
m = r3_tree_match( n , "/xxx", strlen("/xxx"), entry);
|
||||||
fail_if( NULL == m );
|
fail_if( NULL == m );
|
||||||
|
|
||||||
m = rtree_match( n , "/foo/xxx", strlen("/foo/xxx"), entry);
|
m = r3_tree_match( n , "/foo/xxx", strlen("/foo/xxx"), entry);
|
||||||
fail_if( NULL == m );
|
fail_if( NULL == m );
|
||||||
|
|
||||||
m = rtree_match( n , "/some_id", strlen("/some_id"), entry);
|
m = r3_tree_match( n , "/some_id", strlen("/some_id"), entry);
|
||||||
fail_if( NULL == m );
|
fail_if( NULL == m );
|
||||||
ck_assert_int_gt( m->endpoint , 0 ); // should not be an endpoint
|
ck_assert_int_gt( m->endpoint , 0 ); // should not be an endpoint
|
||||||
}
|
}
|
||||||
|
@ -184,38 +184,38 @@ START_TEST (test_compile_slug)
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
|
||||||
START_TEST (test_rtree_insert_pathn)
|
START_TEST (test_r3_tree_insert_pathn)
|
||||||
{
|
{
|
||||||
node * n = rtree_create(10);
|
node * n = r3_tree_create(10);
|
||||||
|
|
||||||
info("Inserting /foo/bar\n");
|
info("Inserting /foo/bar\n");
|
||||||
rtree_insert_path(n, "/foo/bar", NULL);
|
r3_tree_insert_path(n, "/foo/bar", NULL);
|
||||||
// rtree_dump(n, 0);
|
// r3_tree_dump(n, 0);
|
||||||
|
|
||||||
info("Inserting /foo/zoo\n");
|
info("Inserting /foo/zoo\n");
|
||||||
rtree_insert_path(n, "/foo/zoo", NULL);
|
r3_tree_insert_path(n, "/foo/zoo", NULL);
|
||||||
// rtree_dump(n, 0);
|
// r3_tree_dump(n, 0);
|
||||||
|
|
||||||
info("Inserting /f/id\n");
|
info("Inserting /f/id\n");
|
||||||
rtree_insert_path(n, "/f/id" , NULL);
|
r3_tree_insert_path(n, "/f/id" , NULL);
|
||||||
// rtree_dump(n, 0);
|
// r3_tree_dump(n, 0);
|
||||||
|
|
||||||
info("Inserting /post/{id}\n");
|
info("Inserting /post/{id}\n");
|
||||||
rtree_insert_pathn(n, "/post/{id}", strlen("/post/{id}"), NULL);
|
r3_tree_insert_pathn(n, "/post/{id}", strlen("/post/{id}"), NULL);
|
||||||
// rtree_dump(n, 0);
|
// r3_tree_dump(n, 0);
|
||||||
|
|
||||||
info("Inserting /post/{handle}\n");
|
info("Inserting /post/{handle}\n");
|
||||||
rtree_insert_pathn(n, "/post/{handle}", strlen("/post/{handle}"), NULL);
|
r3_tree_insert_pathn(n, "/post/{handle}", strlen("/post/{handle}"), NULL);
|
||||||
// rtree_dump(n, 0);
|
// r3_tree_dump(n, 0);
|
||||||
|
|
||||||
info("Inserting /post/{handle}-{id}\n");
|
info("Inserting /post/{handle}-{id}\n");
|
||||||
rtree_insert_pathn(n, "/post/{handle}-{id}", strlen("/post/{handle}-{id}"), NULL);
|
r3_tree_insert_pathn(n, "/post/{handle}-{id}", strlen("/post/{handle}-{id}"), NULL);
|
||||||
rtree_compile(n);
|
r3_tree_compile(n);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
rtree_dump(n, 0);
|
r3_tree_dump(n, 0);
|
||||||
#endif
|
#endif
|
||||||
rtree_free(n);
|
r3_tree_free(n);
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
@ -284,353 +284,353 @@ END_TEST
|
||||||
START_TEST(benchmark_str)
|
START_TEST(benchmark_str)
|
||||||
{
|
{
|
||||||
match_entry * entry = calloc( sizeof(entry) , 1 );
|
match_entry * entry = calloc( sizeof(entry) , 1 );
|
||||||
node * n = rtree_create(1);
|
node * n = r3_tree_create(1);
|
||||||
|
|
||||||
rtree_insert_path(n, "/foo/bar/baz", NULL);
|
r3_tree_insert_path(n, "/foo/bar/baz", NULL);
|
||||||
rtree_insert_path(n, "/foo/bar/qux", NULL);
|
r3_tree_insert_path(n, "/foo/bar/qux", NULL);
|
||||||
rtree_insert_path(n, "/foo/bar/quux", NULL);
|
r3_tree_insert_path(n, "/foo/bar/quux", NULL);
|
||||||
rtree_insert_path(n, "/foo/bar/corge", NULL);
|
r3_tree_insert_path(n, "/foo/bar/corge", NULL);
|
||||||
rtree_insert_path(n, "/foo/bar/grault", NULL);
|
r3_tree_insert_path(n, "/foo/bar/grault", NULL);
|
||||||
rtree_insert_path(n, "/foo/bar/garply", NULL);
|
r3_tree_insert_path(n, "/foo/bar/garply", NULL);
|
||||||
rtree_insert_path(n, "/foo/baz/bar", NULL);
|
r3_tree_insert_path(n, "/foo/baz/bar", NULL);
|
||||||
rtree_insert_path(n, "/foo/baz/qux", NULL);
|
r3_tree_insert_path(n, "/foo/baz/qux", NULL);
|
||||||
rtree_insert_path(n, "/foo/baz/quux", NULL);
|
r3_tree_insert_path(n, "/foo/baz/quux", NULL);
|
||||||
rtree_insert_path(n, "/foo/baz/corge", NULL);
|
r3_tree_insert_path(n, "/foo/baz/corge", NULL);
|
||||||
rtree_insert_path(n, "/foo/baz/grault", NULL);
|
r3_tree_insert_path(n, "/foo/baz/grault", NULL);
|
||||||
rtree_insert_path(n, "/foo/baz/garply", NULL);
|
r3_tree_insert_path(n, "/foo/baz/garply", NULL);
|
||||||
rtree_insert_path(n, "/foo/qux/bar", NULL);
|
r3_tree_insert_path(n, "/foo/qux/bar", NULL);
|
||||||
rtree_insert_path(n, "/foo/qux/baz", NULL);
|
r3_tree_insert_path(n, "/foo/qux/baz", NULL);
|
||||||
rtree_insert_path(n, "/foo/qux/quux", NULL);
|
r3_tree_insert_path(n, "/foo/qux/quux", NULL);
|
||||||
rtree_insert_path(n, "/foo/qux/corge", NULL);
|
r3_tree_insert_path(n, "/foo/qux/corge", NULL);
|
||||||
rtree_insert_path(n, "/foo/qux/grault", NULL);
|
r3_tree_insert_path(n, "/foo/qux/grault", NULL);
|
||||||
rtree_insert_path(n, "/foo/qux/garply", NULL);
|
r3_tree_insert_path(n, "/foo/qux/garply", NULL);
|
||||||
rtree_insert_path(n, "/foo/quux/bar", NULL);
|
r3_tree_insert_path(n, "/foo/quux/bar", NULL);
|
||||||
rtree_insert_path(n, "/foo/quux/baz", NULL);
|
r3_tree_insert_path(n, "/foo/quux/baz", NULL);
|
||||||
rtree_insert_path(n, "/foo/quux/qux", NULL);
|
r3_tree_insert_path(n, "/foo/quux/qux", NULL);
|
||||||
rtree_insert_path(n, "/foo/quux/corge", NULL);
|
r3_tree_insert_path(n, "/foo/quux/corge", NULL);
|
||||||
rtree_insert_path(n, "/foo/quux/grault", NULL);
|
r3_tree_insert_path(n, "/foo/quux/grault", NULL);
|
||||||
rtree_insert_path(n, "/foo/quux/garply", NULL);
|
r3_tree_insert_path(n, "/foo/quux/garply", NULL);
|
||||||
rtree_insert_path(n, "/foo/corge/bar", NULL);
|
r3_tree_insert_path(n, "/foo/corge/bar", NULL);
|
||||||
rtree_insert_path(n, "/foo/corge/baz", NULL);
|
r3_tree_insert_path(n, "/foo/corge/baz", NULL);
|
||||||
rtree_insert_path(n, "/foo/corge/qux", NULL);
|
r3_tree_insert_path(n, "/foo/corge/qux", NULL);
|
||||||
rtree_insert_path(n, "/foo/corge/quux", NULL);
|
r3_tree_insert_path(n, "/foo/corge/quux", NULL);
|
||||||
rtree_insert_path(n, "/foo/corge/grault", NULL);
|
r3_tree_insert_path(n, "/foo/corge/grault", NULL);
|
||||||
rtree_insert_path(n, "/foo/corge/garply", NULL);
|
r3_tree_insert_path(n, "/foo/corge/garply", NULL);
|
||||||
rtree_insert_path(n, "/foo/grault/bar", NULL);
|
r3_tree_insert_path(n, "/foo/grault/bar", NULL);
|
||||||
rtree_insert_path(n, "/foo/grault/baz", NULL);
|
r3_tree_insert_path(n, "/foo/grault/baz", NULL);
|
||||||
rtree_insert_path(n, "/foo/grault/qux", NULL);
|
r3_tree_insert_path(n, "/foo/grault/qux", NULL);
|
||||||
rtree_insert_path(n, "/foo/grault/quux", NULL);
|
r3_tree_insert_path(n, "/foo/grault/quux", NULL);
|
||||||
rtree_insert_path(n, "/foo/grault/corge", NULL);
|
r3_tree_insert_path(n, "/foo/grault/corge", NULL);
|
||||||
rtree_insert_path(n, "/foo/grault/garply", NULL);
|
r3_tree_insert_path(n, "/foo/grault/garply", NULL);
|
||||||
rtree_insert_path(n, "/foo/garply/bar", NULL);
|
r3_tree_insert_path(n, "/foo/garply/bar", NULL);
|
||||||
rtree_insert_path(n, "/foo/garply/baz", NULL);
|
r3_tree_insert_path(n, "/foo/garply/baz", NULL);
|
||||||
rtree_insert_path(n, "/foo/garply/qux", NULL);
|
r3_tree_insert_path(n, "/foo/garply/qux", NULL);
|
||||||
rtree_insert_path(n, "/foo/garply/quux", NULL);
|
r3_tree_insert_path(n, "/foo/garply/quux", NULL);
|
||||||
rtree_insert_path(n, "/foo/garply/corge", NULL);
|
r3_tree_insert_path(n, "/foo/garply/corge", NULL);
|
||||||
rtree_insert_path(n, "/foo/garply/grault", NULL);
|
r3_tree_insert_path(n, "/foo/garply/grault", NULL);
|
||||||
rtree_insert_path(n, "/bar/foo/baz", NULL);
|
r3_tree_insert_path(n, "/bar/foo/baz", NULL);
|
||||||
rtree_insert_path(n, "/bar/foo/qux", NULL);
|
r3_tree_insert_path(n, "/bar/foo/qux", NULL);
|
||||||
rtree_insert_path(n, "/bar/foo/quux", NULL);
|
r3_tree_insert_path(n, "/bar/foo/quux", NULL);
|
||||||
rtree_insert_path(n, "/bar/foo/corge", NULL);
|
r3_tree_insert_path(n, "/bar/foo/corge", NULL);
|
||||||
rtree_insert_path(n, "/bar/foo/grault", NULL);
|
r3_tree_insert_path(n, "/bar/foo/grault", NULL);
|
||||||
rtree_insert_path(n, "/bar/foo/garply", NULL);
|
r3_tree_insert_path(n, "/bar/foo/garply", NULL);
|
||||||
rtree_insert_path(n, "/bar/baz/foo", NULL);
|
r3_tree_insert_path(n, "/bar/baz/foo", NULL);
|
||||||
rtree_insert_path(n, "/bar/baz/qux", NULL);
|
r3_tree_insert_path(n, "/bar/baz/qux", NULL);
|
||||||
rtree_insert_path(n, "/bar/baz/quux", NULL);
|
r3_tree_insert_path(n, "/bar/baz/quux", NULL);
|
||||||
rtree_insert_path(n, "/bar/baz/corge", NULL);
|
r3_tree_insert_path(n, "/bar/baz/corge", NULL);
|
||||||
rtree_insert_path(n, "/bar/baz/grault", NULL);
|
r3_tree_insert_path(n, "/bar/baz/grault", NULL);
|
||||||
rtree_insert_path(n, "/bar/baz/garply", NULL);
|
r3_tree_insert_path(n, "/bar/baz/garply", NULL);
|
||||||
rtree_insert_path(n, "/bar/qux/foo", NULL);
|
r3_tree_insert_path(n, "/bar/qux/foo", NULL);
|
||||||
rtree_insert_path(n, "/bar/qux/baz", NULL);
|
r3_tree_insert_path(n, "/bar/qux/baz", NULL);
|
||||||
rtree_insert_path(n, "/bar/qux/quux", NULL);
|
r3_tree_insert_path(n, "/bar/qux/quux", NULL);
|
||||||
rtree_insert_path(n, "/bar/qux/corge", NULL);
|
r3_tree_insert_path(n, "/bar/qux/corge", NULL);
|
||||||
rtree_insert_path(n, "/bar/qux/grault", NULL);
|
r3_tree_insert_path(n, "/bar/qux/grault", NULL);
|
||||||
rtree_insert_path(n, "/bar/qux/garply", NULL);
|
r3_tree_insert_path(n, "/bar/qux/garply", NULL);
|
||||||
rtree_insert_path(n, "/bar/quux/foo", NULL);
|
r3_tree_insert_path(n, "/bar/quux/foo", NULL);
|
||||||
rtree_insert_path(n, "/bar/quux/baz", NULL);
|
r3_tree_insert_path(n, "/bar/quux/baz", NULL);
|
||||||
rtree_insert_path(n, "/bar/quux/qux", NULL);
|
r3_tree_insert_path(n, "/bar/quux/qux", NULL);
|
||||||
rtree_insert_path(n, "/bar/quux/corge", NULL);
|
r3_tree_insert_path(n, "/bar/quux/corge", NULL);
|
||||||
rtree_insert_path(n, "/bar/quux/grault", NULL);
|
r3_tree_insert_path(n, "/bar/quux/grault", NULL);
|
||||||
rtree_insert_path(n, "/bar/quux/garply", NULL);
|
r3_tree_insert_path(n, "/bar/quux/garply", NULL);
|
||||||
rtree_insert_path(n, "/bar/corge/foo", NULL);
|
r3_tree_insert_path(n, "/bar/corge/foo", NULL);
|
||||||
rtree_insert_path(n, "/bar/corge/baz", NULL);
|
r3_tree_insert_path(n, "/bar/corge/baz", NULL);
|
||||||
rtree_insert_path(n, "/bar/corge/qux", NULL);
|
r3_tree_insert_path(n, "/bar/corge/qux", NULL);
|
||||||
rtree_insert_path(n, "/bar/corge/quux", NULL);
|
r3_tree_insert_path(n, "/bar/corge/quux", NULL);
|
||||||
rtree_insert_path(n, "/bar/corge/grault", NULL);
|
r3_tree_insert_path(n, "/bar/corge/grault", NULL);
|
||||||
rtree_insert_path(n, "/bar/corge/garply", NULL);
|
r3_tree_insert_path(n, "/bar/corge/garply", NULL);
|
||||||
rtree_insert_path(n, "/bar/grault/foo", NULL);
|
r3_tree_insert_path(n, "/bar/grault/foo", NULL);
|
||||||
rtree_insert_path(n, "/bar/grault/baz", NULL);
|
r3_tree_insert_path(n, "/bar/grault/baz", NULL);
|
||||||
rtree_insert_path(n, "/bar/grault/qux", NULL);
|
r3_tree_insert_path(n, "/bar/grault/qux", NULL);
|
||||||
rtree_insert_path(n, "/bar/grault/quux", NULL);
|
r3_tree_insert_path(n, "/bar/grault/quux", NULL);
|
||||||
rtree_insert_path(n, "/bar/grault/corge", NULL);
|
r3_tree_insert_path(n, "/bar/grault/corge", NULL);
|
||||||
rtree_insert_path(n, "/bar/grault/garply", NULL);
|
r3_tree_insert_path(n, "/bar/grault/garply", NULL);
|
||||||
rtree_insert_path(n, "/bar/garply/foo", NULL);
|
r3_tree_insert_path(n, "/bar/garply/foo", NULL);
|
||||||
rtree_insert_path(n, "/bar/garply/baz", NULL);
|
r3_tree_insert_path(n, "/bar/garply/baz", NULL);
|
||||||
rtree_insert_path(n, "/bar/garply/qux", NULL);
|
r3_tree_insert_path(n, "/bar/garply/qux", NULL);
|
||||||
rtree_insert_path(n, "/bar/garply/quux", NULL);
|
r3_tree_insert_path(n, "/bar/garply/quux", NULL);
|
||||||
rtree_insert_path(n, "/bar/garply/corge", NULL);
|
r3_tree_insert_path(n, "/bar/garply/corge", NULL);
|
||||||
rtree_insert_path(n, "/bar/garply/grault", NULL);
|
r3_tree_insert_path(n, "/bar/garply/grault", NULL);
|
||||||
rtree_insert_path(n, "/baz/foo/bar", NULL);
|
r3_tree_insert_path(n, "/baz/foo/bar", NULL);
|
||||||
rtree_insert_path(n, "/baz/foo/qux", NULL);
|
r3_tree_insert_path(n, "/baz/foo/qux", NULL);
|
||||||
rtree_insert_path(n, "/baz/foo/quux", NULL);
|
r3_tree_insert_path(n, "/baz/foo/quux", NULL);
|
||||||
rtree_insert_path(n, "/baz/foo/corge", NULL);
|
r3_tree_insert_path(n, "/baz/foo/corge", NULL);
|
||||||
rtree_insert_path(n, "/baz/foo/grault", NULL);
|
r3_tree_insert_path(n, "/baz/foo/grault", NULL);
|
||||||
rtree_insert_path(n, "/baz/foo/garply", NULL);
|
r3_tree_insert_path(n, "/baz/foo/garply", NULL);
|
||||||
rtree_insert_path(n, "/baz/bar/foo", NULL);
|
r3_tree_insert_path(n, "/baz/bar/foo", NULL);
|
||||||
rtree_insert_path(n, "/baz/bar/qux", NULL);
|
r3_tree_insert_path(n, "/baz/bar/qux", NULL);
|
||||||
rtree_insert_path(n, "/baz/bar/quux", NULL);
|
r3_tree_insert_path(n, "/baz/bar/quux", NULL);
|
||||||
rtree_insert_path(n, "/baz/bar/corge", NULL);
|
r3_tree_insert_path(n, "/baz/bar/corge", NULL);
|
||||||
rtree_insert_path(n, "/baz/bar/grault", NULL);
|
r3_tree_insert_path(n, "/baz/bar/grault", NULL);
|
||||||
rtree_insert_path(n, "/baz/bar/garply", NULL);
|
r3_tree_insert_path(n, "/baz/bar/garply", NULL);
|
||||||
rtree_insert_path(n, "/baz/qux/foo", NULL);
|
r3_tree_insert_path(n, "/baz/qux/foo", NULL);
|
||||||
rtree_insert_path(n, "/baz/qux/bar", NULL);
|
r3_tree_insert_path(n, "/baz/qux/bar", NULL);
|
||||||
rtree_insert_path(n, "/baz/qux/quux", NULL);
|
r3_tree_insert_path(n, "/baz/qux/quux", NULL);
|
||||||
rtree_insert_path(n, "/baz/qux/corge", NULL);
|
r3_tree_insert_path(n, "/baz/qux/corge", NULL);
|
||||||
rtree_insert_path(n, "/baz/qux/grault", NULL);
|
r3_tree_insert_path(n, "/baz/qux/grault", NULL);
|
||||||
rtree_insert_path(n, "/baz/qux/garply", NULL);
|
r3_tree_insert_path(n, "/baz/qux/garply", NULL);
|
||||||
rtree_insert_path(n, "/baz/quux/foo", NULL);
|
r3_tree_insert_path(n, "/baz/quux/foo", NULL);
|
||||||
rtree_insert_path(n, "/baz/quux/bar", NULL);
|
r3_tree_insert_path(n, "/baz/quux/bar", NULL);
|
||||||
rtree_insert_path(n, "/baz/quux/qux", NULL);
|
r3_tree_insert_path(n, "/baz/quux/qux", NULL);
|
||||||
rtree_insert_path(n, "/baz/quux/corge", NULL);
|
r3_tree_insert_path(n, "/baz/quux/corge", NULL);
|
||||||
rtree_insert_path(n, "/baz/quux/grault", NULL);
|
r3_tree_insert_path(n, "/baz/quux/grault", NULL);
|
||||||
rtree_insert_path(n, "/baz/quux/garply", NULL);
|
r3_tree_insert_path(n, "/baz/quux/garply", NULL);
|
||||||
rtree_insert_path(n, "/baz/corge/foo", NULL);
|
r3_tree_insert_path(n, "/baz/corge/foo", NULL);
|
||||||
rtree_insert_path(n, "/baz/corge/bar", NULL);
|
r3_tree_insert_path(n, "/baz/corge/bar", NULL);
|
||||||
rtree_insert_path(n, "/baz/corge/qux", NULL);
|
r3_tree_insert_path(n, "/baz/corge/qux", NULL);
|
||||||
rtree_insert_path(n, "/baz/corge/quux", NULL);
|
r3_tree_insert_path(n, "/baz/corge/quux", NULL);
|
||||||
rtree_insert_path(n, "/baz/corge/grault", NULL);
|
r3_tree_insert_path(n, "/baz/corge/grault", NULL);
|
||||||
rtree_insert_path(n, "/baz/corge/garply", NULL);
|
r3_tree_insert_path(n, "/baz/corge/garply", NULL);
|
||||||
rtree_insert_path(n, "/baz/grault/foo", NULL);
|
r3_tree_insert_path(n, "/baz/grault/foo", NULL);
|
||||||
rtree_insert_path(n, "/baz/grault/bar", NULL);
|
r3_tree_insert_path(n, "/baz/grault/bar", NULL);
|
||||||
rtree_insert_path(n, "/baz/grault/qux", NULL);
|
r3_tree_insert_path(n, "/baz/grault/qux", NULL);
|
||||||
rtree_insert_path(n, "/baz/grault/quux", NULL);
|
r3_tree_insert_path(n, "/baz/grault/quux", NULL);
|
||||||
rtree_insert_path(n, "/baz/grault/corge", NULL);
|
r3_tree_insert_path(n, "/baz/grault/corge", NULL);
|
||||||
rtree_insert_path(n, "/baz/grault/garply", NULL);
|
r3_tree_insert_path(n, "/baz/grault/garply", NULL);
|
||||||
rtree_insert_path(n, "/baz/garply/foo", NULL);
|
r3_tree_insert_path(n, "/baz/garply/foo", NULL);
|
||||||
rtree_insert_path(n, "/baz/garply/bar", NULL);
|
r3_tree_insert_path(n, "/baz/garply/bar", NULL);
|
||||||
rtree_insert_path(n, "/baz/garply/qux", NULL);
|
r3_tree_insert_path(n, "/baz/garply/qux", NULL);
|
||||||
rtree_insert_path(n, "/baz/garply/quux", NULL);
|
r3_tree_insert_path(n, "/baz/garply/quux", NULL);
|
||||||
rtree_insert_path(n, "/baz/garply/corge", NULL);
|
r3_tree_insert_path(n, "/baz/garply/corge", NULL);
|
||||||
rtree_insert_path(n, "/baz/garply/grault", NULL);
|
r3_tree_insert_path(n, "/baz/garply/grault", NULL);
|
||||||
rtree_insert_path(n, "/qux/foo/bar", NULL);
|
r3_tree_insert_path(n, "/qux/foo/bar", NULL);
|
||||||
rtree_insert_path(n, "/qux/foo/baz", NULL);
|
r3_tree_insert_path(n, "/qux/foo/baz", NULL);
|
||||||
rtree_insert_path(n, "/qux/foo/quux", NULL);
|
r3_tree_insert_path(n, "/qux/foo/quux", NULL);
|
||||||
rtree_insert_path(n, "/qux/foo/corge", NULL);
|
r3_tree_insert_path(n, "/qux/foo/corge", NULL);
|
||||||
rtree_insert_path(n, "/qux/foo/grault", NULL);
|
r3_tree_insert_path(n, "/qux/foo/grault", NULL);
|
||||||
rtree_insert_path(n, "/qux/foo/garply", NULL);
|
r3_tree_insert_path(n, "/qux/foo/garply", NULL);
|
||||||
rtree_insert_path(n, "/qux/bar/foo", NULL);
|
r3_tree_insert_path(n, "/qux/bar/foo", NULL);
|
||||||
rtree_insert_path(n, "/qux/bar/baz", NULL);
|
r3_tree_insert_path(n, "/qux/bar/baz", NULL);
|
||||||
rtree_insert_path(n, "/qux/bar/quux", NULL);
|
r3_tree_insert_path(n, "/qux/bar/quux", NULL);
|
||||||
rtree_insert_path(n, "/qux/bar/corge", (void*) 999);
|
r3_tree_insert_path(n, "/qux/bar/corge", (void*) 999);
|
||||||
rtree_insert_path(n, "/qux/bar/grault", NULL);
|
r3_tree_insert_path(n, "/qux/bar/grault", NULL);
|
||||||
rtree_insert_path(n, "/qux/bar/garply", NULL);
|
r3_tree_insert_path(n, "/qux/bar/garply", NULL);
|
||||||
rtree_insert_path(n, "/qux/baz/foo", NULL);
|
r3_tree_insert_path(n, "/qux/baz/foo", NULL);
|
||||||
rtree_insert_path(n, "/qux/baz/bar", NULL);
|
r3_tree_insert_path(n, "/qux/baz/bar", NULL);
|
||||||
rtree_insert_path(n, "/qux/baz/quux", NULL);
|
r3_tree_insert_path(n, "/qux/baz/quux", NULL);
|
||||||
rtree_insert_path(n, "/qux/baz/corge", NULL);
|
r3_tree_insert_path(n, "/qux/baz/corge", NULL);
|
||||||
rtree_insert_path(n, "/qux/baz/grault", NULL);
|
r3_tree_insert_path(n, "/qux/baz/grault", NULL);
|
||||||
rtree_insert_path(n, "/qux/baz/garply", NULL);
|
r3_tree_insert_path(n, "/qux/baz/garply", NULL);
|
||||||
rtree_insert_path(n, "/qux/quux/foo", NULL);
|
r3_tree_insert_path(n, "/qux/quux/foo", NULL);
|
||||||
rtree_insert_path(n, "/qux/quux/bar", NULL);
|
r3_tree_insert_path(n, "/qux/quux/bar", NULL);
|
||||||
rtree_insert_path(n, "/qux/quux/baz", NULL);
|
r3_tree_insert_path(n, "/qux/quux/baz", NULL);
|
||||||
rtree_insert_path(n, "/qux/quux/corge", NULL);
|
r3_tree_insert_path(n, "/qux/quux/corge", NULL);
|
||||||
rtree_insert_path(n, "/qux/quux/grault", NULL);
|
r3_tree_insert_path(n, "/qux/quux/grault", NULL);
|
||||||
rtree_insert_path(n, "/qux/quux/garply", NULL);
|
r3_tree_insert_path(n, "/qux/quux/garply", NULL);
|
||||||
rtree_insert_path(n, "/qux/corge/foo", NULL);
|
r3_tree_insert_path(n, "/qux/corge/foo", NULL);
|
||||||
rtree_insert_path(n, "/qux/corge/bar", NULL);
|
r3_tree_insert_path(n, "/qux/corge/bar", NULL);
|
||||||
rtree_insert_path(n, "/qux/corge/baz", NULL);
|
r3_tree_insert_path(n, "/qux/corge/baz", NULL);
|
||||||
rtree_insert_path(n, "/qux/corge/quux", NULL);
|
r3_tree_insert_path(n, "/qux/corge/quux", NULL);
|
||||||
rtree_insert_path(n, "/qux/corge/grault", NULL);
|
r3_tree_insert_path(n, "/qux/corge/grault", NULL);
|
||||||
rtree_insert_path(n, "/qux/corge/garply", NULL);
|
r3_tree_insert_path(n, "/qux/corge/garply", NULL);
|
||||||
rtree_insert_path(n, "/qux/grault/foo", NULL);
|
r3_tree_insert_path(n, "/qux/grault/foo", NULL);
|
||||||
rtree_insert_path(n, "/qux/grault/bar", NULL);
|
r3_tree_insert_path(n, "/qux/grault/bar", NULL);
|
||||||
rtree_insert_path(n, "/qux/grault/baz", NULL);
|
r3_tree_insert_path(n, "/qux/grault/baz", NULL);
|
||||||
rtree_insert_path(n, "/qux/grault/quux", NULL);
|
r3_tree_insert_path(n, "/qux/grault/quux", NULL);
|
||||||
rtree_insert_path(n, "/qux/grault/corge", NULL);
|
r3_tree_insert_path(n, "/qux/grault/corge", NULL);
|
||||||
rtree_insert_path(n, "/qux/grault/garply", NULL);
|
r3_tree_insert_path(n, "/qux/grault/garply", NULL);
|
||||||
rtree_insert_path(n, "/qux/garply/foo", NULL);
|
r3_tree_insert_path(n, "/qux/garply/foo", NULL);
|
||||||
rtree_insert_path(n, "/qux/garply/bar", NULL);
|
r3_tree_insert_path(n, "/qux/garply/bar", NULL);
|
||||||
rtree_insert_path(n, "/qux/garply/baz", NULL);
|
r3_tree_insert_path(n, "/qux/garply/baz", NULL);
|
||||||
rtree_insert_path(n, "/qux/garply/quux", NULL);
|
r3_tree_insert_path(n, "/qux/garply/quux", NULL);
|
||||||
rtree_insert_path(n, "/qux/garply/corge", NULL);
|
r3_tree_insert_path(n, "/qux/garply/corge", NULL);
|
||||||
rtree_insert_path(n, "/qux/garply/grault", NULL);
|
r3_tree_insert_path(n, "/qux/garply/grault", NULL);
|
||||||
rtree_insert_path(n, "/quux/foo/bar", NULL);
|
r3_tree_insert_path(n, "/quux/foo/bar", NULL);
|
||||||
rtree_insert_path(n, "/quux/foo/baz", NULL);
|
r3_tree_insert_path(n, "/quux/foo/baz", NULL);
|
||||||
rtree_insert_path(n, "/quux/foo/qux", NULL);
|
r3_tree_insert_path(n, "/quux/foo/qux", NULL);
|
||||||
rtree_insert_path(n, "/quux/foo/corge", NULL);
|
r3_tree_insert_path(n, "/quux/foo/corge", NULL);
|
||||||
rtree_insert_path(n, "/quux/foo/grault", NULL);
|
r3_tree_insert_path(n, "/quux/foo/grault", NULL);
|
||||||
rtree_insert_path(n, "/quux/foo/garply", NULL);
|
r3_tree_insert_path(n, "/quux/foo/garply", NULL);
|
||||||
rtree_insert_path(n, "/quux/bar/foo", NULL);
|
r3_tree_insert_path(n, "/quux/bar/foo", NULL);
|
||||||
rtree_insert_path(n, "/quux/bar/baz", NULL);
|
r3_tree_insert_path(n, "/quux/bar/baz", NULL);
|
||||||
rtree_insert_path(n, "/quux/bar/qux", NULL);
|
r3_tree_insert_path(n, "/quux/bar/qux", NULL);
|
||||||
rtree_insert_path(n, "/quux/bar/corge", NULL);
|
r3_tree_insert_path(n, "/quux/bar/corge", NULL);
|
||||||
rtree_insert_path(n, "/quux/bar/grault", NULL);
|
r3_tree_insert_path(n, "/quux/bar/grault", NULL);
|
||||||
rtree_insert_path(n, "/quux/bar/garply", NULL);
|
r3_tree_insert_path(n, "/quux/bar/garply", NULL);
|
||||||
rtree_insert_path(n, "/quux/baz/foo", NULL);
|
r3_tree_insert_path(n, "/quux/baz/foo", NULL);
|
||||||
rtree_insert_path(n, "/quux/baz/bar", NULL);
|
r3_tree_insert_path(n, "/quux/baz/bar", NULL);
|
||||||
rtree_insert_path(n, "/quux/baz/qux", NULL);
|
r3_tree_insert_path(n, "/quux/baz/qux", NULL);
|
||||||
rtree_insert_path(n, "/quux/baz/corge", NULL);
|
r3_tree_insert_path(n, "/quux/baz/corge", NULL);
|
||||||
rtree_insert_path(n, "/quux/baz/grault", NULL);
|
r3_tree_insert_path(n, "/quux/baz/grault", NULL);
|
||||||
rtree_insert_path(n, "/quux/baz/garply", NULL);
|
r3_tree_insert_path(n, "/quux/baz/garply", NULL);
|
||||||
rtree_insert_path(n, "/quux/qux/foo", NULL);
|
r3_tree_insert_path(n, "/quux/qux/foo", NULL);
|
||||||
rtree_insert_path(n, "/quux/qux/bar", NULL);
|
r3_tree_insert_path(n, "/quux/qux/bar", NULL);
|
||||||
rtree_insert_path(n, "/quux/qux/baz", NULL);
|
r3_tree_insert_path(n, "/quux/qux/baz", NULL);
|
||||||
rtree_insert_path(n, "/quux/qux/corge", NULL);
|
r3_tree_insert_path(n, "/quux/qux/corge", NULL);
|
||||||
rtree_insert_path(n, "/quux/qux/grault", NULL);
|
r3_tree_insert_path(n, "/quux/qux/grault", NULL);
|
||||||
rtree_insert_path(n, "/quux/qux/garply", NULL);
|
r3_tree_insert_path(n, "/quux/qux/garply", NULL);
|
||||||
rtree_insert_path(n, "/quux/corge/foo", NULL);
|
r3_tree_insert_path(n, "/quux/corge/foo", NULL);
|
||||||
rtree_insert_path(n, "/quux/corge/bar", NULL);
|
r3_tree_insert_path(n, "/quux/corge/bar", NULL);
|
||||||
rtree_insert_path(n, "/quux/corge/baz", NULL);
|
r3_tree_insert_path(n, "/quux/corge/baz", NULL);
|
||||||
rtree_insert_path(n, "/quux/corge/qux", NULL);
|
r3_tree_insert_path(n, "/quux/corge/qux", NULL);
|
||||||
rtree_insert_path(n, "/quux/corge/grault", NULL);
|
r3_tree_insert_path(n, "/quux/corge/grault", NULL);
|
||||||
rtree_insert_path(n, "/quux/corge/garply", NULL);
|
r3_tree_insert_path(n, "/quux/corge/garply", NULL);
|
||||||
rtree_insert_path(n, "/quux/grault/foo", NULL);
|
r3_tree_insert_path(n, "/quux/grault/foo", NULL);
|
||||||
rtree_insert_path(n, "/quux/grault/bar", NULL);
|
r3_tree_insert_path(n, "/quux/grault/bar", NULL);
|
||||||
rtree_insert_path(n, "/quux/grault/baz", NULL);
|
r3_tree_insert_path(n, "/quux/grault/baz", NULL);
|
||||||
rtree_insert_path(n, "/quux/grault/qux", NULL);
|
r3_tree_insert_path(n, "/quux/grault/qux", NULL);
|
||||||
rtree_insert_path(n, "/quux/grault/corge", NULL);
|
r3_tree_insert_path(n, "/quux/grault/corge", NULL);
|
||||||
rtree_insert_path(n, "/quux/grault/garply", NULL);
|
r3_tree_insert_path(n, "/quux/grault/garply", NULL);
|
||||||
rtree_insert_path(n, "/quux/garply/foo", NULL);
|
r3_tree_insert_path(n, "/quux/garply/foo", NULL);
|
||||||
rtree_insert_path(n, "/quux/garply/bar", NULL);
|
r3_tree_insert_path(n, "/quux/garply/bar", NULL);
|
||||||
rtree_insert_path(n, "/quux/garply/baz", NULL);
|
r3_tree_insert_path(n, "/quux/garply/baz", NULL);
|
||||||
rtree_insert_path(n, "/quux/garply/qux", NULL);
|
r3_tree_insert_path(n, "/quux/garply/qux", NULL);
|
||||||
rtree_insert_path(n, "/quux/garply/corge", NULL);
|
r3_tree_insert_path(n, "/quux/garply/corge", NULL);
|
||||||
rtree_insert_path(n, "/quux/garply/grault", NULL);
|
r3_tree_insert_path(n, "/quux/garply/grault", NULL);
|
||||||
rtree_insert_path(n, "/corge/foo/bar", NULL);
|
r3_tree_insert_path(n, "/corge/foo/bar", NULL);
|
||||||
rtree_insert_path(n, "/corge/foo/baz", NULL);
|
r3_tree_insert_path(n, "/corge/foo/baz", NULL);
|
||||||
rtree_insert_path(n, "/corge/foo/qux", NULL);
|
r3_tree_insert_path(n, "/corge/foo/qux", NULL);
|
||||||
rtree_insert_path(n, "/corge/foo/quux", NULL);
|
r3_tree_insert_path(n, "/corge/foo/quux", NULL);
|
||||||
rtree_insert_path(n, "/corge/foo/grault", NULL);
|
r3_tree_insert_path(n, "/corge/foo/grault", NULL);
|
||||||
rtree_insert_path(n, "/corge/foo/garply", NULL);
|
r3_tree_insert_path(n, "/corge/foo/garply", NULL);
|
||||||
rtree_insert_path(n, "/corge/bar/foo", NULL);
|
r3_tree_insert_path(n, "/corge/bar/foo", NULL);
|
||||||
rtree_insert_path(n, "/corge/bar/baz", NULL);
|
r3_tree_insert_path(n, "/corge/bar/baz", NULL);
|
||||||
rtree_insert_path(n, "/corge/bar/qux", NULL);
|
r3_tree_insert_path(n, "/corge/bar/qux", NULL);
|
||||||
rtree_insert_path(n, "/corge/bar/quux", NULL);
|
r3_tree_insert_path(n, "/corge/bar/quux", NULL);
|
||||||
rtree_insert_path(n, "/corge/bar/grault", NULL);
|
r3_tree_insert_path(n, "/corge/bar/grault", NULL);
|
||||||
rtree_insert_path(n, "/corge/bar/garply", NULL);
|
r3_tree_insert_path(n, "/corge/bar/garply", NULL);
|
||||||
rtree_insert_path(n, "/corge/baz/foo", NULL);
|
r3_tree_insert_path(n, "/corge/baz/foo", NULL);
|
||||||
rtree_insert_path(n, "/corge/baz/bar", NULL);
|
r3_tree_insert_path(n, "/corge/baz/bar", NULL);
|
||||||
rtree_insert_path(n, "/corge/baz/qux", NULL);
|
r3_tree_insert_path(n, "/corge/baz/qux", NULL);
|
||||||
rtree_insert_path(n, "/corge/baz/quux", NULL);
|
r3_tree_insert_path(n, "/corge/baz/quux", NULL);
|
||||||
rtree_insert_path(n, "/corge/baz/grault", NULL);
|
r3_tree_insert_path(n, "/corge/baz/grault", NULL);
|
||||||
rtree_insert_path(n, "/corge/baz/garply", NULL);
|
r3_tree_insert_path(n, "/corge/baz/garply", NULL);
|
||||||
rtree_insert_path(n, "/corge/qux/foo", NULL);
|
r3_tree_insert_path(n, "/corge/qux/foo", NULL);
|
||||||
rtree_insert_path(n, "/corge/qux/bar", NULL);
|
r3_tree_insert_path(n, "/corge/qux/bar", NULL);
|
||||||
rtree_insert_path(n, "/corge/qux/baz", NULL);
|
r3_tree_insert_path(n, "/corge/qux/baz", NULL);
|
||||||
rtree_insert_path(n, "/corge/qux/quux", NULL);
|
r3_tree_insert_path(n, "/corge/qux/quux", NULL);
|
||||||
rtree_insert_path(n, "/corge/qux/grault", NULL);
|
r3_tree_insert_path(n, "/corge/qux/grault", NULL);
|
||||||
rtree_insert_path(n, "/corge/qux/garply", NULL);
|
r3_tree_insert_path(n, "/corge/qux/garply", NULL);
|
||||||
rtree_insert_path(n, "/corge/quux/foo", NULL);
|
r3_tree_insert_path(n, "/corge/quux/foo", NULL);
|
||||||
rtree_insert_path(n, "/corge/quux/bar", NULL);
|
r3_tree_insert_path(n, "/corge/quux/bar", NULL);
|
||||||
rtree_insert_path(n, "/corge/quux/baz", NULL);
|
r3_tree_insert_path(n, "/corge/quux/baz", NULL);
|
||||||
rtree_insert_path(n, "/corge/quux/qux", NULL);
|
r3_tree_insert_path(n, "/corge/quux/qux", NULL);
|
||||||
rtree_insert_path(n, "/corge/quux/grault", NULL);
|
r3_tree_insert_path(n, "/corge/quux/grault", NULL);
|
||||||
rtree_insert_path(n, "/corge/quux/garply", NULL);
|
r3_tree_insert_path(n, "/corge/quux/garply", NULL);
|
||||||
rtree_insert_path(n, "/corge/grault/foo", NULL);
|
r3_tree_insert_path(n, "/corge/grault/foo", NULL);
|
||||||
rtree_insert_path(n, "/corge/grault/bar", NULL);
|
r3_tree_insert_path(n, "/corge/grault/bar", NULL);
|
||||||
rtree_insert_path(n, "/corge/grault/baz", NULL);
|
r3_tree_insert_path(n, "/corge/grault/baz", NULL);
|
||||||
rtree_insert_path(n, "/corge/grault/qux", NULL);
|
r3_tree_insert_path(n, "/corge/grault/qux", NULL);
|
||||||
rtree_insert_path(n, "/corge/grault/quux", NULL);
|
r3_tree_insert_path(n, "/corge/grault/quux", NULL);
|
||||||
rtree_insert_path(n, "/corge/grault/garply", NULL);
|
r3_tree_insert_path(n, "/corge/grault/garply", NULL);
|
||||||
rtree_insert_path(n, "/corge/garply/foo", NULL);
|
r3_tree_insert_path(n, "/corge/garply/foo", NULL);
|
||||||
rtree_insert_path(n, "/corge/garply/bar", NULL);
|
r3_tree_insert_path(n, "/corge/garply/bar", NULL);
|
||||||
rtree_insert_path(n, "/corge/garply/baz", NULL);
|
r3_tree_insert_path(n, "/corge/garply/baz", NULL);
|
||||||
rtree_insert_path(n, "/corge/garply/qux", NULL);
|
r3_tree_insert_path(n, "/corge/garply/qux", NULL);
|
||||||
rtree_insert_path(n, "/corge/garply/quux", NULL);
|
r3_tree_insert_path(n, "/corge/garply/quux", NULL);
|
||||||
rtree_insert_path(n, "/corge/garply/grault", NULL);
|
r3_tree_insert_path(n, "/corge/garply/grault", NULL);
|
||||||
rtree_insert_path(n, "/grault/foo/bar", NULL);
|
r3_tree_insert_path(n, "/grault/foo/bar", NULL);
|
||||||
rtree_insert_path(n, "/grault/foo/baz", NULL);
|
r3_tree_insert_path(n, "/grault/foo/baz", NULL);
|
||||||
rtree_insert_path(n, "/grault/foo/qux", NULL);
|
r3_tree_insert_path(n, "/grault/foo/qux", NULL);
|
||||||
rtree_insert_path(n, "/grault/foo/quux", NULL);
|
r3_tree_insert_path(n, "/grault/foo/quux", NULL);
|
||||||
rtree_insert_path(n, "/grault/foo/corge", NULL);
|
r3_tree_insert_path(n, "/grault/foo/corge", NULL);
|
||||||
rtree_insert_path(n, "/grault/foo/garply", NULL);
|
r3_tree_insert_path(n, "/grault/foo/garply", NULL);
|
||||||
rtree_insert_path(n, "/grault/bar/foo", NULL);
|
r3_tree_insert_path(n, "/grault/bar/foo", NULL);
|
||||||
rtree_insert_path(n, "/grault/bar/baz", NULL);
|
r3_tree_insert_path(n, "/grault/bar/baz", NULL);
|
||||||
rtree_insert_path(n, "/grault/bar/qux", NULL);
|
r3_tree_insert_path(n, "/grault/bar/qux", NULL);
|
||||||
rtree_insert_path(n, "/grault/bar/quux", NULL);
|
r3_tree_insert_path(n, "/grault/bar/quux", NULL);
|
||||||
rtree_insert_path(n, "/grault/bar/corge", NULL);
|
r3_tree_insert_path(n, "/grault/bar/corge", NULL);
|
||||||
rtree_insert_path(n, "/grault/bar/garply", NULL);
|
r3_tree_insert_path(n, "/grault/bar/garply", NULL);
|
||||||
rtree_insert_path(n, "/grault/baz/foo", NULL);
|
r3_tree_insert_path(n, "/grault/baz/foo", NULL);
|
||||||
rtree_insert_path(n, "/grault/baz/bar", NULL);
|
r3_tree_insert_path(n, "/grault/baz/bar", NULL);
|
||||||
rtree_insert_path(n, "/grault/baz/qux", NULL);
|
r3_tree_insert_path(n, "/grault/baz/qux", NULL);
|
||||||
rtree_insert_path(n, "/grault/baz/quux", NULL);
|
r3_tree_insert_path(n, "/grault/baz/quux", NULL);
|
||||||
rtree_insert_path(n, "/grault/baz/corge", NULL);
|
r3_tree_insert_path(n, "/grault/baz/corge", NULL);
|
||||||
rtree_insert_path(n, "/grault/baz/garply", NULL);
|
r3_tree_insert_path(n, "/grault/baz/garply", NULL);
|
||||||
rtree_insert_path(n, "/grault/qux/foo", NULL);
|
r3_tree_insert_path(n, "/grault/qux/foo", NULL);
|
||||||
rtree_insert_path(n, "/grault/qux/bar", NULL);
|
r3_tree_insert_path(n, "/grault/qux/bar", NULL);
|
||||||
rtree_insert_path(n, "/grault/qux/baz", NULL);
|
r3_tree_insert_path(n, "/grault/qux/baz", NULL);
|
||||||
rtree_insert_path(n, "/grault/qux/quux", NULL);
|
r3_tree_insert_path(n, "/grault/qux/quux", NULL);
|
||||||
rtree_insert_path(n, "/grault/qux/corge", NULL);
|
r3_tree_insert_path(n, "/grault/qux/corge", NULL);
|
||||||
rtree_insert_path(n, "/grault/qux/garply", NULL);
|
r3_tree_insert_path(n, "/grault/qux/garply", NULL);
|
||||||
rtree_insert_path(n, "/grault/quux/foo", NULL);
|
r3_tree_insert_path(n, "/grault/quux/foo", NULL);
|
||||||
rtree_insert_path(n, "/grault/quux/bar", NULL);
|
r3_tree_insert_path(n, "/grault/quux/bar", NULL);
|
||||||
rtree_insert_path(n, "/grault/quux/baz", NULL);
|
r3_tree_insert_path(n, "/grault/quux/baz", NULL);
|
||||||
rtree_insert_path(n, "/grault/quux/qux", NULL);
|
r3_tree_insert_path(n, "/grault/quux/qux", NULL);
|
||||||
rtree_insert_path(n, "/grault/quux/corge", NULL);
|
r3_tree_insert_path(n, "/grault/quux/corge", NULL);
|
||||||
rtree_insert_path(n, "/grault/quux/garply", NULL);
|
r3_tree_insert_path(n, "/grault/quux/garply", NULL);
|
||||||
rtree_insert_path(n, "/grault/corge/foo", NULL);
|
r3_tree_insert_path(n, "/grault/corge/foo", NULL);
|
||||||
rtree_insert_path(n, "/grault/corge/bar", NULL);
|
r3_tree_insert_path(n, "/grault/corge/bar", NULL);
|
||||||
rtree_insert_path(n, "/grault/corge/baz", NULL);
|
r3_tree_insert_path(n, "/grault/corge/baz", NULL);
|
||||||
rtree_insert_path(n, "/grault/corge/qux", NULL);
|
r3_tree_insert_path(n, "/grault/corge/qux", NULL);
|
||||||
rtree_insert_path(n, "/grault/corge/quux", NULL);
|
r3_tree_insert_path(n, "/grault/corge/quux", NULL);
|
||||||
rtree_insert_path(n, "/grault/corge/garply", NULL);
|
r3_tree_insert_path(n, "/grault/corge/garply", NULL);
|
||||||
rtree_insert_path(n, "/grault/garply/foo", NULL);
|
r3_tree_insert_path(n, "/grault/garply/foo", NULL);
|
||||||
rtree_insert_path(n, "/grault/garply/bar", NULL);
|
r3_tree_insert_path(n, "/grault/garply/bar", NULL);
|
||||||
rtree_insert_path(n, "/grault/garply/baz", NULL);
|
r3_tree_insert_path(n, "/grault/garply/baz", NULL);
|
||||||
rtree_insert_path(n, "/grault/garply/qux", NULL);
|
r3_tree_insert_path(n, "/grault/garply/qux", NULL);
|
||||||
rtree_insert_path(n, "/grault/garply/quux", NULL);
|
r3_tree_insert_path(n, "/grault/garply/quux", NULL);
|
||||||
rtree_insert_path(n, "/grault/garply/corge", NULL);
|
r3_tree_insert_path(n, "/grault/garply/corge", NULL);
|
||||||
rtree_insert_path(n, "/garply/foo/bar", NULL);
|
r3_tree_insert_path(n, "/garply/foo/bar", NULL);
|
||||||
rtree_insert_path(n, "/garply/foo/baz", NULL);
|
r3_tree_insert_path(n, "/garply/foo/baz", NULL);
|
||||||
rtree_insert_path(n, "/garply/foo/qux", NULL);
|
r3_tree_insert_path(n, "/garply/foo/qux", NULL);
|
||||||
rtree_insert_path(n, "/garply/foo/quux", NULL);
|
r3_tree_insert_path(n, "/garply/foo/quux", NULL);
|
||||||
rtree_insert_path(n, "/garply/foo/corge", NULL);
|
r3_tree_insert_path(n, "/garply/foo/corge", NULL);
|
||||||
rtree_insert_path(n, "/garply/foo/grault", NULL);
|
r3_tree_insert_path(n, "/garply/foo/grault", NULL);
|
||||||
rtree_insert_path(n, "/garply/bar/foo", NULL);
|
r3_tree_insert_path(n, "/garply/bar/foo", NULL);
|
||||||
rtree_insert_path(n, "/garply/bar/baz", NULL);
|
r3_tree_insert_path(n, "/garply/bar/baz", NULL);
|
||||||
rtree_insert_path(n, "/garply/bar/qux", NULL);
|
r3_tree_insert_path(n, "/garply/bar/qux", NULL);
|
||||||
rtree_insert_path(n, "/garply/bar/quux", NULL);
|
r3_tree_insert_path(n, "/garply/bar/quux", NULL);
|
||||||
rtree_insert_path(n, "/garply/bar/corge", NULL);
|
r3_tree_insert_path(n, "/garply/bar/corge", NULL);
|
||||||
rtree_insert_path(n, "/garply/bar/grault", NULL);
|
r3_tree_insert_path(n, "/garply/bar/grault", NULL);
|
||||||
rtree_insert_path(n, "/garply/baz/foo", NULL);
|
r3_tree_insert_path(n, "/garply/baz/foo", NULL);
|
||||||
rtree_insert_path(n, "/garply/baz/bar", NULL);
|
r3_tree_insert_path(n, "/garply/baz/bar", NULL);
|
||||||
rtree_insert_path(n, "/garply/baz/qux", NULL);
|
r3_tree_insert_path(n, "/garply/baz/qux", NULL);
|
||||||
rtree_insert_path(n, "/garply/baz/quux", NULL);
|
r3_tree_insert_path(n, "/garply/baz/quux", NULL);
|
||||||
rtree_insert_path(n, "/garply/baz/corge", NULL);
|
r3_tree_insert_path(n, "/garply/baz/corge", NULL);
|
||||||
rtree_insert_path(n, "/garply/baz/grault", NULL);
|
r3_tree_insert_path(n, "/garply/baz/grault", NULL);
|
||||||
rtree_insert_path(n, "/garply/qux/foo", NULL);
|
r3_tree_insert_path(n, "/garply/qux/foo", NULL);
|
||||||
rtree_insert_path(n, "/garply/qux/bar", NULL);
|
r3_tree_insert_path(n, "/garply/qux/bar", NULL);
|
||||||
rtree_insert_path(n, "/garply/qux/baz", NULL);
|
r3_tree_insert_path(n, "/garply/qux/baz", NULL);
|
||||||
rtree_insert_path(n, "/garply/qux/quux", NULL);
|
r3_tree_insert_path(n, "/garply/qux/quux", NULL);
|
||||||
rtree_insert_path(n, "/garply/qux/corge", NULL);
|
r3_tree_insert_path(n, "/garply/qux/corge", NULL);
|
||||||
rtree_insert_path(n, "/garply/qux/grault", NULL);
|
r3_tree_insert_path(n, "/garply/qux/grault", NULL);
|
||||||
rtree_insert_path(n, "/garply/quux/foo", NULL);
|
r3_tree_insert_path(n, "/garply/quux/foo", NULL);
|
||||||
rtree_insert_path(n, "/garply/quux/bar", NULL);
|
r3_tree_insert_path(n, "/garply/quux/bar", NULL);
|
||||||
rtree_insert_path(n, "/garply/quux/baz", NULL);
|
r3_tree_insert_path(n, "/garply/quux/baz", NULL);
|
||||||
rtree_insert_path(n, "/garply/quux/qux", NULL);
|
r3_tree_insert_path(n, "/garply/quux/qux", NULL);
|
||||||
rtree_insert_path(n, "/garply/quux/corge", NULL);
|
r3_tree_insert_path(n, "/garply/quux/corge", NULL);
|
||||||
rtree_insert_path(n, "/garply/quux/grault", NULL);
|
r3_tree_insert_path(n, "/garply/quux/grault", NULL);
|
||||||
rtree_insert_path(n, "/garply/corge/foo", NULL);
|
r3_tree_insert_path(n, "/garply/corge/foo", NULL);
|
||||||
rtree_insert_path(n, "/garply/corge/bar", NULL);
|
r3_tree_insert_path(n, "/garply/corge/bar", NULL);
|
||||||
rtree_insert_path(n, "/garply/corge/baz", NULL);
|
r3_tree_insert_path(n, "/garply/corge/baz", NULL);
|
||||||
rtree_insert_path(n, "/garply/corge/qux", NULL);
|
r3_tree_insert_path(n, "/garply/corge/qux", NULL);
|
||||||
rtree_insert_path(n, "/garply/corge/quux", NULL);
|
r3_tree_insert_path(n, "/garply/corge/quux", NULL);
|
||||||
rtree_insert_path(n, "/garply/corge/grault", NULL);
|
r3_tree_insert_path(n, "/garply/corge/grault", NULL);
|
||||||
rtree_insert_path(n, "/garply/grault/foo", NULL);
|
r3_tree_insert_path(n, "/garply/grault/foo", NULL);
|
||||||
rtree_insert_path(n, "/garply/grault/bar", NULL);
|
r3_tree_insert_path(n, "/garply/grault/bar", NULL);
|
||||||
rtree_insert_path(n, "/garply/grault/baz", NULL);
|
r3_tree_insert_path(n, "/garply/grault/baz", NULL);
|
||||||
rtree_insert_path(n, "/garply/grault/qux", NULL);
|
r3_tree_insert_path(n, "/garply/grault/qux", NULL);
|
||||||
rtree_insert_path(n, "/garply/grault/quux", NULL);
|
r3_tree_insert_path(n, "/garply/grault/quux", NULL);
|
||||||
rtree_insert_path(n, "/garply/grault/corge", NULL);
|
r3_tree_insert_path(n, "/garply/grault/corge", NULL);
|
||||||
|
|
||||||
rtree_compile(n);
|
r3_tree_compile(n);
|
||||||
// rtree_dump(n, 0);
|
// r3_tree_dump(n, 0);
|
||||||
// match_entry *entry = calloc( sizeof(entry) , 1 );
|
// match_entry *entry = calloc( sizeof(entry) , 1 );
|
||||||
|
|
||||||
node *m;
|
node *m;
|
||||||
m = rtree_match(n , "/qux/bar/corge", strlen("/qux/bar/corge"), NULL);
|
m = r3_tree_match(n , "/qux/bar/corge", strlen("/qux/bar/corge"), NULL);
|
||||||
fail_if( m == NULL );
|
fail_if( m == NULL );
|
||||||
// rtree_dump( m, 0 );
|
// r3_tree_dump( m, 0 );
|
||||||
ck_assert_int_eq( (int) m->route_ptr, 999 );
|
ck_assert_int_eq( (int) m->route_ptr, 999 );
|
||||||
|
|
||||||
|
|
||||||
|
@ -638,7 +638,7 @@ START_TEST(benchmark_str)
|
||||||
double s = microtime();
|
double s = microtime();
|
||||||
long N = 5000000;
|
long N = 5000000;
|
||||||
for (int i = 0; i < 5000000 ; i++ ) {
|
for (int i = 0; i < 5000000 ; i++ ) {
|
||||||
rtree_match(n , "/qux/bar/corge", strlen("/qux/bar/corge"), NULL);
|
r3_tree_match(n , "/qux/bar/corge", strlen("/qux/bar/corge"), NULL);
|
||||||
}
|
}
|
||||||
double e = microtime();
|
double e = microtime();
|
||||||
|
|
||||||
|
@ -660,9 +660,9 @@ Suite* r3_suite (void) {
|
||||||
tcase_add_test(tcase, test_route_split);
|
tcase_add_test(tcase, test_route_split);
|
||||||
tcase_add_test(tcase, test_str_array);
|
tcase_add_test(tcase, test_str_array);
|
||||||
tcase_add_test(tcase, test_ltrim_slash);
|
tcase_add_test(tcase, test_ltrim_slash);
|
||||||
tcase_add_test(tcase, test_node_construct_uniq);
|
tcase_add_test(tcase, test_r3_node_construct_uniq);
|
||||||
tcase_add_test(tcase, test_node_find_edge);
|
tcase_add_test(tcase, test_r3_node_find_edge);
|
||||||
tcase_add_test(tcase, test_rtree_insert_pathn);
|
tcase_add_test(tcase, test_r3_tree_insert_pathn);
|
||||||
tcase_add_test(tcase, test_compile_slug);
|
tcase_add_test(tcase, test_compile_slug);
|
||||||
tcase_add_test(tcase, test_compile);
|
tcase_add_test(tcase, test_compile);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue