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