include files
This commit is contained in:
parent
9ee066fa3f
commit
fe21914e00
7 changed files with 76 additions and 26 deletions
16
include/define.h
Normal file
16
include/define.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* define.h
|
||||||
|
* Copyright (C) 2014 c9s <c9s@c9smba.local>
|
||||||
|
*
|
||||||
|
* Distributed under terms of the MIT license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DEFINE_H
|
||||||
|
#define DEFINE_H
|
||||||
|
|
||||||
|
typedef unsigned char bool;
|
||||||
|
#define FALSE 0
|
||||||
|
#define TRUE 1
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !DEFINE_H */
|
|
@ -45,6 +45,8 @@ void rnode_dump(rnode * n, int level);
|
||||||
|
|
||||||
void rnode_combine_patterns(rnode * n);
|
void rnode_combine_patterns(rnode * n);
|
||||||
|
|
||||||
|
bool rnode_has_slug_edges(rnode *n);
|
||||||
|
|
||||||
rnode * rnode_lookup(rnode * tree, char * path, int path_len);
|
rnode * rnode_lookup(rnode * tree, char * path, int path_len);
|
||||||
|
|
||||||
redge * redge_create(char * pattern, int pattern_len, rnode * child);
|
redge * redge_create(char * pattern, int pattern_len, rnode * child);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#ifndef STR_H
|
#ifndef STR_H
|
||||||
#define STR_H
|
#define STR_H
|
||||||
|
|
||||||
|
#include "define.h"
|
||||||
|
|
||||||
int strndiff(char * d1, char * d2, unsigned int n);
|
int strndiff(char * d1, char * d2, unsigned int n);
|
||||||
|
|
||||||
|
@ -16,7 +17,8 @@ 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);
|
bool contains_slug(char * str);
|
||||||
|
|
||||||
|
|
||||||
char * ltrim_slash(char* str);
|
char * ltrim_slash(char* str);
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,7 @@
|
||||||
#ifndef TOKEN_H
|
#ifndef TOKEN_H
|
||||||
#define TOKEN_H
|
#define TOKEN_H
|
||||||
|
|
||||||
typedef unsigned char bool;
|
#include "define.h"
|
||||||
#define FALSE 0
|
|
||||||
#define TRUE 1
|
|
||||||
|
|
||||||
typedef struct _token_array {
|
typedef struct _token_array {
|
||||||
char **tokens;
|
char **tokens;
|
||||||
|
|
62
src/node.c
62
src/node.c
|
@ -31,7 +31,7 @@ struct _rnode {
|
||||||
struct _redge {
|
struct _redge {
|
||||||
char * pattern;
|
char * pattern;
|
||||||
int pattern_len;
|
int pattern_len;
|
||||||
bool is_slug;
|
bool has_slug;
|
||||||
rnode * child;
|
rnode * child;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -108,6 +108,16 @@ redge * rnode_find_edge(rnode * n, char * pat) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rnode_compile(rnode *n)
|
||||||
|
{
|
||||||
|
bool has_slug_edges = rnode_has_slug_edges(n);
|
||||||
|
if ( has_slug_edges ) {
|
||||||
|
rnode_combine_patterns(n);
|
||||||
|
} else {
|
||||||
|
// use normal text matching...
|
||||||
|
n->combined_pattern = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -118,7 +128,7 @@ void rnode_combine_patterns(rnode * n) {
|
||||||
char * cpat;
|
char * cpat;
|
||||||
char * p;
|
char * p;
|
||||||
|
|
||||||
cpat = malloc(128);
|
cpat = calloc(sizeof(char),128);
|
||||||
if (cpat==NULL)
|
if (cpat==NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -127,12 +137,17 @@ void rnode_combine_patterns(rnode * n) {
|
||||||
redge *e = NULL;
|
redge *e = NULL;
|
||||||
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->has_slug ) {
|
||||||
|
char * slug_pat = compile_slug(e->pattern, e->pattern_len);
|
||||||
|
strcat(p, slug_pat);
|
||||||
|
} else {
|
||||||
strncat(p++,"(", 1);
|
strncat(p++,"(", 1);
|
||||||
strncat(p, e->pattern, e->pattern_len);
|
|
||||||
|
|
||||||
|
strncat(p, e->pattern, e->pattern_len);
|
||||||
p += e->pattern_len;
|
p += e->pattern_len;
|
||||||
|
|
||||||
strncat(p++,")", 1);
|
strncat(p++,")", 1);
|
||||||
|
}
|
||||||
|
|
||||||
if ( i + 1 < n->edge_len ) {
|
if ( i + 1 < n->edge_len ) {
|
||||||
strncat(p++,"|",1);
|
strncat(p++,"|",1);
|
||||||
|
@ -280,6 +295,18 @@ rnode * rnode_insert_routel(rnode *tree, char *route, int route_len)
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool rnode_has_slug_edges(rnode *n) {
|
||||||
|
bool found = FALSE;
|
||||||
|
redge *e;
|
||||||
|
for ( int i = 0 ; i < n->edge_len ; i++ ) {
|
||||||
|
e = n->edges[i];
|
||||||
|
e->has_slug = contains_slug(e->pattern);
|
||||||
|
if (e->has_slug)
|
||||||
|
found = TRUE;
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
void redge_branch(redge *e, int dl) {
|
void redge_branch(redge *e, int dl) {
|
||||||
rnode *c1; // child 1, child 2
|
rnode *c1; // child 1, child 2
|
||||||
redge *e1; // edge 1, edge 2
|
redge *e1; // edge 1, edge 2
|
||||||
|
@ -306,25 +333,12 @@ void redge_branch(redge *e, int dl) {
|
||||||
c1->endpoint++;
|
c1->endpoint++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rnode_dump(rnode * n, int level) {
|
|
||||||
if ( n->edge_len ) {
|
|
||||||
print_indent(level);
|
|
||||||
printf("+--\n");
|
|
||||||
for ( int i = 0 ; i < n->edge_len ; i++ ) {
|
|
||||||
redge * e = n->edges[i];
|
|
||||||
print_indent(level + 1);
|
|
||||||
printf("|-\"%s\"\n", e->pattern);
|
|
||||||
rnode_dump( e->child, level + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
redge * redge_create(char * pattern, int pattern_len, rnode * child) {
|
redge * redge_create(char * pattern, int pattern_len, rnode * child) {
|
||||||
redge * edge = (redge*) malloc( sizeof(redge) );
|
redge * edge = (redge*) malloc( sizeof(redge) );
|
||||||
edge->pattern = pattern;
|
edge->pattern = pattern;
|
||||||
edge->pattern_len = pattern_len;
|
edge->pattern_len = pattern_len;
|
||||||
edge->child = child;
|
edge->child = child;
|
||||||
edge->is_slug = 0;
|
|
||||||
return edge;
|
return edge;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,4 +352,18 @@ void redge_free(redge * e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void rnode_dump(rnode * n, int level) {
|
||||||
|
if ( n->edge_len ) {
|
||||||
|
printf(" => \n");
|
||||||
|
for ( int i = 0 ; i < n->edge_len ; i++ ) {
|
||||||
|
redge * e = n->edges[i];
|
||||||
|
print_indent(level);
|
||||||
|
printf(" |-\"%s\"", e->pattern);
|
||||||
|
if ( e->child ) {
|
||||||
|
rnode_dump( e->child, level + 1);
|
||||||
|
printf("\n");
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "str.h"
|
#include "str.h"
|
||||||
#include "token.h"
|
#include "token.h"
|
||||||
|
#include "define.h"
|
||||||
|
|
||||||
int strndiff(char * d1, char * d2, unsigned int n) {
|
int strndiff(char * d1, char * d2, unsigned int n) {
|
||||||
char * o = d1;
|
char * o = d1;
|
||||||
|
@ -44,8 +45,8 @@ int count_slug(char * p, int len) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
char * contains_slug(char * str) {
|
bool contains_slug(char * str) {
|
||||||
return strchr(str, '}');
|
return strchr(str, '{') != NULL ? TRUE : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -133,8 +133,11 @@ START_TEST (test_rnode_insert_routel)
|
||||||
|
|
||||||
printf("Inserting /post/{handle}-{id}\n");
|
printf("Inserting /post/{handle}-{id}\n");
|
||||||
rnode_insert_routel(n, "/post/{handle}-{id}", strlen("/post/{handle}-{id}") );
|
rnode_insert_routel(n, "/post/{handle}-{id}", strlen("/post/{handle}-{id}") );
|
||||||
|
rnode_combine_patterns(n);
|
||||||
rnode_dump(n, 0);
|
rnode_dump(n, 0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
fail_if(n == NULL, "rnode tree");
|
fail_if(n == NULL, "rnode tree");
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue