From 18b2ebe3df26009ef6b2aeb0670a396e876fca25 Mon Sep 17 00:00:00 2001 From: FreeArtMan Date: Sun, 4 Jun 2017 00:17:22 +0100 Subject: Added nb_match functionality --- test/test_key_value_match.c | 223 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 test/test_key_value_match.c (limited to 'test/test_key_value_match.c') diff --git a/test/test_key_value_match.c b/test/test_key_value_match.c new file mode 100644 index 0000000..4384a07 --- /dev/null +++ b/test/test_key_value_match.c @@ -0,0 +1,223 @@ +#include +#include + +#include + +char *alloc_new_str_s(char *str, size_t size) +{ + char *ret = NULL; + + if (str == NULL) + { + return NULL; + } + + //1MB is enought + if (size > (1024*1024)) + { + return NULL; + } + + ret = malloc(size+1); //extra for 1 zero at then end + if (ret == NULL) + { + return NULL; + } + + memcpy(ret, str, size); + ret[size] = 0; //add zero at the end + + return ret; +} + +char *alloc_new_str(char *str) +{ + return alloc_new_str_s(str, strlen(str)); +} + +typedef struct kv_user_name +{ + int id; + char *name; + char *desc; +} kv_user_name; + +kv_user_name* kv_new(int id, char *name, char *desc) +{ + kv_user_name *ret = NULL; + + ret = malloc(sizeof(kv_user_name)); + if (!ret) + { + return NULL; + } + + ret->id = id; + ret->name = alloc_new_str(name); + ret->desc = alloc_new_str(desc); + + return ret; +} + +kv_user_name* kv_empty() +{ + kv_user_name *ret = NULL; + + ret = calloc(1, sizeof(kv_user_name)); + if (!ret) + { + return NULL; + } + + + return ret; +} + +netbyte_store* kv_marsh(kv_user_name *kv) +{ + netbyte_store *nb=NULL; + nb_u8 nb_id; + nb_u8arr nb_name, nb_desc; + + nb = calloc(1,sizeof(netbyte_store)); + nb_init(nb); + + nb_u8_create(&nb_id, kv->id); + nb_add_u8(nb, &nb_id); + nb_u8arr_create(&nb_name, strlen(kv->name), kv->name); + nb_add_u8arr(nb, &nb_name); + nb_u8arr_create(&nb_desc, strlen(kv->desc), kv->desc); + nb_add_u8arr(nb, &nb_desc); + + nb_print(nb); + nb_print(nb); + + return nb; +} + + +int kv_unmarsh(netbyte_store *store, kv_user_name *kv) +{ + __nb_type *type=NULL; + + if (!store) + { + return -1; + } + + if (!kv) + { + return -1; + } + + if (0 == nb_val(store, 0, &type)) + if (type->type == NBT_U8) + { + nb_u8 *u8 = (nb_u8 *)type->nb_val; + kv->id = u8->val; + } else + { + printf("ERR\n"); + } + + if (0 == nb_val(store, 1, &type)) + if (type->type == NBT_U8ARRAY) + { + nb_u8arr *u8arr = (nb_u8arr *)type->nb_val; + kv->name = alloc_new_str_s(u8arr->val, u8arr->len); + } else + { + printf("ERR\n"); + } + + if (0 == nb_val(store, 2, &type)) + if (type->type == NBT_U8ARRAY) + { + nb_u8arr *u8arr = (nb_u8arr *)type->nb_val; + kv->desc = alloc_new_str_s(u8arr->val, u8arr->len); + } else + { + printf("ERR\n"); + } + + return 0; +} + + +void kv_free(kv_user_name *kv) +{ + if (kv!=NULL) + { + free(kv->name); + free(kv->desc); + free(kv); + } +} + +int main() +{ + int er=-1; + uint8_t *res=NULL; + FILE *f=NULL; + int i=0; + + kv_user_name *kv=NULL; + + netbyte_store *nb=malloc(sizeof(netbyte_store)); + nb_tok_arr *pat = NULL; + + printf("Start test\n"); + + f = fopen("test_kv_save.md","r"); + if (nb_fread( nb, fileno(f) ) == 0) + { + nb_print( nb ); + } + fclose( f ); + + + pat = nb_tok_create(32); + if (pat == NULL) + { + printf("ERR nb_tok_create\n"); + } + if (-1 == nb_parse("u8,u8[],u8[] ",pat)) + { + printf("ERR nb_parse\n"); + } + + + for (i=0;ilen;i++) + { + nb_tok tok = pat->tok[i]; + printf("%d S:%d TS:%d L:%d A:%d\n", + i, tok.sign, tok.type_size, tok.len, tok.arr + ); + } + + if (nb_match(nb, pat)==0) + { + printf("Match\n"); + } else + { + printf("No match\n"); + } + + + + kv = kv_empty(); + kv_unmarsh(nb, kv); + + + printf("ID:%d\n", kv->id); + printf("NAME:%s\n",kv->name); + printf("DESC:%s\n", kv->desc); + + kv_free(kv); + + nb_free(nb); + + + printf("End test\n"); + return 0; +} \ No newline at end of file -- cgit v1.2.3