#include "mbag.h" #include "capwap.h" #include "format.h" static int mbag_bstr16str(void *item,char *dst) { mbag_item_t *i= item; char *d = dst; int utf8 = cw_is_utf8(bstr16_data(i->data), bstr16_len(i->data)); if (utf8) { d += sprintf(d, "%.*s", bstr16_len(i->data), bstr16_data(i->data)); } else { d += sprintf(d, "\".x"); d += cw_format_hex(d, bstr16_data(i->data), bstr16_len(i->data)); d += sprintf(d, "\""); } return d-dst; } static int mbag_strstr(void *item,char *dst) { mbag_item_t *i= item; return sprintf(dst, "%s", i->data); } const struct mbag_typedef mbag_type_byte = { "byte",NULL }; const struct mbag_typedef mbag_type_word = { "word",NULL }; const struct mbag_typedef mbag_type_dword = { "dword",NULL }; const struct mbag_typedef mbag_type_const_data = { "data",NULL }; const struct mbag_typedef mbag_type_bstr = { "bstr",free }; const struct mbag_typedef mbag_type_bstr16 = { "bstr16",free,mbag_bstr16str }; const struct mbag_typedef mbag_type_str = { "str",free,mbag_strstr }; const struct mbag_typedef mbag_type_vendorstr = { "vendorstr",free }; void free_avltree(void*t){ mavl_t i = (mavl_t) t; mavl_destroy(i); } const struct mbag_typedef mbag_type_avltree = { "mavl",free_avltree }; static void mbag_type_mbag_del(void *i) { mbag_t x = (mbag_t)i; mavl_destroy(x); } const struct mbag_typedef mbag_type_mbag = { "mbag",mbag_type_mbag_del }; static void mbag_del_data(struct mbag_item *i) { if (i->type->del) { i->type->del(i->data); } } static void mbag_del_fun(void *e) { mbag_del_data(e); free(e); } static void strmbag_del_fun(void *e) { mbag_del_data(e); free(e); } static int strmbag_cmp_fun(const void *x1, const void *x2) { return strcmp(( (struct mbag_item *) x1)->name , ((struct mbag_item *) x2)->name ); } static int mbag_cmp_fun(const void *x1, const void *x2) { return ((struct mbag_item *) x1)->id - ((struct mbag_item *) x2)->id; } mbag_t mbag_create() { return mavl_create(mbag_cmp_fun, mbag_del_fun); } mbag_t strmbag_create() { return mavl_create(strmbag_cmp_fun, strmbag_del_fun); } struct mbag_item *mbag_item_create(mbag_t s, uint32_t id) { struct mbag_item is; is.id = id; struct mbag_item *i = mavl_get(s, &is); if (i) { mbag_del_data(i); return i; } i = malloc(sizeof(struct mbag_item)); if (!i) return NULL; i->id = id; return mavl_add(s, i); } struct mbag_item *strmbag_item_create(mbag_t s, char *name) { struct mbag_item is; is.name = name; struct mbag_item *i = mavl_get(s, &is); if (i) { mbag_del_data(i); return i; } i = malloc(sizeof(struct mbag_item)); if (!i) return NULL; i->name = name; return mavl_add(s, i); }