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)7 cn_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)29 cn_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)52 cn_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