1 #include <stdlib.h> 2 #include <string.h> 3 #include <assert.h> 4 5 #include "cn-cbor/cn-cbor.h" 6 cn_cbor_mapget_int(const cn_cbor * cb,int key)7cn_cbor* cn_cbor_mapget_int(const cn_cbor* cb, int key) { 8 cn_cbor* cp; 9 assert(cb); 10 for (cp = cb->first_child; cp && cp->next; cp = cp->next->next) { 11 switch(cp->type) { 12 case CN_CBOR_UINT: 13 if (cp->v.uint == (unsigned long)key) { 14 return cp->next; 15 } 16 break; 17 case CN_CBOR_INT: 18 if (cp->v.sint == (long)key) { 19 return cp->next; 20 } 21 break; 22 default: 23 ; // skip non-integer keys 24 } 25 } 26 return NULL; 27 } 28 cn_cbor_mapget_string(const cn_cbor * cb,const char * key)29cn_cbor* cn_cbor_mapget_string(const cn_cbor* cb, const char* key) { 30 cn_cbor *cp; 31 int keylen; 32 assert(cb); 33 assert(key); 34 keylen = strlen(key); 35 for (cp = cb->first_child; cp && cp->next; cp = cp->next->next) { 36 switch(cp->type) { 37 case CN_CBOR_TEXT: // fall-through 38 case CN_CBOR_BYTES: 39 if (keylen != cp->length) { 40 continue; 41 } 42 if (memcmp(key, cp->v.str, keylen) == 0) { 43 return cp->next; 44 } 45 default: 46 ; // skip non-string keys 47 } 48 } 49 return NULL; 50 } 51 cn_cbor_index(const cn_cbor * cb,unsigned int idx)52cn_cbor* cn_cbor_index(const cn_cbor* cb, unsigned int idx) { 53 cn_cbor *cp; 54 unsigned int i = 0; 55 assert(cb); 56 for (cp = cb->first_child; cp; cp = cp->next) { 57 if (i == idx) { 58 return cp; 59 } 60 i++; 61 } 62 return NULL; 63 } 64