actube/src/cw/mbag_type_data.c

74 lines
1.1 KiB
C
Raw Normal View History

#include <string.h>
#include "mbag.h"
#include "format.h"
static int to_str(void *item,char *dst)
{
mbag_item_t *i= item;
return format_hex(dst, ((uint8_t*)i->u2.data)+1, *((uint8_t*)i->u2.data));
}
static struct mbag_item * from_str(const char *src)
{
mbag_item_t * i = mbag_item_new(MBAG_DATA);
if (!i)
return NULL;
int l=strlen(src);
int msize=l/2;
if(l&1)
msize++;
uint8_t * mem = malloc(1+msize);
if (!mem)
return NULL;
*(mem)=msize;
cw_format_scan_hex_bytes(mem+1,src,l);
i->u2.data=mem;
return i;
}
static struct mbag_item * get(const uint8_t *src,int len)
{
mbag_item_t * item = mbag_item_new(MBAG_DATA);
if (!item)
return NULL;
uint8_t *data = malloc(len+1);
if (!data){
free (item);
return NULL;
}
*data=len;
memcpy(data+1,src,len);
item->u2.data=data;
return item;
}
static int put(struct mbag_item *i,uint8_t *dst)
{
int l = *((uint8_t*)i->u2.data);
memcpy(dst,i->u2.data+1,l);
return l;
}
const struct mbag_typedef mbag_type_data = {
.name = "Binary Data",
.del = free,
.from_str = from_str,
.to_str = to_str,
.get = get,
.put = put
};