blob: ced2243a5d8d495c7b721b39d505025b4469e7b7 [file] [log] [blame]
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "dll-export.h"
#include "cn-cbor/cn-cbor.h"
MYLIB_EXPORT
cn_cbor* cn_cbor_mapget_int(const cn_cbor* cb, int key)
{
cn_cbor* cp;
assert(cb);
if (cb == NULL) {
return NULL;
}
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;
}
MYLIB_EXPORT
cn_cbor* cn_cbor_mapget_string(const cn_cbor* cb, const char* key)
{
cn_cbor* cp = NULL;
assert(cb != NULL);
assert(key != NULL);
if (cb == NULL || key == NULL) {
return NULL;
}
size_t 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;
}
MYLIB_EXPORT
cn_cbor* cn_cbor_index(const cn_cbor* cb, unsigned int idx)
{
cn_cbor* cp;
unsigned int i = 0;
assert(cb);
if (cb == NULL) {
return NULL;
}
for (cp = cb->first_child; cp; cp = cp->next) {
if (i == idx) {
return cp;
}
i++;
}
return NULL;
}