r3/include/r3.h

138 lines
2.8 KiB
C
Raw Normal View History

2014-05-14 22:10:34 -04:00
/*
2014-05-16 08:22:25 -04:00
* r3.h
2014-05-14 22:10:34 -04:00
* Copyright (C) 2014 c9s <c9s@c9smba.local>
*
* Distributed under terms of the MIT license.
*/
#ifndef NODE_H
#define NODE_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
2014-05-16 02:05:51 -04:00
#include <pcre.h>
2014-05-14 22:10:34 -04:00
2014-05-16 08:22:25 -04:00
#include "str_array.h"
2014-05-15 01:39:50 -04:00
2014-05-16 07:12:01 -04:00
#define node_edge_pattern(node,i) node->edges[i]->pattern
#define node_edge_pattern_len(node,i) node->edges[i]->pattern_len
2014-05-16 03:29:25 -04:00
struct _edge;
struct _node;
typedef struct _edge edge;
typedef struct _node node;
2014-05-15 01:39:50 -04:00
2014-05-16 03:29:25 -04:00
struct _node {
edge ** edges;
int edge_len;
int edge_cap;
2014-05-16 02:05:51 -04:00
2014-05-16 08:51:30 -04:00
/** compile-time variables here.... **/
2014-05-16 02:05:51 -04:00
/* the combined regexp pattern string from pattern_tokens */
char * combined_pattern;
int combined_pattern_len;
pcre * pcre_pattern;
2014-05-16 03:29:25 -04:00
pcre_extra * pcre_extra;
2014-05-16 08:51:30 -04:00
int ov_cnt;
int * ov;
2014-05-16 02:05:51 -04:00
2014-05-16 03:29:25 -04:00
/**
* the pointer of route structure
*/
void * route_ptr;
2014-05-16 02:05:51 -04:00
int endpoint;
};
2014-05-16 03:29:25 -04:00
struct _edge {
2014-05-16 02:05:51 -04:00
char * pattern;
int pattern_len;
bool has_slug;
2014-05-16 03:29:25 -04:00
node * child;
2014-05-16 02:05:51 -04:00
};
2014-05-16 06:03:52 -04:00
typedef struct {
2014-05-16 07:12:01 -04:00
str_array * vars;
2014-05-17 06:56:13 -04:00
char * path; // current path to dispatch
int path_len; // the length of the current path
2014-05-16 06:03:52 -04:00
void * route_ptr; // route ptr
2014-05-17 06:56:13 -04:00
int request_method; // current request method
char * host; // the request host
int host_len;
char * remote_addr;
int remote_addr_len;
2014-05-16 06:03:52 -04:00
} match_entry;
2014-05-15 01:39:50 -04:00
2014-05-17 06:57:36 -04:00
typedef struct {
char * path;
int path_len;
int request_methods; // can be (GET || POST)
char * host; // required host name
int host_len;
char * remote_addr_pattern;
int remote_addr_pattern_len;
} route_info;
2014-05-15 01:39:50 -04:00
2014-05-16 06:57:36 -04:00
node * r3_tree_create(int cap);
2014-05-16 03:29:25 -04:00
2014-05-16 06:57:36 -04:00
node * r3_node_create();
2014-05-15 01:39:50 -04:00
2014-05-16 06:57:36 -04:00
void r3_tree_free(node * tree);
2014-05-15 01:39:50 -04:00
2014-05-16 06:57:36 -04:00
void r3_edge_free(edge * edge);
2014-05-15 01:39:50 -04:00
2014-05-16 06:57:36 -04:00
edge * r3_tree_add_child(node * n, char * pat , node *child);
2014-05-15 01:39:50 -04:00
2014-05-16 06:57:36 -04:00
edge * r3_node_find_edge(node * n, char * pat);
2014-05-15 01:39:50 -04:00
2014-05-16 06:57:36 -04:00
void r3_tree_append_edge(node *n, edge *child);
2014-05-15 01:39:50 -04:00
2014-05-16 06:57:36 -04:00
node * r3_tree_insert_path(node *tree, char *route, void * route_ptr);
2014-05-15 06:26:41 -04:00
2014-05-16 06:57:36 -04:00
node * r3_tree_insert_pathn(node *tree, char *route, int route_len, void * route_ptr);
2014-05-15 06:26:41 -04:00
2014-05-16 06:57:36 -04:00
void r3_tree_dump(node * n, int level);
2014-05-15 01:39:50 -04:00
2014-05-17 19:36:17 -04:00
int r3_tree_render_file(node * tree, char * format, char * filename);
2014-05-17 20:13:58 -04:00
int r3_tree_render_dot(node * tree);
2014-05-16 06:57:36 -04:00
edge * r3_node_find_edge_str(node * n, char * str, int str_len);
2014-05-16 02:05:51 -04:00
2014-05-16 06:57:36 -04:00
void r3_tree_compile(node *n);
2014-05-16 02:05:51 -04:00
2014-05-16 06:57:36 -04:00
void r3_tree_compile_patterns(node * n);
2014-05-16 02:05:51 -04:00
2014-05-16 06:57:36 -04:00
node * r3_tree_match(node * n, char * path, int path_len, match_entry * entry);
2014-05-15 09:17:30 -04:00
2014-05-16 06:57:36 -04:00
bool r3_node_has_slug_edges(node *n);
2014-05-16 00:33:59 -04:00
2014-05-16 06:57:36 -04:00
node * r3_tree_lookup(node * tree, char * path, int path_len);
2014-05-15 06:28:33 -04:00
2014-05-16 06:57:36 -04:00
edge * r3_edge_create(char * pattern, int pattern_len, node * child);
2014-05-14 22:10:34 -04:00
2014-05-16 06:57:36 -04:00
void r3_edge_branch(edge *e, int dl);
2014-05-16 06:57:36 -04:00
void r3_edge_free(edge * edge);
2014-05-14 22:10:34 -04:00
2014-05-16 06:03:52 -04:00
2014-05-16 07:12:01 -04:00
match_entry * match_entry_create(char * path, int path_len);
void match_entry_free(match_entry * entry);
2014-05-16 06:03:52 -04:00
2014-05-17 19:36:17 -04:00
2014-05-14 22:10:34 -04:00
#endif /* !NODE_H */