support simple opcode
This commit is contained in:
parent
333fabd795
commit
b394be57cb
3 changed files with 70 additions and 20 deletions
|
@ -479,3 +479,7 @@
|
||||||
1400820886,12274457.34,2393445.83,55188.21
|
1400820886,12274457.34,2393445.83,55188.21
|
||||||
1400820922,12218386.22,2604565.56,77672.30
|
1400820922,12218386.22,2604565.56,77672.30
|
||||||
1400820933,12443155.46,2361317.46,45590.26
|
1400820933,12443155.46,2361317.46,45590.26
|
||||||
|
1400829105,12110496.08,4797414.85,38479.85
|
||||||
|
1400829117,12258758.55,4129968.45,59074.70
|
||||||
|
1400829143,12339827.27,4775224.01,55924.05
|
||||||
|
1400831278,11421287.15,4742488.93,39945.75
|
||||||
|
|
Can't render this file because it has a wrong number of fields in line 447.
|
63
src/node.c
63
src/node.c
|
@ -3,9 +3,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
// Jemalloc memory management
|
|
||||||
// #include <jemalloc/jemalloc.h>
|
|
||||||
|
|
||||||
// PCRE
|
// PCRE
|
||||||
#include <pcre.h>
|
#include <pcre.h>
|
||||||
|
@ -160,8 +158,13 @@ void r3_tree_compile_patterns(node * n) {
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
edge *e = NULL;
|
edge *e = NULL;
|
||||||
|
int opcode_cnt = 0;
|
||||||
for ( int i = 0 ; i < n->edge_len ; i++ ) {
|
for ( int i = 0 ; i < n->edge_len ; i++ ) {
|
||||||
e = n->edges[i];
|
e = n->edges[i];
|
||||||
|
|
||||||
|
if ( e->opcode )
|
||||||
|
opcode_cnt++;
|
||||||
|
|
||||||
if ( e->has_slug ) {
|
if ( e->has_slug ) {
|
||||||
// compile "foo/{slug}" to "foo/[^/]+"
|
// compile "foo/{slug}" to "foo/[^/]+"
|
||||||
char * slug_pat = slug_compile(e->pattern, e->pattern_len);
|
char * slug_pat = slug_compile(e->pattern, e->pattern_len);
|
||||||
|
@ -183,16 +186,15 @@ void r3_tree_compile_patterns(node * n) {
|
||||||
info("pattern: %s\n",cpat);
|
info("pattern: %s\n",cpat);
|
||||||
|
|
||||||
// if all edges use opcode, we should skip the combined_pattern.
|
// if all edges use opcode, we should skip the combined_pattern.
|
||||||
/*
|
|
||||||
if ( opcode_cnt == n->edge_len ) {
|
if ( opcode_cnt == n->edge_len ) {
|
||||||
zfree(cpat);
|
// zfree(cpat);
|
||||||
return;
|
n->compare_type = NODE_COMPARE_OPCODE;
|
||||||
|
} else {
|
||||||
|
n->compare_type = NODE_COMPARE_PCRE;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
n->combined_pattern = cpat;
|
n->combined_pattern = cpat;
|
||||||
|
|
||||||
|
|
||||||
const char *error;
|
const char *error;
|
||||||
int erroffset;
|
int erroffset;
|
||||||
unsigned int option_bits = 0;
|
unsigned int option_bits = 0;
|
||||||
|
@ -258,6 +260,47 @@ node * r3_tree_matchl(const node * n, char * path, int path_len, match_entry * e
|
||||||
int rc;
|
int rc;
|
||||||
int i;
|
int i;
|
||||||
int ov_cnt;
|
int ov_cnt;
|
||||||
|
int restlen;
|
||||||
|
|
||||||
|
if (n->compare_type == NODE_COMPARE_OPCODE ) {
|
||||||
|
for (i = 0; i < n->edge_len ; i++ ) {
|
||||||
|
char *pp = path;
|
||||||
|
char *pp_end = path + path_len;
|
||||||
|
e = n->edges[i];
|
||||||
|
switch(e->opcode) {
|
||||||
|
case OP_EXPECT_NOSLASH:
|
||||||
|
while (*pp != '/' && pp < pp_end) {
|
||||||
|
pp++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OP_EXPECT_DIGITS:
|
||||||
|
while ( isdigit(*pp) && pp < pp_end) {
|
||||||
|
pp++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OP_EXPECT_WORDS:
|
||||||
|
while ( (isdigit(*pp) || isalpha(*pp)) && pp < pp_end) {
|
||||||
|
pp++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OP_EXPECT_NODASH:
|
||||||
|
while (*pp != '-' && pp < pp_end) {
|
||||||
|
pp++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ( (pp - path) > 0) {
|
||||||
|
restlen = pp_end - pp;
|
||||||
|
if (entry) {
|
||||||
|
str_array_append(entry->vars , zstrndup(path, pp - path));
|
||||||
|
}
|
||||||
|
if (restlen == 0) {
|
||||||
|
return e->child && e->child->endpoint > 0 ? e->child : NULL;
|
||||||
|
}
|
||||||
|
return r3_tree_matchl(e->child, pp, pp_end - pp, entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// if the pcre_pattern is found, and the pointer is not NULL, then it's
|
// if the pcre_pattern is found, and the pointer is not NULL, then it's
|
||||||
// pcre pattern node, we use pcre_exec to match the nodes
|
// pcre pattern node, we use pcre_exec to match the nodes
|
||||||
|
@ -301,7 +344,7 @@ node * r3_tree_matchl(const node * n, char * path, int path_len, match_entry * e
|
||||||
// info("%2d: %.*s\n", i, substring_length, substring_start);
|
// info("%2d: %.*s\n", i, substring_length, substring_start);
|
||||||
|
|
||||||
if ( substring_length > 0) {
|
if ( substring_length > 0) {
|
||||||
int restlen = path_len - ov[1]; // fully match to the end
|
restlen = path_len - ov[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->edge_len, i);
|
||||||
|
|
||||||
e = n->edges[i - 1];
|
e = n->edges[i - 1];
|
||||||
|
@ -322,7 +365,7 @@ node * r3_tree_matchl(const node * n, char * path, int path_len, match_entry * e
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
restlen = path_len - e->pattern_len;
|
||||||
if (restlen == 0) {
|
if (restlen == 0) {
|
||||||
return e->child && e->child->endpoint > 0 ? e->child : NULL;
|
return e->child && e->child->endpoint > 0 ? e->child : NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,22 +42,25 @@ START_TEST (test_r3_node_find_edge)
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
|
||||||
START_TEST (test_compile)
|
static node * create_simple_str_tree() {
|
||||||
{
|
|
||||||
str_array *t;
|
|
||||||
node * n;
|
node * n;
|
||||||
n = r3_tree_create(10);
|
n = r3_tree_create(10);
|
||||||
|
|
||||||
|
|
||||||
node *m;
|
|
||||||
edge *e ;
|
|
||||||
|
|
||||||
r3_tree_insert_path(n, "/zoo", NULL);
|
r3_tree_insert_path(n, "/zoo", NULL);
|
||||||
r3_tree_insert_path(n, "/foo", NULL);
|
r3_tree_insert_path(n, "/foo", NULL);
|
||||||
r3_tree_insert_path(n, "/bar", NULL);
|
r3_tree_insert_path(n, "/bar", NULL);
|
||||||
r3_tree_compile(n);
|
r3_tree_compile(n);
|
||||||
fail_if( n->combined_pattern );
|
return n;
|
||||||
fail_if( NULL == r3_node_find_edge_str(n, "/", strlen("/") ) );
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
START_TEST (test_compile)
|
||||||
|
{
|
||||||
|
str_array *t;
|
||||||
|
node * n = create_simple_str_tree();
|
||||||
|
|
||||||
|
node *m;
|
||||||
|
edge *e ;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
r3_tree_dump(n, 0);
|
r3_tree_dump(n, 0);
|
||||||
|
|
Loading…
Reference in a new issue