diff options
| author | rimio <vasi.vilvoiu@gmail.com> | 2018-03-02 00:04:17 +0200 |
|---|---|---|
| committer | rimio <vasi.vilvoiu@gmail.com> | 2018-03-02 00:04:17 +0200 |
| commit | 760860f3a34873e00cbf2ccb473f78cf3933a2f2 (patch) | |
| tree | e9bed480f87a69225b5715ab8b6c7c9610292494 | |
| parent | 3d821056f53edcf6fc8786f0d156fa56720a0c5a (diff) | |
Added support for boolean and null types; added test case answers
| -rw-r--r-- | include/ecbor.h | 4 | ||||
| -rw-r--r-- | src/ecbor.c | 4 | ||||
| -rw-r--r-- | src/ecbor_decoder.c | 37 | ||||
| -rw-r--r-- | src/ecbor_describe.c | 17 | ||||
| -rw-r--r-- | src/ecbor_internal.h | 8 | ||||
| -rw-r--r-- | test/files/appendix_a/0040.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0041.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0042.answer | 1 |
8 files changed, 70 insertions, 3 deletions
diff --git a/include/ecbor.h b/include/ecbor.h index db6786b..0977e4b 100644 --- a/include/ecbor.h +++ b/include/ecbor.h @@ -82,9 +82,11 @@ typedef enum { ECBOR_TYPE_FP16 = 8, ECBOR_TYPE_FP32 = 9, ECBOR_TYPE_FP64 = 10, + ECBOR_TYPE_BOOL = 11, + ECBOR_TYPE_NULL = 12, /* Last type, used for bounds checking */ - ECBOR_TYPE_LAST = 10 + ECBOR_TYPE_LAST = ECBOR_TYPE_NULL } ecbor_type_t; /* diff --git a/src/ecbor.c b/src/ecbor.c index b2580d8..2093366 100644 --- a/src/ecbor.c +++ b/src/ecbor.c @@ -138,6 +138,10 @@ ecbor_get_value (ecbor_item_t *item, void *value) case ECBOR_TYPE_FP64: *((double *)value) = item->value.fp64; break; + + case ECBOR_TYPE_BOOL: + *((uint64_t *)value) = item->value.uinteger; + break; default: return ECBOR_ERR_INVALID_TYPE; diff --git a/src/ecbor_decoder.c b/src/ecbor_decoder.c index 8d114dd..9990ac5 100644 --- a/src/ecbor_decoder.c +++ b/src/ecbor_decoder.c @@ -195,6 +195,31 @@ ecbor_decode_fp64 (ecbor_decode_context_t *context, return ECBOR_OK; } +static inline ecbor_error_t +ecbor_decode_simple_value (ecbor_item_t *item) +{ + switch (item->value.uinteger) { + case ECBOR_SIMPLE_FALSE: + case ECBOR_SIMPLE_TRUE: + item->type = ECBOR_TYPE_BOOL; + item->value.uinteger = + (item->value.uinteger == ECBOR_SIMPLE_FALSE ? 0 : 1); + break; + + case ECBOR_SIMPLE_NULL: + item->type = ECBOR_TYPE_NULL; + break; + + case ECBOR_SIMPLE_UNDEFINED: + break; + + default: + return ECBOR_ERR_CURRENTLY_NOT_SUPPORTED; + } + + return ECBOR_OK; +} + static ecbor_error_t ecbor_decode_next_internal (ecbor_decode_context_t *context, ecbor_item_t *item, @@ -471,8 +496,16 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, item->size = 1; return ECBOR_END_OF_INDEFINITE; } else if (additional <= ECBOR_ADDITIONAL_1BYTE) { - return ecbor_decode_uint (context, &item->value.uinteger, &item->size, - additional); + ecbor_error_t rc; + /* read integer simple value */ + rc = ecbor_decode_uint (context, &item->value.uinteger, &item->size, + additional); + if (rc != ECBOR_OK) { + return rc; + } + + /* parse simple value */ + return ecbor_decode_simple_value (item); } else if (additional == ECBOR_ADDITIONAL_2BYTE) { /* currently we do not support half float */ return ECBOR_ERR_CURRENTLY_NOT_SUPPORTED; diff --git a/src/ecbor_describe.c b/src/ecbor_describe.c index a301367..fea511c 100644 --- a/src/ecbor_describe.c +++ b/src/ecbor_describe.c @@ -246,6 +246,23 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix) printf ("[FP64] value %f\n", val); } break; + + case ECBOR_TYPE_BOOL: + { + uint64_t val; + + rc = ecbor_get_value (item, (void *) &val); + if (rc != ECBOR_OK) { + return rc; + } + + printf ("[BOOL] value %s\n", (val ? "true" : "false")); + } + break; + + case ECBOR_TYPE_NULL: + printf ("[NULL]\n"); + break; default: printf ("[UNKNOWN]\n"); diff --git a/src/ecbor_internal.h b/src/ecbor_internal.h index 7b29546..abeaf97 100644 --- a/src/ecbor_internal.h +++ b/src/ecbor_internal.h @@ -30,6 +30,14 @@ enum { ECBOR_ADDITIONAL_INDEFINITE = 31 }; +/* Simple value meanings */ +enum { + ECBOR_SIMPLE_FALSE = 20, + ECBOR_SIMPLE_TRUE = 21, + ECBOR_SIMPLE_NULL = 22, + ECBOR_SIMPLE_UNDEFINED = 23 +}; + /* * Endianness */ diff --git a/test/files/appendix_a/0040.answer b/test/files/appendix_a/0040.answer new file mode 100644 index 0000000..4aeb834 --- /dev/null +++ b/test/files/appendix_a/0040.answer @@ -0,0 +1 @@ +[BOOL] value false diff --git a/test/files/appendix_a/0041.answer b/test/files/appendix_a/0041.answer new file mode 100644 index 0000000..282d160 --- /dev/null +++ b/test/files/appendix_a/0041.answer @@ -0,0 +1 @@ +[BOOL] value true diff --git a/test/files/appendix_a/0042.answer b/test/files/appendix_a/0042.answer new file mode 100644 index 0000000..4415167 --- /dev/null +++ b/test/files/appendix_a/0042.answer @@ -0,0 +1 @@ +[NULL] |
