| #include <stdlib.h> |
| #include <string.h> |
| #include <assert.h> |
| |
| #include "dll-export.h" |
| |
| #include "cn-cbor/cn-cbor.h" |
| |
| CN_CBOR_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; |
| } |
| |
| CN_CBOR_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; |
| } |
| |
| CN_CBOR_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; |
| } |