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 Workercn_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 Workercn_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 Workercn_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