From 3d821056f53edcf6fc8786f0d156fa56720a0c5a Mon Sep 17 00:00:00 2001 From: rimio Date: Thu, 1 Mar 2018 23:33:16 +0200 Subject: Refactor major_type->type; hide major type 7 from user --- src/ecbor.c | 46 +++++++++++++++++------------------ src/ecbor_decoder.c | 69 +++++++++++++++++++++++++++------------------------- src/ecbor_describe.c | 20 +++++++-------- src/ecbor_internal.h | 5 ++++ 4 files changed, 74 insertions(+), 66 deletions(-) (limited to 'src') diff --git a/src/ecbor.c b/src/ecbor.c index 0a5e3fb..b2580d8 100644 --- a/src/ecbor.c +++ b/src/ecbor.c @@ -84,17 +84,17 @@ ecbor_fp64_from_big_endian (double value) #endif } -extern ecbor_major_type_t +extern ecbor_type_t ecbor_get_type (ecbor_item_t *item) { if (!item) { - return ECBOR_MT_UNDEFINED; + return ECBOR_TYPE_UNDEFINED; } - if (item->major_type < ECBOR_MT_FIRST - || item->major_type > ECBOR_MT_LAST) { - return ECBOR_MT_UNDEFINED; + if (item->type < ECBOR_TYPE_FIRST + || item->type > ECBOR_TYPE_LAST) { + return ECBOR_TYPE_UNDEFINED; } - return item->major_type; + return item->type; } extern ecbor_error_t @@ -107,35 +107,35 @@ ecbor_get_value (ecbor_item_t *item, void *value) return ECBOR_ERR_NULL_VALUE; } - switch (item->major_type) { - case ECBOR_MT_NINT: + switch (item->type) { + case ECBOR_TYPE_NINT: *((int64_t *)value) = item->value.integer; break; - case ECBOR_MT_UINT: + case ECBOR_TYPE_UINT: *((uint64_t *)value) = item->value.uinteger; break; - case ECBOR_MT_BSTR: - case ECBOR_MT_STR: + case ECBOR_TYPE_BSTR: + case ECBOR_TYPE_STR: if (item->is_indefinite) { return ECBOR_ERR_WONT_RETURN_INDEFINITE; } *((uint8_t **)value) = (uint8_t *) item->value.string.str; break; - case ECBOR_MT_TAG: + case ECBOR_TYPE_TAG: *((uint64_t *)value) = item->value.tag.tag_value; break; - case ECBOR_MT_FP16: + case ECBOR_TYPE_FP16: return ECBOR_ERR_CURRENTLY_NOT_SUPPORTED; - case ECBOR_MT_FP32: + case ECBOR_TYPE_FP32: *((float *)value) = item->value.fp32; break; - case ECBOR_MT_FP64: + case ECBOR_TYPE_FP64: *((double *)value) = item->value.fp64; break; @@ -156,14 +156,14 @@ ecbor_get_length (ecbor_item_t *item, uint64_t *length) return ECBOR_ERR_NULL_VALUE; } - switch (item->major_type) { - case ECBOR_MT_BSTR: - case ECBOR_MT_STR: - case ECBOR_MT_ARRAY: + switch (item->type) { + case ECBOR_TYPE_BSTR: + case ECBOR_TYPE_STR: + case ECBOR_TYPE_ARRAY: *length = item->length; break; - case ECBOR_MT_MAP: + case ECBOR_TYPE_MAP: *length = item->length / 2; break; @@ -185,7 +185,7 @@ ecbor_get_array_item (ecbor_item_t *array, uint64_t index, if (!array) { return ECBOR_ERR_NULL_ARRAY; } - if (array->major_type != ECBOR_MT_ARRAY) { + if (array->type != ECBOR_TYPE_ARRAY) { return ECBOR_ERR_INVALID_TYPE; } if (array->length <= index) { @@ -225,7 +225,7 @@ ecbor_get_map_item (ecbor_item_t *map, uint64_t index, ecbor_item_t *key, if (!map) { return ECBOR_ERR_NULL_MAP; } - if (map->major_type != ECBOR_MT_MAP) { + if (map->type != ECBOR_TYPE_MAP) { return ECBOR_ERR_INVALID_TYPE; } if (map->length <= (index * 2)) { @@ -272,7 +272,7 @@ ecbor_get_tag_item (ecbor_item_t *tag, ecbor_item_t *item) if (!tag) { return ECBOR_ERR_NULL_ITEM; } - if (tag->major_type != ECBOR_MT_TAG) { + if (tag->type != ECBOR_TYPE_TAG) { return ECBOR_ERR_INVALID_TYPE; } if (!item) { diff --git a/src/ecbor_decoder.c b/src/ecbor_decoder.c index 1c065d8..8d114dd 100644 --- a/src/ecbor_decoder.c +++ b/src/ecbor_decoder.c @@ -199,7 +199,7 @@ static ecbor_error_t ecbor_decode_next_internal (ecbor_decode_context_t *context, ecbor_item_t *item, int8_t is_chunk, - ecbor_major_type_t chunk_mtype) + ecbor_type_t chunk_mtype) { unsigned int additional; @@ -214,21 +214,21 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, } /* clear item, just so we do not leave garbage on partial read */ - item->major_type = ECBOR_MT_UNDEFINED; + item->type = ECBOR_TYPE_UNDEFINED; item->size = 0; item->length = 0; item->is_indefinite = false; /* extract major type (most significant three bits) and additional info */ - item->major_type = (*context->in_position >> 5) & 0x07; + item->type = (*context->in_position >> 5) & 0x07; additional = (*context->in_position & 0x1f); context->in_position ++; context->bytes_left --; /* check mandatory major type (in case we are reading string chunks); we do not want to continue parsing a malformed indefinite string and potentially explode the stack with subsequent calls */ - if (is_chunk && chunk_mtype != item->major_type) { - if (item->major_type == ECBOR_MT_SPECIAL + if (is_chunk && chunk_mtype != item->type) { + if (item->type == (ecbor_type_t) ECBOR_TYPE_SPECIAL && additional == ECBOR_ADDITIONAL_INDEFINITE) { /* this is a valid stop code, pass it directly; note that this branch is only taken when inside an indefinite string */ @@ -240,16 +240,16 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, } /* handle type */ - switch (item->major_type) { + switch (item->type) { /* * Integer types */ - case ECBOR_MT_UINT: + case ECBOR_TYPE_UINT: return ecbor_decode_uint (context, &item->value.uinteger, &item->size, additional); - case ECBOR_MT_NINT: + case ECBOR_TYPE_NINT: { /* read negative value as unsigned */ ecbor_error_t rc = ecbor_decode_uint (context, &item->value.uinteger, @@ -266,8 +266,8 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, /* * String types */ - case ECBOR_MT_BSTR: - case ECBOR_MT_STR: + case ECBOR_TYPE_BSTR: + case ECBOR_TYPE_STR: /* keep buffer pointer from current pointer */ item->value.string.str = context->in_position; item->value.string.n_chunks = 0; @@ -295,7 +295,7 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, while (true) { /* read next chunk */ rc = ecbor_decode_next_internal (context, &chunk, true, - item->major_type); + item->type); if (rc != ECBOR_OK) { if (rc == ECBOR_END_OF_INDEFINITE) { /* stop code found, break from loop */ @@ -339,8 +339,8 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, /* * Arrays and maps */ - case ECBOR_MT_ARRAY: - case ECBOR_MT_MAP: + case ECBOR_TYPE_ARRAY: + case ECBOR_TYPE_MAP: /* keep buffer pointer from current pointer */ item->value.items = context->in_position; @@ -359,7 +359,7 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, while (true) { /* read next chunk */ rc = ecbor_decode_next_internal (context, &child, false, - ECBOR_MT_UNDEFINED); + ECBOR_TYPE_UNDEFINED); if (rc != ECBOR_OK) { if (rc == ECBOR_END_OF_INDEFINITE) { /* stop code found, break from loop */ @@ -380,7 +380,7 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, item->length ++; } - if ((item->major_type == ECBOR_MT_MAP) && (item->length % 2 != 0)) { + if ((item->type == ECBOR_TYPE_MAP) && (item->length % 2 != 0)) { /* incomplete key-value pair; we expect maps to have even number of items */ return ECBOR_ERR_INVALID_KEY_VALUE_PAIR; @@ -394,7 +394,7 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, return rc; } - if (item->major_type == ECBOR_MT_MAP) { + if (item->type == ECBOR_TYPE_MAP) { /* we keep the total number of items in length, yet the map has the number of key-value pairs encoded in the length */ item->length *= 2; @@ -409,7 +409,7 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, for (child_no = 0; child_no < item->length; child_no ++) { /* read next child */ rc = ecbor_decode_next_internal (context, &child, false, - ECBOR_MT_UNDEFINED); + ECBOR_TYPE_UNDEFINED); if (rc != ECBOR_OK) { if (rc == ECBOR_END_OF_INDEFINITE) { /* stop code found, but none is expected */ @@ -431,7 +431,7 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, } break; - case ECBOR_MT_TAG: + case ECBOR_TYPE_TAG: { ecbor_error_t rc; @@ -451,7 +451,7 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, /* not in streamed mode; compute size so we can advance */ rc = ecbor_decode_next_internal (context, &child, false, - ECBOR_MT_UNDEFINED); + ECBOR_TYPE_UNDEFINED); if (rc != ECBOR_OK) { return rc; } @@ -462,7 +462,10 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, } break; - case ECBOR_MT_SPECIAL: +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wswitch" + case ECBOR_TYPE_SPECIAL: +#pragma GCC diagnostic pop if (additional == ECBOR_ADDITIONAL_INDEFINITE) { /* stop code */ item->size = 1; @@ -475,11 +478,11 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, return ECBOR_ERR_CURRENTLY_NOT_SUPPORTED; } else if (additional == ECBOR_ADDITIONAL_4BYTE) { /* floating point 32bit */ - item->major_type = ECBOR_MT_FP32; + item->type = ECBOR_TYPE_FP32; return ecbor_decode_fp32 (context, &item->value.fp32, &item->size); } else if (additional == ECBOR_ADDITIONAL_8BYTE) { /* floating point 64bit */ - item->major_type = ECBOR_MT_FP64; + item->type = ECBOR_TYPE_FP64; return ecbor_decode_fp64 (context, &item->value.fp64, &item->size); } else { /* currently unassigned according to RFC */ @@ -514,7 +517,7 @@ ecbor_decode (ecbor_decode_context_t *context, ecbor_item_t *item) } /* we just get the next item */ - return ecbor_decode_next_internal (context, item, false, ECBOR_MT_UNDEFINED); + return ecbor_decode_next_internal (context, item, false, ECBOR_TYPE_UNDEFINED); } extern ecbor_error_t @@ -551,20 +554,20 @@ ecbor_decode_tree (ecbor_decode_context_t *context) /* consume next item */ rc = ecbor_decode_next_internal (context, &curr_node->item, false, - ECBOR_MT_UNDEFINED); + ECBOR_TYPE_UNDEFINED); /* handle end of indefinite */ if (rc == ECBOR_END_OF_INDEFINITE) { if ((!par_node) - || (par_node->item.major_type != ECBOR_MT_MAP - && par_node->item.major_type != ECBOR_MT_ARRAY) + || (par_node->item.type != ECBOR_TYPE_MAP + && par_node->item.type != ECBOR_TYPE_ARRAY) || (!par_node->item.is_indefinite)) { /* we are not in an indefinite map or array */ rc = ECBOR_ERR_INVALID_STOP_CODE; goto end; } - if (par_node && par_node->item.major_type == ECBOR_MT_MAP + if (par_node && par_node->item.type == ECBOR_TYPE_MAP && prev_node && (prev_node->index % 2 == 0)) { /* map must have even number of children */ rc = ECBOR_ERR_INVALID_KEY_VALUE_PAIR; @@ -608,9 +611,9 @@ ecbor_decode_tree (ecbor_decode_context_t *context) } /* handle new children */ - if (curr_node->item.major_type == ECBOR_MT_MAP - || curr_node->item.major_type == ECBOR_MT_ARRAY - || curr_node->item.major_type == ECBOR_MT_TAG) { + if (curr_node->item.type == ECBOR_TYPE_MAP + || curr_node->item.type == ECBOR_TYPE_ARRAY + || curr_node->item.type == ECBOR_TYPE_TAG) { /* jump a level down */ par_node = curr_node; prev_node = NULL; @@ -619,9 +622,9 @@ ecbor_decode_tree (ecbor_decode_context_t *context) /* handle end of definite maps and arrays, and tags */ while (par_node - && (par_node->item.major_type == ECBOR_MT_MAP - || par_node->item.major_type == ECBOR_MT_ARRAY - || par_node->item.major_type == ECBOR_MT_TAG) + && (par_node->item.type == ECBOR_TYPE_MAP + || par_node->item.type == ECBOR_TYPE_ARRAY + || par_node->item.type == ECBOR_TYPE_TAG) && !par_node->item.is_indefinite && par_node->item.length == (curr_node->index + 1)) { /* parent has filled all items, jump a level up */ diff --git a/src/ecbor_describe.c b/src/ecbor_describe.c index 1cd9917..a301367 100644 --- a/src/ecbor_describe.c +++ b/src/ecbor_describe.c @@ -49,7 +49,7 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix) { static const unsigned int max_str_print_len = 64; static const char *msg_too_large = ""; - ecbor_major_type_t mt; + ecbor_type_t mt; ecbor_error_t rc; unsigned int i; @@ -58,7 +58,7 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix) mt = ecbor_get_type (item); switch (mt) { - case ECBOR_MT_NINT: + case ECBOR_TYPE_NINT: { int64_t val; @@ -71,7 +71,7 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix) } break; - case ECBOR_MT_UINT: + case ECBOR_TYPE_UINT: { uint64_t val; @@ -84,7 +84,7 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix) } break; - case ECBOR_MT_STR: + case ECBOR_TYPE_STR: { uint64_t len; char *val; @@ -106,7 +106,7 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix) } break; - case ECBOR_MT_BSTR: + case ECBOR_TYPE_BSTR: { uint64_t len; char *val; @@ -135,7 +135,7 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix) } break; - case ECBOR_MT_ARRAY: + case ECBOR_TYPE_ARRAY: { uint64_t len, i; @@ -162,7 +162,7 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix) } break; - case ECBOR_MT_MAP: + case ECBOR_TYPE_MAP: { uint64_t len, i; char kv_msg[100] = { 0 }; @@ -197,7 +197,7 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix) } break; - case ECBOR_MT_TAG: + case ECBOR_TYPE_TAG: { int64_t val; ecbor_item_t child; @@ -221,7 +221,7 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix) } break; - case ECBOR_MT_FP32: + case ECBOR_TYPE_FP32: { float val; @@ -234,7 +234,7 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix) } break; - case ECBOR_MT_FP64: + case ECBOR_TYPE_FP64: { double val; diff --git a/src/ecbor_internal.h b/src/ecbor_internal.h index e5e4179..7b29546 100644 --- a/src/ecbor_internal.h +++ b/src/ecbor_internal.h @@ -15,6 +15,11 @@ #define false 0 #define true 1 +/* CBOR major type 7 must not be exposed to user, but translated to other types */ +enum { + ECBOR_TYPE_SPECIAL = 7 +}; + /* Additional value meanings */ enum { ECBOR_ADDITIONAL_1BYTE = 24, -- cgit v1.2.3