r3/include/r3.h

208 lines
4.5 KiB
C
Raw Permalink 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.
*/
2014-05-22 10:21:29 -04:00
#ifndef R3_NODE_H
#define R3_NODE_H
2014-05-14 22:10:34 -04:00
#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
#include "r3_define.h"
2014-05-16 08:22:25 -04:00
#include "str_array.h"
2014-05-22 04:32:06 -04:00
#include "config.h"
2014-05-22 04:30:09 -04:00
#ifdef HAVE_STDINT_H
2014-05-22 04:29:22 -04:00
#include <stdint.h>
2014-05-22 04:30:09 -04:00
#else
typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;
#endif
2014-05-20 11:33:51 -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-22 07:20:21 -04:00
struct _root;
2014-05-16 03:29:25 -04:00
struct _edge;
struct _node;
2014-05-18 01:06:36 -04:00
struct _route;
2014-05-16 03:29:25 -04:00
typedef struct _edge edge;
typedef struct _node node;
2014-05-18 01:06:36 -04:00
typedef struct _route route;
2014-05-22 07:20:21 -04:00
typedef struct _root root;
struct _root {
2014-05-22 07:24:04 -04:00
};
2014-05-15 01:39:50 -04:00
2014-05-16 03:29:25 -04:00
struct _node {
2014-05-22 04:37:53 -04:00
edge ** edges;
route ** routes;
2014-05-22 04:44:56 -04:00
edge * parent_edge;
2014-05-22 04:32:06 -04:00
uint32_t edge_len;
uint32_t edge_cap;
uint32_t route_len;
uint32_t route_cap;
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 */
2014-05-23 00:08:06 -04:00
int compare_type;
2014-05-16 02:05:51 -04:00
char * combined_pattern;
pcre * pcre_pattern;
pcre_extra * pcre_extra;
2014-05-16 02:05:51 -04:00
2014-05-16 03:29:25 -04:00
/**
2014-05-18 01:06:36 -04:00
* the pointer of route data
2014-05-16 03:29:25 -04:00
*/
2014-05-17 23:06:24 -04:00
void * data;
2014-05-16 03:29:25 -04:00
2014-05-22 04:33:41 -04:00
uint8_t endpoint;
2014-05-16 02:05:51 -04:00
};
2014-05-16 03:29:25 -04:00
struct _edge {
2014-05-22 04:53:52 -04:00
/* the child node */
2014-05-16 03:29:25 -04:00
node * child;
2014-05-22 04:53:52 -04:00
/* the parent node */
node * parent;
2014-05-22 08:26:27 -04:00
char * pattern;
int pattern_len;
2014-05-22 23:47:44 -04:00
int opcode;
float score;
bool has_slug:1;
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
int request_method; // current request method
2014-05-17 23:06:24 -04:00
2014-05-18 01:06:36 -04:00
void * data; // route ptr
2014-05-17 23:06:24 -04:00
2014-05-17 06:56:13 -04:00
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-18 01:06:36 -04:00
struct _route {
2014-05-17 06:57:36 -04:00
char * path;
int path_len;
int request_method; // can be (GET || POST)
2014-05-17 06:57:36 -04:00
char * host; // required host name
int host_len;
2014-05-18 00:40:06 -04:00
void * data;
2014-05-17 06:57:36 -04:00
char * remote_addr_pattern;
int remote_addr_pattern_len;
};
2014-05-17 06:57:36 -04:00
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-23 01:49:18 -04:00
edge * r3_node_connectl(node * n, char * pat, int len, int strdup, node *child);
#define r3_node_connect(n, pat, child) r3_node_connectl(n, pat, strlen(pat), 0, 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-18 00:24:07 -04:00
void r3_node_append_edge(node *n, edge *child);
2014-05-15 01:39:50 -04:00
2014-05-15 06:26:41 -04:00
2014-05-20 12:47:09 -04:00
node * r3_tree_insert_pathl(node *tree, char *path, int path_len, void * data);
2014-05-18 22:12:41 -04:00
2014-05-20 12:47:09 -04:00
#define r3_tree_insert_path(n,p,d) r3_tree_insert_pathl_(n,p,strlen(p), NULL, d)
#define r3_tree_insert_route(n,r,d) r3_tree_insert_pathl_(n, r->path, r->path_len, r, d)
2014-05-18 22:12:41 -04:00
/**
* The private API to insert a path
*/
2014-05-20 12:47:09 -04:00
node * r3_tree_insert_pathl_(node *tree, char *path, int path_len, route * route, void * data);
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-20 13:22:49 -04:00
edge * r3_node_find_edge_str(const 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-20 13:22:49 -04:00
node * r3_tree_matchl(const node * n, char * path, int path_len, match_entry * entry);
2014-05-18 22:34:48 -04:00
#define r3_tree_match(n,p,e) r3_tree_matchl(n,p, strlen(p), e)
2014-05-15 09:17:30 -04:00
2014-05-18 22:34:48 -04:00
// node * r3_tree_match_entry(node * n, match_entry * entry);
#define r3_tree_match_entry(n, entry) r3_tree_matchl(n, entry->path, entry->path_len, entry)
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
edge * r3_edge_create(char * pattern, int pattern_len, node * child);
2014-05-14 22:10:34 -04:00
2014-05-18 07:09:47 -04:00
node * 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-17 11:54:18 -04:00
match_entry * match_entry_createl(char * path, int path_len);
#define match_entry_create(path) match_entry_createl(path,strlen(path))
2014-05-16 07:12:01 -04:00
void match_entry_free(match_entry * entry);
2014-05-16 06:03:52 -04:00
2014-05-17 07:25:25 -04:00
route * r3_route_create(char * path);
2014-05-17 07:25:25 -04:00
route * r3_route_createl(char * path, int path_len);
2014-05-17 07:25:25 -04:00
int r3_route_cmp(route *r1, match_entry *r2);
2014-05-18 01:06:36 -04:00
void r3_node_append_route(node * n, route * route);
2014-05-18 00:24:07 -04:00
void r3_route_free(route * route);
2014-05-18 00:24:07 -04:00
2014-05-20 13:22:49 -04:00
route * r3_tree_match_route(const node *n, match_entry * entry);
2014-05-18 00:56:53 -04:00
2014-05-22 05:07:02 -04:00
void r3_tree_feedback(node *tree, node *end);
#define METHOD_GET 2
#define METHOD_POST 2<<1
2014-05-22 12:21:40 -04:00
#define METHOD_PUT 2<<2
#define METHOD_DELETE 2<<3
#define METHOD_PATCH 2<<4
#define METHOD_HEAD 2<<5
#define METHOD_OPTIONS 2<<6
2014-05-23 00:08:06 -04:00
2014-05-23 01:49:18 -04:00
int r3_pattern_to_opcode(char * pattern, int pattern_len);
2014-05-23 00:08:06 -04:00
enum { NODE_COMPARE_STR, NODE_COMPARE_PCRE, NODE_COMPARE_OPCODE };
2014-05-22 23:25:25 -04:00
2014-05-23 10:58:20 -04:00
enum { OP_EXPECT_MORE_DIGITS = 1, OP_EXPECT_MORE_WORDS, OP_EXPECT_NOSLASH, OP_EXPECT_NODASH, OP_EXPECT_MORE_ALPHA };
2014-05-22 10:21:29 -04:00
#endif /* !R3_NODE_H */