acl/lib_acl/samples/token_tree/main.c

178 lines
4.2 KiB
C
Raw Normal View History

#include "lib_acl.h"
2014-11-19 00:25:21 +08:00
#include <stdio.h>
#include <stdlib.h>
#define STR acl_vstring_str
static void token_tree_test(const char *tokens, const char *test_tab[])
{
ACL_TOKEN *token_tree;
ACL_TOKEN *token;
2014-11-19 00:25:21 +08:00
const char *ptr, *psaved;
ACL_VSTRING *buf = acl_vstring_alloc(256);
int i;
token_tree = acl_token_tree_create(tokens);
acl_token_tree_print(token_tree);
for (i = 0; test_tab[i] != NULL; i++) {
ptr = psaved = test_tab[i];
token = acl_token_tree_match(token_tree, &ptr, ";", NULL);
if (token) {
ACL_VSTRING_RESET(buf);
acl_token_name(token, buf);
printf("match %s %s, token's name: %s\n", psaved,
(token->flag & ACL_TOKEN_F_DENY) ? "DENY"
: (token->flag & ACL_TOKEN_F_PASS ? "PASS" : "NONE"),
STR(buf));
} else
printf("match %s none\n", psaved);
}
acl_token_tree_destroy(token_tree);
acl_vstring_free(buf);
}
static const char *__test_tab[] = {
"中国",
"中国人民",
"中国人民银行",
"中国人民解放军",
2014-11-19 00:25:21 +08:00
NULL
};
static void test(void)
{
const char *tokens = "中国|p 中国人|p 中国人民|p 中国人民银行|p";
2014-11-19 00:25:21 +08:00
token_tree_test(tokens, __test_tab);
2014-11-19 00:25:21 +08:00
}
static void test2(void)
{
ACL_TOKEN *tree;
ACL_TOKEN *token;
const char *n1 = "名称1", *n2 = "名称2", *n3 = "名称3";
const char *v1 = "变量1", *v2 = "变量2", *v3 = "变量3";
const char *s = "中国人民名称1在这个世界上你在哪儿名称2? "
"我不知道你的名称你能告诉我吗我的名称3是...";
2014-11-19 00:25:21 +08:00
const char *p = s;
if (1)
{
tree = acl_token_tree_create(NULL);
acl_token_tree_add(tree, n1, ACL_TOKEN_F_STOP, v1);
acl_token_tree_add(tree, n2, ACL_TOKEN_F_STOP, v2);
acl_token_tree_add(tree, n3, ACL_TOKEN_F_STOP, v3);
}
else
tree = acl_token_tree_create("名称1|p 名称2|p 名称3|p");
2014-11-19 00:25:21 +08:00
printf("-----------------------------------\n");
acl_token_tree_print(tree);
token = acl_token_tree_word_match(tree, "名称1");
2014-11-19 00:25:21 +08:00
if (token)
printf("find, %s: %s\n", acl_token_name1(token),
(const char*) token->ctx);
else
printf("no find\n");
printf("-----------------------------------\n");
while (*p) {
token = acl_token_tree_match(tree, &p, NULL, NULL);
if (token == NULL)
break;
printf("%s: %s\n", acl_token_name1(token),
(const char*) token->ctx);
}
printf("-----------------------------------\n");
acl_token_tree_destroy(tree);
}
static void token_word_test(const char *tokens, const char *test_tab[])
{
ACL_TOKEN *token_tree;
const char *ptr;
int i;
token_tree = acl_token_tree_create(tokens);
acl_token_tree_print(token_tree);
for (i = 0; test_tab[i] != NULL; i++) {
ptr = test_tab[i];
printf("match %s %s\n", ptr,
acl_token_tree_word_match(token_tree, ptr) ? "yes" : "no");
}
acl_token_tree_destroy(token_tree);
}
static void test3(void)
{
const char *tokens1 = "hello world he is a man he"
" 中 中华 中华人 中华人民 中华人民共 中华人民共和 中华人民共和国"
" 中华人民共和国万岁 中华人民共和国万岁万万岁"
" 法轮功|d 研究法轮功|d 反对法轮功|p 法轮功协会|d";
const char *tokens2 = "比利时|d 中国|p 说的|d";
static const char *test1_tab[] = {
"中华",
"中华人",
"中华人民",
"中华人民共",
"中华人民共和",
"中华人民共和国",
"中华人民共和国万岁",
"我们中华人民共和国万岁",
"我们中华人民共和国万岁万万岁",
"法轮功",
"反对法轮功",
"法轮功协会",
"反对法轮功协会",
"研究法轮功",
NULL
};
static const char *test2_tab[] = {
"hello",
"shello",
"中华人民共和国",
"中华人民",
NULL
};
static const char *test3_tab[] = {
"我爱研法轮功",
"中国",
"比利时",
"中国比利时",
"我说的故事",
"宜档闹泄",
NULL
};
token_tree_test(tokens1, test1_tab);
token_word_test(tokens1, test2_tab);
token_tree_test(tokens2, test3_tab);
}
2014-11-19 00:25:21 +08:00
int main(void)
{
test();
#if 0
acl_token_tree_test();
#endif
test2();
test3();
2014-11-19 00:25:21 +08:00
#ifdef ACL_MS_WINDOWS
printf("enter any key to exit ...\n");
getchar();
#endif
return (0);
}