#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;
|
}
|