Fix slug branch problem
This commit is contained in:
parent
824ae8784e
commit
9ee066fa3f
4 changed files with 32 additions and 16 deletions
|
@ -12,6 +12,8 @@ int strndiff(char * d1, char * d2, unsigned int n);
|
||||||
|
|
||||||
int strdiff(char * d1, char * d2);
|
int strdiff(char * d1, char * d2);
|
||||||
|
|
||||||
|
int count_slug(char * p, int len);
|
||||||
|
|
||||||
char * compile_slug(char * str, int len);
|
char * compile_slug(char * str, int len);
|
||||||
|
|
||||||
char * contains_slug(char * str);
|
char * contains_slug(char * str);
|
||||||
|
|
30
src/node.c
30
src/node.c
|
@ -207,6 +207,15 @@ rnode * rnode_insert_routel(rnode *tree, char *route, int route_len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// branch the edge at correct position (avoid broken slugs)
|
||||||
|
char *slug_s = strchr(route, '{');
|
||||||
|
char *slug_e = strchr(route, '}');
|
||||||
|
if ( slug_s && slug_e ) {
|
||||||
|
if ( dl > (slug_s - route) && dl < (slug_e - route) ) {
|
||||||
|
// break before '{'
|
||||||
|
dl = slug_s - route;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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
|
||||||
|
@ -233,24 +242,14 @@ rnode * rnode_insert_routel(rnode *tree, char *route, int route_len)
|
||||||
} else if ( dl < e->pattern_len ) {
|
} else if ( dl < e->pattern_len ) {
|
||||||
// printf("branch the edge dl: %d\n", dl);
|
// printf("branch the edge dl: %d\n", dl);
|
||||||
|
|
||||||
// branch the edge at correct position (avoid broken slugs)
|
|
||||||
char *slug_s = strchr(route, '{');
|
|
||||||
char *slug_e = strchr(route, '}');
|
|
||||||
if ( slug_s && slug_e ) {
|
|
||||||
if ( dl > (slug_s - route) && dl < (slug_e - route) ) {
|
|
||||||
// break before '{'
|
|
||||||
dl = slug_s - route;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* it's partically matched with the pattern,
|
/* it's partically matched with the pattern,
|
||||||
* we should split the end point and make a branch here...
|
* we should split the end point and make a branch here...
|
||||||
*/
|
*/
|
||||||
rnode *c1, *c2; // child 1, child 2
|
rnode *c2; // child 1, child 2
|
||||||
redge *e1, *e2; // edge 1, edge 2
|
redge *e2; // edge 1, edge 2
|
||||||
char * s1 = e->pattern + dl;
|
|
||||||
char * s2 = route + dl;
|
char * s2 = route + dl;
|
||||||
int s1_len = 0, s2_len = 0;
|
int s2_len = 0;
|
||||||
|
|
||||||
redge_branch(e, dl);
|
redge_branch(e, dl);
|
||||||
|
|
||||||
|
@ -266,7 +265,6 @@ rnode * rnode_insert_routel(rnode *tree, char *route, int route_len)
|
||||||
e->pattern = strndup(e->pattern, dl);
|
e->pattern = strndup(e->pattern, dl);
|
||||||
e->pattern_len = dl;
|
e->pattern_len = dl;
|
||||||
|
|
||||||
|
|
||||||
// move n->edges to c1
|
// move n->edges to c1
|
||||||
c2->endpoint++;
|
c2->endpoint++;
|
||||||
return c2;
|
return c2;
|
||||||
|
@ -311,11 +309,11 @@ void redge_branch(redge *e, int dl) {
|
||||||
void rnode_dump(rnode * n, int level) {
|
void rnode_dump(rnode * n, int level) {
|
||||||
if ( n->edge_len ) {
|
if ( n->edge_len ) {
|
||||||
print_indent(level);
|
print_indent(level);
|
||||||
printf("*\n");
|
printf("+--\n");
|
||||||
for ( int i = 0 ; i < n->edge_len ; i++ ) {
|
for ( int i = 0 ; i < n->edge_len ; i++ ) {
|
||||||
redge * e = n->edges[i];
|
redge * e = n->edges[i];
|
||||||
print_indent(level + 1);
|
print_indent(level + 1);
|
||||||
printf("+ \"%s\"\n", e->pattern);
|
printf("|-\"%s\"\n", e->pattern);
|
||||||
rnode_dump( e->child, level + 1);
|
rnode_dump( e->child, level + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
12
src/str.c
12
src/str.c
|
@ -31,6 +31,18 @@ int strdiff(char * d1, char * d2) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* provide a quick way to count slugs, simply search for '{'
|
||||||
|
*/
|
||||||
|
int count_slug(char * p, int len) {
|
||||||
|
int s = 0;
|
||||||
|
while( len-- ) {
|
||||||
|
if ( *p == '{' )
|
||||||
|
s++;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
char * contains_slug(char * str) {
|
char * contains_slug(char * str) {
|
||||||
return strchr(str, '}');
|
return strchr(str, '}');
|
||||||
|
|
|
@ -131,6 +131,10 @@ START_TEST (test_rnode_insert_routel)
|
||||||
rnode_insert_routel(n, "/post/{handle}", strlen("/post/{handle}") );
|
rnode_insert_routel(n, "/post/{handle}", strlen("/post/{handle}") );
|
||||||
rnode_dump(n, 0);
|
rnode_dump(n, 0);
|
||||||
|
|
||||||
|
printf("Inserting /post/{handle}-{id}\n");
|
||||||
|
rnode_insert_routel(n, "/post/{handle}-{id}", strlen("/post/{handle}-{id}") );
|
||||||
|
rnode_dump(n, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
fail_if(n == NULL, "rnode tree");
|
fail_if(n == NULL, "rnode tree");
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue