when child is not endpoint, return NULL
This commit is contained in:
parent
90890b09e5
commit
cae305b92d
4 changed files with 27 additions and 45 deletions
28
include/r3.h
28
include/r3.h
|
@ -14,36 +14,10 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <pcre.h>
|
#include <pcre.h>
|
||||||
|
|
||||||
|
#include "r3_define.h"
|
||||||
#ifndef bool
|
|
||||||
typedef unsigned char bool;
|
|
||||||
#endif
|
|
||||||
#ifndef FALSE
|
|
||||||
# define FALSE 0
|
|
||||||
#endif
|
|
||||||
#ifndef TRUE
|
|
||||||
# define TRUE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// #define DEBUG 1
|
|
||||||
#ifdef DEBUG
|
|
||||||
|
|
||||||
#define info(fmt, ...) \
|
|
||||||
do { fprintf(stderr, fmt, __VA_ARGS__); } while (0)
|
|
||||||
|
|
||||||
#define debug(fmt, ...) \
|
|
||||||
do { fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \
|
|
||||||
__LINE__, __func__, __VA_ARGS__); } while (0)
|
|
||||||
|
|
||||||
#else
|
|
||||||
#define info(...);
|
|
||||||
#define debug(...);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "str_array.h"
|
#include "str_array.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define node_edge_pattern(node,i) node->edges[i]->pattern
|
#define node_edge_pattern(node,i) node->edges[i]->pattern
|
||||||
#define node_edge_pattern_len(node,i) node->edges[i]->pattern_len
|
#define node_edge_pattern_len(node,i) node->edges[i]->pattern_len
|
||||||
|
|
||||||
|
|
10
src/node.c
10
src/node.c
|
@ -307,8 +307,8 @@ node * r3_tree_matchl(node * n, char * path, int path_len, match_entry * entry)
|
||||||
// append captured token to entry
|
// append captured token to entry
|
||||||
str_array_append(entry->vars , strndup(substring_start, substring_length));
|
str_array_append(entry->vars , strndup(substring_start, substring_length));
|
||||||
}
|
}
|
||||||
if (restlen == 0) {
|
if (restlen == 0 ) {
|
||||||
return e->child;
|
return e->child && e->child->endpoint ? e->child : NULL;
|
||||||
}
|
}
|
||||||
// get the length of orginal string: $0
|
// get the length of orginal string: $0
|
||||||
return r3_tree_matchl( e->child, path + (n->ov[1] - n->ov[0]), restlen, entry);
|
return r3_tree_matchl( e->child, path + (n->ov[1] - n->ov[0]), restlen, entry);
|
||||||
|
@ -320,10 +320,10 @@ node * r3_tree_matchl(node * n, char * path, int path_len, match_entry * entry)
|
||||||
|
|
||||||
if ( (e = r3_node_find_edge_str(n, path, path_len)) != NULL ) {
|
if ( (e = r3_node_find_edge_str(n, path, path_len)) != NULL ) {
|
||||||
int restlen = path_len - e->pattern_len;
|
int restlen = path_len - e->pattern_len;
|
||||||
if(restlen > 0) {
|
if (restlen == 0) {
|
||||||
return r3_tree_matchl(e->child, path + e->pattern_len, restlen, entry);
|
return e->child && e->child->endpoint ? e->child : NULL;
|
||||||
}
|
}
|
||||||
return e->child;
|
return r3_tree_matchl(e->child, path + e->pattern_len, restlen, entry);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -394,3 +394,6 @@
|
||||||
1400600677,13384789.38
|
1400600677,13384789.38
|
||||||
1400600754,13649118.34
|
1400600754,13649118.34
|
||||||
1400601224,13742996.84
|
1400601224,13742996.84
|
||||||
|
1400603778,13736212.66
|
||||||
|
1400603800,13715365.00
|
||||||
|
1400603827,12742770.05
|
||||||
|
|
|
|
@ -114,8 +114,7 @@ START_TEST (test_pcre_patterns_insert)
|
||||||
|
|
||||||
// incomplete string shouldn't match
|
// incomplete string shouldn't match
|
||||||
matched = r3_tree_matchl(n, "/post/111-", strlen("/post/111-"), NULL);
|
matched = r3_tree_matchl(n, "/post/111-", strlen("/post/111-"), NULL);
|
||||||
ck_assert(matched);
|
ck_assert(! matched);
|
||||||
ck_assert_int_eq(matched->endpoint, 0);
|
|
||||||
|
|
||||||
r3_tree_free(n);
|
r3_tree_free(n);
|
||||||
}
|
}
|
||||||
|
@ -128,27 +127,33 @@ END_TEST
|
||||||
START_TEST (test_pcre_patterns_insert_2)
|
START_TEST (test_pcre_patterns_insert_2)
|
||||||
{
|
{
|
||||||
node * n = r3_tree_create(10);
|
node * n = r3_tree_create(10);
|
||||||
|
|
||||||
// r3_tree_insert_path(n, "/foo-{user}-{id}", NULL, NULL);
|
|
||||||
// r3_tree_dump(n, 0);
|
|
||||||
r3_tree_insert_path(n, "/post/{idx:\\d{2}}/{idy:\\d{2}}", NULL);
|
r3_tree_insert_path(n, "/post/{idx:\\d{2}}/{idy:\\d{2}}", NULL);
|
||||||
r3_tree_compile(n);
|
r3_tree_compile(n);
|
||||||
r3_tree_dump(n, 0);
|
r3_tree_dump(n, 0);
|
||||||
|
|
||||||
node *matched;
|
node *matched;
|
||||||
matched = r3_tree_match(n, "/post/11/22", NULL);
|
matched = r3_tree_match(n, "/post/11/22", NULL);
|
||||||
ck_assert(matched);
|
ck_assert(matched);
|
||||||
ck_assert(matched->endpoint > 0);
|
ck_assert(matched->endpoint > 0);
|
||||||
|
|
||||||
/*
|
|
||||||
matched = r3_tree_match(n, "/post/11", NULL);
|
|
||||||
ck_assert(matched);
|
|
||||||
ck_assert_int_eq(matched->endpoint, 0);
|
|
||||||
r3_tree_free(n);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for \d{3}-\d{4}
|
||||||
|
*/
|
||||||
|
START_TEST (test_pcre_patterns_insert_3)
|
||||||
|
{
|
||||||
|
node * n = r3_tree_create(10);
|
||||||
|
r3_tree_insert_path(n, "/post/{idx:\\d{2}}/{idy:\\d{2}}", NULL);
|
||||||
|
r3_tree_compile(n);
|
||||||
|
r3_tree_dump(n, 0);
|
||||||
|
node *matched;
|
||||||
|
matched = r3_tree_match(n, "/post/11/22", NULL);
|
||||||
|
ck_assert(matched);
|
||||||
|
ck_assert(matched->endpoint > 0);
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue