Byte valguards fully implemented

FossilOrigin-Name: 06e14f6c3efc2ff16b87540ca719639accadd9c919e47ab08b2768fd87482722
This commit is contained in:
7u83@mail.ru
2018-04-26 04:50:32 +00:00
parent 33b736852b
commit 07f02708bb
9 changed files with 69 additions and 16 deletions

View File

@ -19,13 +19,28 @@ int cw_ktv_write_struct(mavl_t ktv, const cw_KTVStruct_t * stru, const char *pke
memset(dst+pos,0,stru[i].len);
sprintf(key,"%s/%s",pkey,stru[i].key);
result = cw_ktv_get(ktv,key,stru[i].type);
result = cw_ktv_get(ktv,key,NULL);
if (result == NULL){
cw_log(LOG_ERR,"Can't put %s, no value found, filling zero.",key);
memset(dst+pos,0,stru[i].len);
}
else{
result->valguard=stru[i].valguard;
if (strcmp(stru[i].type->name,result->type->name)){
printf("Type mismatch: %s != %s\n",stru[i].type->name,result->type->name);
if (stru[i].type->cast != NULL){
if (!stru[i].type->cast(result)){
cw_log(LOG_ERR,"Can't cast from %s to %s",result->type->name,stru[i].type->name);
exit(0);
}
}
}
result->type->put(result,dst+pos);
}
if (stru[i].len!=-1)

View File

@ -61,9 +61,31 @@ static int to_str(const cw_KTV_t *data, char *dst, int max_len)
}
static int get_guardval(const char *str, const cw_KTVValRange_t * valrange)
{
while(valrange->name!=NULL){
if(strcmp(str,valrange->name)==0)
return valrange->min;
valrange++;
}
return -1;
}
static cw_KTV_t *from_str(cw_KTV_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;
}
@ -86,6 +108,20 @@ static const char * get_type_name(cw_KTV_t *data)
return CW_TYPE_BYTE->name;
}
static int cast(cw_KTV_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;
}
const struct cw_Type cw_type_byte = {
"Byte", /* name */
NULL, /* del */
@ -95,5 +131,6 @@ const struct cw_Type cw_type_byte = {
from_str, /* from_str */
len, /* len */
data, /* data */
get_type_name /* get_type_name */
get_type_name, /* get_type_name */
cast
};

View File

@ -20,7 +20,7 @@ int cw_write_descriptor_subelem (uint8_t *dst, mavl_t ktvstore,
vendor = cw_ktv_get (ktvstore, key, CW_TYPE_DWORD);
if (vendor == NULL) {
cw_log (LOG_ERR, "Can't put subelem %s, no value found.", key);
cw_log (LOG_ERR, "Can't put subelem %s, no value of type Dword found.", key);
return 0;
}
@ -29,7 +29,7 @@ int cw_write_descriptor_subelem (uint8_t *dst, mavl_t ktvstore,
version = cw_ktv_get (ktvstore, key, CW_TYPE_BSTR16);
if (version == NULL) {
cw_log (LOG_ERR, "Can't put subelem %s, no value found.", key);
cw_log (LOG_ERR, "Can't put subelem %s, no value of type Bstr16 found.", key);
return 0;
}