#include <stdlib.h> #include <string.h> #include <assert.h> #include "cn-cbor/cn-cbor.h" cn_cbor* cn_cbor_mapget_int(const cn_cbor* cb, int key) { cn_cbor* cp; assert(cb); for (cp = cb->first_child; cp && cp->next; cp = cp->next->next) { switch(cp->type) { case CN_CBOR_UINT: if (cp->v.uint == (unsigned long)key) { return cp->next; } break; case CN_CBOR_INT: if (cp->v.sint == (long)key) { return cp->next; } break; default: ; // skip non-integer keys } } return NULL; } cn_cbor* cn_cbor_mapget_string(const cn_cbor* cb, const char* key) { cn_cbor *cp; int keylen; assert(cb); assert(key); keylen = strlen(key); for (cp = cb->first_child; cp && cp->next; cp = cp->next->next) { switch(cp->type) { case CN_CBOR_TEXT: // fall-through case CN_CBOR_BYTES: if (keylen != cp->length) { continue; } if (memcmp(key, cp->v.str, keylen) == 0) { return cp->next; } default: ; // skip non-string keys } } return NULL; } cn_cbor* cn_cbor_index(const cn_cbor* cb, unsigned int idx) { cn_cbor *cp; unsigned int i = 0; assert(cb); for (cp = cb->first_child; cp; cp = cp->next) { if (i == idx) { return cp; } i++; } return NULL; }