acl/lib_acl/samples/token_tree/main.c
shuxin   zheng 2669546783 optimize dns-gate
2022-05-29 17:41:21 +08:00

171 lines
3.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "lib_acl.h"
#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;
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[] = {
"中国",
"中国人民",
"中国人民银行",
"中国人民解放军",
NULL
};
static void test(void)
{
const char *tokens = "中国|p 中国人|p 中国人民|p 中国人民银行|p";
token_tree_test(tokens, __test_tab);
}
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是...";
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");
printf("-----------------------------------\n");
acl_token_tree_print(tree);
token = acl_token_tree_word_match(tree, "名称1");
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"
" 中 中华 中华人 中华人民 中华人民共 中华人民共和 中华人民共和国"
" 中华人民共和国万岁 中华人民共和国万岁万万岁";
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);
}
int main(void)
{
test();
#if 0
acl_token_tree_test();
#endif
test2();
test3();
#ifdef ACL_MS_WINDOWS
printf("enter any key to exit ...\n");
getchar();
#endif
return (0);
}