From 62616b5e7b187fa9e0567085ec75aa5a17671127 Mon Sep 17 00:00:00 2001 From: 7u83 <7u83@mail.ru> Date: Sat, 27 Aug 2022 21:05:34 +0200 Subject: [PATCH] New array type --- src/cw/cw_type_array.c | 177 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 src/cw/cw_type_array.c diff --git a/src/cw/cw_type_array.c b/src/cw/cw_type_array.c new file mode 100644 index 00000000..2aaf7a98 --- /dev/null +++ b/src/cw/cw_type_array.c @@ -0,0 +1,177 @@ +/* + This file is part of libcapwap. + + libcapwap is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + libcapwap is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Foobar. If not, see . + +*/ + +#include + +#include "cw.h" +#include "val.h" + +static cw_Val_t *get(cw_Val_t * data, const uint8_t * src, int len) +{ + data->type = &cw_type_byte; + data->val.byte = cw_get_byte(src); + return data; +} + +static int put(const cw_Val_t *data, uint8_t * dst) +{ + return cw_put_byte(dst, data->val.byte); +} + +static const char * get_guardstr(int val, const cw_ValValRange_t * valrange) +{ + if (valrange==NULL) + return NULL; + + while(valrange->name!=NULL){ + if(val>=valrange->min && val<=valrange->max) + return valrange->name; + valrange++; + } + return NULL; +} + + +static int to_str(const cw_Val_t *data, char *dst, int max_len) +{ + if (data->valguard!=NULL){ + const char * name; + name = get_guardstr(data->val.byte,data->valguard); + if (name != NULL){ + return sprintf(dst,"%s",name); + } + } + + /*if (max_len<3){ + return 0; + }*/ + return sprintf(dst, "%d", data->val.byte); + +} + +static int get_guardval(const char *str, const cw_ValValRange_t * valrange) +{ + while(valrange->name!=NULL){ + if(strcmp(str,valrange->name)==0) + return valrange->min; + valrange++; + } + return -1; +} + + +static cw_Val_t *from_str(cw_Val_t * data, const char *src) +{ + data->type = &cw_type_byte; + if (data->valguard != NULL){ + int rc; + rc = get_guardval(src,data->valguard); + if (rc != -1){ + data->val.byte = rc; + return data; + } + + } + + + data->val.byte = atoi(src); + return data; +} + +static int len (cw_Val_t * data) +{ + return sizeof(data->val.byte); +} + +static void * data(cw_Val_t * data) +{ + return &data->val.byte; +} + +static const char * get_type_name(cw_Val_t *data) +{ + if (data->valguard != NULL){ + return CW_TYPE_STR->name; + } + return CW_TYPE_BYTE->name; +} + +static int cast(cw_Val_t * data) +{ + if (strcmp(data->type->name,CW_TYPE_BYTE->name)==0) + return 1; + if (strcmp(data->type->name,CW_TYPE_STR->name)==0){ + char *src = data->val.ptr; + CW_TYPE_BYTE->from_str(data,src); + free(src); + return 1; + } + return 0; +} + +static int bread(cw_Cfg_t *cfg, const char * key, const uint8_t *src, int len, const void *param) +{ + uint8_t n,l; + char skey[MAX_KEY_LEN]; + + n = cw_get_byte(src); + l=1; + for (i=0; iread(cfg,skey,src,len,param); + } + + return l; + +/* + uint8_t val; + cw_ValValRange_t * valrange = (cw_ValValRange_t *) param; + const char *str; + + val = cw_get_byte(src); + str = get_guardstr(val, valrange); + if (str != NULL) + cw_cfg_set(cfg,key,str); + else + cw_cfg_set_int(cfg,key,val); + + return 1; +*/ +} + +static int bwrite(cw_Cfg_t ** cfgs, const char *key, uint8_t *dst, const void * param) +{ + return cw_generic_write_l(cfgs,CW_TYPE_BYTE,key,dst,param); +} + +const struct cw_Type cw_type_array = { + "Array", /* name */ + NULL, /* del */ + put, /* put */ + get, /* get */ + to_str, /* to_str */ + from_str, /* from_str */ + len, /* len */ + data, /* data */ + get_type_name, /* get_type_name */ + cast, + bread, + bwrite + +};