More Cisco stuff added
FossilOrigin-Name: e68d9b046b5b19112b8c37d63642202ba74c57d927cb4519d0da57e0b0e11698
This commit is contained in:
@ -63,6 +63,8 @@ CWSRC=\
|
||||
cw_in_radio_generic_struct.c\
|
||||
cw_in_idx_generic.c\
|
||||
cw_in_idx_generic_struct.c\
|
||||
cw_in_generic_indexed_enum.c\
|
||||
cw_out_generic_indexed_enum.c\
|
||||
cw_in_generic_enum.c\
|
||||
cw_out_generic_struct.c\
|
||||
cw_out_idx_generic_struct.c\
|
||||
|
@ -411,6 +411,12 @@ int cw_in_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandlerP
|
||||
|
||||
int cw_in_generic_enum(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params,
|
||||
uint8_t * elem_data, int elem_len);
|
||||
|
||||
int cw_in_generic_indexed_enum(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params,
|
||||
uint8_t * elem_data, int elem_len);
|
||||
|
||||
int cw_out_generic_indexed_enum(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
|
||||
, uint8_t * dst);
|
||||
|
||||
int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
|
||||
, uint8_t * dst);
|
||||
|
@ -31,6 +31,6 @@ int cw_in_generic_enum(struct cw_ElemHandler * handler, struct cw_ElemHandlerPar
|
||||
|
||||
thandler.type=e->type;
|
||||
thandler.key=key;
|
||||
return e->fun(&thandler,params,elem_data,elem_len-1);
|
||||
return e->fun_in(&thandler,params,elem_data,elem_len-1);
|
||||
|
||||
}
|
53
src/cw/cw_in_generic_indexed_enum.c
Normal file
53
src/cw/cw_in_generic_indexed_enum.c
Normal file
@ -0,0 +1,53 @@
|
||||
|
||||
|
||||
#include "cw.h"
|
||||
|
||||
|
||||
static const cw_KTVEnum_t * get_enum(const cw_KTVEnum_t * e, int val){
|
||||
int i;
|
||||
for (i=0; e[i].type != NULL; i++ ){
|
||||
if (e[i].value==val){
|
||||
return &(e[i]);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int cw_in_generic_indexed_enum(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params,
|
||||
uint8_t * elem_data, int elem_len)
|
||||
{
|
||||
int val;
|
||||
int l,f;
|
||||
const cw_KTVEnum_t * e;
|
||||
const cw_KTVIndexed_t * ie;
|
||||
|
||||
char key[CW_KTV_MAX_KEY_LEN];
|
||||
struct cw_ElemHandler thandler;
|
||||
|
||||
ie = handler->type;
|
||||
|
||||
val = cw_get_byte(elem_data+ie->idxpos);
|
||||
e = get_enum(ie->type,val);
|
||||
|
||||
f=0;
|
||||
if (ie->idxpos==0){
|
||||
l=1;
|
||||
f=1;
|
||||
}
|
||||
if (ie->idxpos==elem_len-1){
|
||||
l=1;
|
||||
}
|
||||
|
||||
if (e!=NULL){
|
||||
sprintf(key,"%s/%s",handler->key,e->name);
|
||||
}
|
||||
else{
|
||||
sprintf(key,"%s/%u",handler->key,val);
|
||||
}
|
||||
|
||||
|
||||
thandler.type=e->type;
|
||||
thandler.key=key;
|
||||
return e->fun_in(&thandler,params,elem_data+f,elem_len-l);
|
||||
|
||||
}
|
@ -5,7 +5,7 @@ int cw_ktv_read_struct(mavl_t ktv,const cw_KTVStruct_t * stru, const char *pkey,
|
||||
uint8_t * data, int len)
|
||||
{
|
||||
char key[CW_KTV_MAX_KEY_LEN];
|
||||
int pos, i;
|
||||
int pos, i,l;
|
||||
cw_KTV_t * result;
|
||||
|
||||
|
||||
@ -16,13 +16,22 @@ int cw_ktv_read_struct(mavl_t ktv,const cw_KTVStruct_t * stru, const char *pkey,
|
||||
pos=stru[i].position;
|
||||
|
||||
sprintf(key,"%s/%s",pkey,stru[i].key);
|
||||
result = cw_ktv_add(ktv,key,stru[i].type,data+pos,stru[i].len);
|
||||
if (stru[i].len==-1)
|
||||
l = len-pos;
|
||||
else
|
||||
l = stru[i].len;
|
||||
result = cw_ktv_add(ktv,key,stru[i].type,data+pos,l);
|
||||
|
||||
stru[i].type->to_str(result,dbstr,100);
|
||||
cw_dbg(DBG_ELEM_DETAIL, "Read (%d): %s: %s",pos,key,dbstr);
|
||||
|
||||
if (stru[i].len==-1)
|
||||
l = result->type->len(result);
|
||||
else
|
||||
l = stru[i].len;
|
||||
|
||||
if(stru[i].position == -1)
|
||||
pos+=stru[i].len;
|
||||
pos+=l;
|
||||
|
||||
i++;
|
||||
}
|
||||
|
@ -15,7 +15,8 @@ int cw_ktv_write_struct(mavl_t ktv, const cw_KTVStruct_t * stru, const char *pke
|
||||
if (stru[i].position!=-1){
|
||||
pos=stru[i].position;
|
||||
}
|
||||
memset(dst+pos,0,stru[i].len);
|
||||
if (stru[i].len!=-1)
|
||||
memset(dst+pos,0,stru[i].len);
|
||||
|
||||
sprintf(key,"%s/%s",pkey,stru[i].key);
|
||||
result = cw_ktv_get(ktv,key,stru[i].type);
|
||||
@ -27,8 +28,10 @@ int cw_ktv_write_struct(mavl_t ktv, const cw_KTVStruct_t * stru, const char *pke
|
||||
else{
|
||||
result->type->put(result,dst+pos);
|
||||
}
|
||||
|
||||
pos+=stru[i].len;
|
||||
if (stru[i].len!=-1)
|
||||
pos+=stru[i].len;
|
||||
else
|
||||
pos+=result->type->len(result);
|
||||
|
||||
}
|
||||
|
||||
|
54
src/cw/cw_out_generic_indexed_enum.c
Normal file
54
src/cw/cw_out_generic_indexed_enum.c
Normal file
@ -0,0 +1,54 @@
|
||||
#include "cw.h"
|
||||
|
||||
int cw_out_generic_indexed_enum(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
|
||||
, uint8_t * dst)
|
||||
{
|
||||
char key[CW_KTV_MAX_KEY_LEN];
|
||||
int i;
|
||||
cw_KTV_t * result;
|
||||
int len,start;
|
||||
uint8_t * ob;
|
||||
const cw_KTVIndexed_t *ie;
|
||||
cw_KTVEnum_t * e;
|
||||
struct cw_ElemHandler thandler;
|
||||
|
||||
ie = handler->type;
|
||||
|
||||
|
||||
i = 0;
|
||||
ob = dst;
|
||||
|
||||
e = ie->type;
|
||||
|
||||
for(i=0; e[i].name!=NULL; i++) {
|
||||
sprintf(key,"%s/%s",handler->key,e[i].name);
|
||||
result = cw_ktv_base_exists(params->conn->local_cfg,key);
|
||||
if (result==NULL)
|
||||
continue;
|
||||
start = params->conn->header_len(handler);
|
||||
len = 0;
|
||||
if (ie->idxpos==0)
|
||||
len = 1;
|
||||
|
||||
if (e[i].fun_out==NULL)
|
||||
len += result->type->put(result,ob+start+len);
|
||||
else
|
||||
len += cw_ktv_write_struct(params->conn->local_cfg,e[i].type,key,ob+start+len);
|
||||
|
||||
/* thandler.type=e[i].type;
|
||||
thandler.key=key;
|
||||
len += e->fun_out(&thandler,params,ob+start+len);
|
||||
*/
|
||||
cw_set_byte(ob+start+ie->idxpos,e[i].value);
|
||||
if (ie->idxpos==len)
|
||||
len++;
|
||||
|
||||
ob += params->conn->write_header(handler,ob,len);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
return ob-dst;
|
||||
|
||||
}
|
12
src/cw/ktv.h
12
src/cw/ktv.h
@ -98,11 +98,19 @@ typedef struct cw_KTVStruct cw_KTVStruct_t;
|
||||
struct cw_KTVEnum{
|
||||
int value;
|
||||
const char * name;
|
||||
const struct cw_Type * type;
|
||||
int (*fun)();
|
||||
const void * type;
|
||||
int (*fun_in)();
|
||||
int (*fun_out)();
|
||||
};
|
||||
typedef struct cw_KTVEnum cw_KTVEnum_t;
|
||||
|
||||
|
||||
struct cw_KTVIndexed{
|
||||
int idxpos;
|
||||
void *type;
|
||||
};
|
||||
typedef struct cw_KTVIndexed cw_KTVIndexed_t;
|
||||
|
||||
int cw_ktv_read_struct(mavl_t ktv,const cw_KTVStruct_t * stru, const char *pkey,
|
||||
uint8_t * data, int len);
|
||||
int cw_ktv_write_struct(mavl_t ktv, const cw_KTVStruct_t * stru, const char *pkey,
|
||||
|
Reference in New Issue
Block a user