summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrimio <vasi.vilvoiu@gmail.com>2018-03-02 00:04:17 +0200
committerrimio <vasi.vilvoiu@gmail.com>2018-03-02 00:04:17 +0200
commit760860f3a34873e00cbf2ccb473f78cf3933a2f2 (patch)
treee9bed480f87a69225b5715ab8b6c7c9610292494
parent3d821056f53edcf6fc8786f0d156fa56720a0c5a (diff)
Added support for boolean and null types; added test case answers
-rw-r--r--include/ecbor.h4
-rw-r--r--src/ecbor.c4
-rw-r--r--src/ecbor_decoder.c37
-rw-r--r--src/ecbor_describe.c17
-rw-r--r--src/ecbor_internal.h8
-rw-r--r--test/files/appendix_a/0040.answer1
-rw-r--r--test/files/appendix_a/0041.answer1
-rw-r--r--test/files/appendix_a/0042.answer1
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]