I added cn_cbor_mapget_* in a previous checkin, this one adds cn_cbor_index
diff --git a/cn-cbor.c b/cn-cbor.c
index c1b1bea..95164e4 100644
--- a/cn-cbor.c
+++ b/cn-cbor.c
@@ -258,43 +258,67 @@
}
const cn_cbor* cn_cbor_mapget_int(const cn_cbor* cb, int key) {
- cn_cbor* cp;
- assert(cb);
- 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;
- }
- case CN_CBOR_INT:
- if (cp->v.sint == (long)key) {
- return cp->next;
- }
- break;
- default:
- ; // skip non-integer keys
- }
+ cn_cbor* cp;
+ assert(cb);
+ 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;
+ }
+ case CN_CBOR_INT:
+ if (cp->v.sint == (long)key) {
+ return cp->next;
+ }
+ break;
+ default:
+ ; // skip non-integer keys
}
- return NULL;
+ }
+ return NULL;
}
const cn_cbor* cn_cbor_mapget_string(const cn_cbor* cb, const char* key) {
- cn_cbor *cp;
- assert(cb);
- assert(key);
- for (cp = cb->first_child; cp && cp->next; cp = cp->next->next) {
- switch(cp->type) {
- case CN_CBOR_TEXT:
- case CN_CBOR_BYTES:
- if (strncmp(key, cp->v.str, cp->length) == 0) {
- return cp->next;
- }
- break;
- default:
- ; // skip non-string keys
- }
+ cn_cbor *cp;
+ int keylen;
+ assert(cb);
+ assert(key);
+ keylen = strlen(key);
+ for (cp = cb->first_child; cp && cp->next; cp = cp->next->next) {
+ switch(cp->type) {
+ case CN_CBOR_TEXT:
+ if (keylen != cp->length) {
+ continue;
+ }
+ if (strncmp(key, cp->v.str, cp->length) == 0) {
+ return cp->next;
+ }
+ break;
+ 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;
+ }
+ return NULL;
+}
+
+const cn_cbor* cn_cbor_index(const cn_cbor* cb, int idx) {
+ cn_cbor *cp;
+ int i = 0;
+ assert(cb);
+ for (cp = cb->first_child; cp; cp = cp->next) {
+ if (i == idx) {
+ return cp;
+ }
+ i++;
+ }
+ return NULL;
}
#ifdef __cplusplus