commit
f74126e0a8
4 changed files with 103 additions and 3 deletions
|
@ -11,7 +11,7 @@ matrix:
|
||||||
env: CONFIGURE_OPTION='--enable-debug --enable-gcov' COVERALLS=yes VALGRIND=yes DEBUG=yes LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
|
env: CONFIGURE_OPTION='--enable-debug --enable-gcov' COVERALLS=yes VALGRIND=yes DEBUG=yes LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
|
||||||
# -D_BSD_SOURCE=1 is for asprintf
|
# -D_BSD_SOURCE=1 is for asprintf
|
||||||
- compiler: clang
|
- compiler: clang
|
||||||
env: ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=/usr/local/clang-3.4/bin/llvm-symbolizer CFLAGS='-fsanitize=address -g -O1 -D_BSD_SOURCE=1'
|
env: ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=/usr/local/clang-3.4/bin/llvm-symbolizer CFLAGS='-fsanitize=address -g -O1 -D_BSD_SOURCE=1' CXX=clang++ CXXFLAGS='-fsanitize=address -g -O1 -D_BSD_SOURCE=1'
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- sudo apt-get update -qq
|
- sudo apt-get update -qq
|
||||||
|
@ -29,7 +29,7 @@ script:
|
||||||
- make V=1
|
- make V=1
|
||||||
- sudo make install
|
- sudo make install
|
||||||
- if [ "x$VALGRIND" == xyes ]; then make check > /dev/null 2>&1; else make check V=1; fi
|
- if [ "x$VALGRIND" == xyes ]; then make check > /dev/null 2>&1; else make check V=1; fi
|
||||||
# XXX: tracing memory leak, disabled for some mystery reason for automake...
|
# XXX: tracing memory leak, disabled for some mystery reason for automake...
|
||||||
# - if [ "x$VALGRIND" == xyes && "x$DEBUG" == xyes ]; then valgrind ./tests/check_* -v --trace-children=yes --show-leak-kinds=full --leak-check=full; fi
|
# - if [ "x$VALGRIND" == xyes && "x$DEBUG" == xyes ]; then valgrind ./tests/check_* -v --trace-children=yes --show-leak-kinds=full --leak-check=full; fi
|
||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
|
|
|
@ -7,6 +7,7 @@ AM_INIT_AUTOMAKE([foreign subdir-objects])
|
||||||
LT_INIT
|
LT_INIT
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_CC_STDC
|
AC_PROG_CC_STDC
|
||||||
|
AC_PROG_CXX
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
|
|
||||||
# older debian
|
# older debian
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
AM_CFLAGS=$(DEPS_CFLAGS) $(GVC_DEPS_CFLAGS) -I$(top_builddir)/include -Wall -std=c99
|
AM_CFLAGS=$(DEPS_CFLAGS) $(GVC_DEPS_CFLAGS) -I$(top_builddir)/include -Wall -std=c99
|
||||||
|
AM_CXXFLAGS=$(DEPS_CXXFLAGS) $(GVC_DEPS_CXXFLAGS) -I$(top_builddir)/include -Wall
|
||||||
AM_LDFLAGS=$(DEPS_LIBS) $(GVC_DEPS_LIBS) $(top_builddir)/libr3.la
|
AM_LDFLAGS=$(DEPS_LIBS) $(GVC_DEPS_LIBS) $(top_builddir)/libr3.la
|
||||||
|
|
||||||
noinst_PROGRAMS = simple
|
noinst_PROGRAMS = simple simple_cpp
|
||||||
simple_SOURCES = simple.c
|
simple_SOURCES = simple.c
|
||||||
|
simple_cpp_SOURCES = simple_cpp.cpp
|
||||||
|
|
97
examples/simple_cpp.cpp
Normal file
97
examples/simple_cpp.cpp
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iostream>
|
||||||
|
#include <r3.hpp>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
void example_1() {
|
||||||
|
// create a router tree with 10 children capacity (this capacity can grow dynamically)
|
||||||
|
r3::Tree tree(10);
|
||||||
|
|
||||||
|
// insert the route path into the router tree
|
||||||
|
int route_data_1 = 1;
|
||||||
|
tree.insert_path("/bar", &route_data_1); // ignore the length of path
|
||||||
|
|
||||||
|
int route_data_2 = 2;
|
||||||
|
tree.insert_pathl("/zoo", strlen("/zoo"), &route_data_2);
|
||||||
|
int route_data_3 = 3;
|
||||||
|
tree.insert_pathl("/foo/bar", strlen("/foo/bar"), &route_data_3);
|
||||||
|
|
||||||
|
int route_data_4 = 4;
|
||||||
|
tree.insert_pathl("/post/{id}", strlen("/post/{id}") , &route_data_4);
|
||||||
|
|
||||||
|
int route_data_5 = 5;
|
||||||
|
tree.insert_pathl("/user/{id:\\d+}", strlen("/user/{id:\\d+}"),
|
||||||
|
&route_data_5);
|
||||||
|
|
||||||
|
// if you want to catch error, you may call the extended path function for insertion
|
||||||
|
int data = 10;
|
||||||
|
char* errstr;
|
||||||
|
r3::Node ret = tree.insert_pathl("/foo/{name:\\d{5}",
|
||||||
|
strlen("/foo/{name:\\d{5}"), &data, &errstr);
|
||||||
|
if (ret == NULL) {
|
||||||
|
// failed insertion
|
||||||
|
cout << "error: " << errstr << endl;
|
||||||
|
free(errstr); // errstr is created from `asprintf`, so you have to free it manually.
|
||||||
|
}
|
||||||
|
|
||||||
|
// let's compile the tree!
|
||||||
|
int err = tree.compile(&errstr);
|
||||||
|
if (err != 0) {
|
||||||
|
cout << "error: " << errstr << endl;
|
||||||
|
free(errstr); // errstr is created from `asprintf`, so you have to free it manually.
|
||||||
|
}
|
||||||
|
|
||||||
|
// dump the compiled tree
|
||||||
|
tree.dump(0);
|
||||||
|
|
||||||
|
// match a route
|
||||||
|
r3::Node matched_node = tree.matchl("/foo/bar", strlen("/foo/bar"));
|
||||||
|
if (matched_node) {
|
||||||
|
int ret = *static_cast<int*>(matched_node.data());
|
||||||
|
cout << "match path ret: " << ret << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
r3::MatchEntry entry("/foo/bar");
|
||||||
|
matched_node = tree.match_entry(entry);
|
||||||
|
if (matched_node) {
|
||||||
|
int ret = *static_cast<int*>(matched_node.data());
|
||||||
|
cout << "match entry ret: " << ret << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void example_2() {
|
||||||
|
// create a router tree with 10 children capacity (this capacity can grow dynamically)
|
||||||
|
r3::Tree tree(10);
|
||||||
|
|
||||||
|
// insert the route path into the router tree
|
||||||
|
int route_data = 1;
|
||||||
|
tree.insert_routel(METHOD_GET | METHOD_POST, "/blog/post",
|
||||||
|
sizeof("/blog/post") - 1, &route_data);
|
||||||
|
|
||||||
|
char* errstr;
|
||||||
|
int err = tree.compile(&errstr);
|
||||||
|
if (err != 0) {
|
||||||
|
cout << "errstr: " << errstr << endl;
|
||||||
|
free(errstr); // errstr is created from `asprintf`, so you have to free it manually.
|
||||||
|
}
|
||||||
|
|
||||||
|
// in your http server handler
|
||||||
|
|
||||||
|
// create the match entry for capturing dynamic variables.
|
||||||
|
r3::MatchEntry entry("/blog/post");
|
||||||
|
entry.set_request_method(METHOD_GET);
|
||||||
|
|
||||||
|
r3::Route matched_route = tree.match_route(entry);
|
||||||
|
if (matched_route) {
|
||||||
|
int ret = *static_cast<int*>(matched_route.data());
|
||||||
|
cout << "match route ret: " << ret << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
example_1();
|
||||||
|
example_2();
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue