summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrimio <vasi.vilvoiu@gmail.com>2018-03-01 21:24:07 +0200
committerrimio <vasi.vilvoiu@gmail.com>2018-03-01 21:24:07 +0200
commitdd2de65b85cdc7a7744145214ecf8ea5ebe46c25 (patch)
tree1f6c4e1efae92285af903f59168571ec5ef98173
parentdf8d9c31e2191aeedd967560f222971d978a9a1c (diff)
Added endianness conversion; Added first 10 answer files; fixed test case; fixed small issue in describe tool
-rw-r--r--src/ecbor.c51
-rw-r--r--src/ecbor_decoder.c9
-rw-r--r--src/ecbor_describe.c4
-rw-r--r--src/ecbor_internal.h14
-rw-r--r--test/files/appendix_a/0000.answer1
-rw-r--r--test/files/appendix_a/0001.answer1
-rw-r--r--test/files/appendix_a/0002.answer1
-rw-r--r--test/files/appendix_a/0003.answer1
-rw-r--r--test/files/appendix_a/0004.answer1
-rw-r--r--test/files/appendix_a/0005.answer1
-rw-r--r--test/files/appendix_a/0006.answer1
-rw-r--r--test/files/appendix_a/0007.answer1
-rw-r--r--test/files/appendix_a/0008.answer1
-rw-r--r--test/files/appendix_a/0009.answer1
-rw-r--r--test/files/appendix_a/0010.answer1
-rw-r--r--test/files/appendix_a/0010.hex2
16 files changed, 85 insertions, 6 deletions
diff --git a/src/ecbor.c b/src/ecbor.c
index 9e8404f..dbbed96 100644
--- a/src/ecbor.c
+++ b/src/ecbor.c
@@ -6,6 +6,57 @@
*/
#include "ecbor.h"
+#include "ecbor_internal.h"
+
+uint16_t
+ecbor_uint16_from_big_endian (uint16_t value)
+{
+#if __BYTE_ORDER__ && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+ return value;
+#elif __BYTE_ORDER__ && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+ /* TODO: ARM optimization */
+ return ((value << 8) & 0xff00)
+ | ((value >> 8) & 0x00ff);
+#else
+ #error "Endianness not supported!"
+#endif
+}
+
+uint32_t
+ecbor_uint32_from_big_endian (uint32_t value)
+{
+#if __BYTE_ORDER__ && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+ return value;
+#elif __BYTE_ORDER__ && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+ /* TODO: ARM optimization */
+ return ((value << 8) & 0x00ff0000)
+ | ((value >> 8) & 0x0000ff00)
+ | ((value << 24) & 0xff000000)
+ | ((value >> 24) & 0x000000ff);
+#else
+ #error "Endianness not supported!"
+#endif
+}
+
+uint64_t
+ecbor_uint64_from_big_endian (uint64_t value)
+{
+#if __BYTE_ORDER__ && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+ return value;
+#elif __BYTE_ORDER__ && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+ /* TODO: ARM optimization */
+ return ((value << 8) & 0x000000ff00000000)
+ | ((value >> 8) & 0x00000000ff000000)
+ | ((value << 24) & 0x0000ff0000000000)
+ | ((value >> 24) & 0x0000000000ff0000)
+ | ((value << 40) & 0x00ff000000000000)
+ | ((value >> 40) & 0x000000000000ff00)
+ | ((value << 56) & 0xff00000000000000)
+ | ((value >> 56) & 0x00000000000000ff);
+#else
+ #error "Endianness not supported!"
+#endif
+}
extern ecbor_major_type_t
ecbor_get_type (ecbor_item_t *item)
diff --git a/src/ecbor_decoder.c b/src/ecbor_decoder.c
index dfd3cad..d9cea78 100644
--- a/src/ecbor_decoder.c
+++ b/src/ecbor_decoder.c
@@ -116,15 +116,18 @@ ecbor_decode_uint (ecbor_decode_context_t *context,
break;
case ECBOR_ADDITIONAL_2BYTE:
- (*value) = *((uint16_t *) context->in_position);
+ (*value) =
+ ecbor_uint16_from_big_endian (*((uint16_t *) context->in_position));
break;
case ECBOR_ADDITIONAL_4BYTE:
- (*value) = *((uint32_t *) context->in_position);
+ (*value) =
+ ecbor_uint32_from_big_endian (*((uint32_t *) context->in_position));
break;
case ECBOR_ADDITIONAL_8BYTE:
- (*value) = *((uint64_t *) context->in_position);
+ (*value) =
+ ecbor_uint64_from_big_endian (*((uint64_t *) context->in_position));
break;
default:
diff --git a/src/ecbor_describe.c b/src/ecbor_describe.c
index 1f5dd5a..de1025c 100644
--- a/src/ecbor_describe.c
+++ b/src/ecbor_describe.c
@@ -67,7 +67,7 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix)
return rc;
}
- printf ("[NINT] value %d\n", (int)val);
+ printf ("[NINT] value %lld\n", (long long int)val);
}
break;
@@ -80,7 +80,7 @@ print_ecbor_item (ecbor_item_t *item, unsigned int level, char *prefix)
return rc;
}
- printf ("[UINT] value %u\n", (unsigned int) val);
+ printf ("[UINT] value %llu\n", (unsigned long long int) val);
}
break;
diff --git a/src/ecbor_internal.h b/src/ecbor_internal.h
index f0ec24b..b783eb1 100644
--- a/src/ecbor_internal.h
+++ b/src/ecbor_internal.h
@@ -8,6 +8,8 @@
#ifndef _ECBOR_INTERNAL_H_
#define _ECBOR_INTERNAL_H_
+#include <stdint.h>
+
/* Don't rely on <stddef.h> for this */
#define NULL 0
#define false 0
@@ -23,4 +25,16 @@ enum {
ECBOR_ADDITIONAL_INDEFINITE = 31
};
+/*
+ * Endianness
+ */
+extern uint16_t
+ecbor_uint16_from_big_endian (uint16_t value);
+
+extern uint32_t
+ecbor_uint32_from_big_endian (uint32_t value);
+
+extern uint64_t
+ecbor_uint64_from_big_endian (uint64_t value);
+
#endif \ No newline at end of file
diff --git a/test/files/appendix_a/0000.answer b/test/files/appendix_a/0000.answer
new file mode 100644
index 0000000..b1d832d
--- /dev/null
+++ b/test/files/appendix_a/0000.answer
@@ -0,0 +1 @@
+[UINT] value 0
diff --git a/test/files/appendix_a/0001.answer b/test/files/appendix_a/0001.answer
new file mode 100644
index 0000000..489ed0e
--- /dev/null
+++ b/test/files/appendix_a/0001.answer
@@ -0,0 +1 @@
+[UINT] value 1
diff --git a/test/files/appendix_a/0002.answer b/test/files/appendix_a/0002.answer
new file mode 100644
index 0000000..7211482
--- /dev/null
+++ b/test/files/appendix_a/0002.answer
@@ -0,0 +1 @@
+[UINT] value 10
diff --git a/test/files/appendix_a/0003.answer b/test/files/appendix_a/0003.answer
new file mode 100644
index 0000000..97ede99
--- /dev/null
+++ b/test/files/appendix_a/0003.answer
@@ -0,0 +1 @@
+[UINT] value 23
diff --git a/test/files/appendix_a/0004.answer b/test/files/appendix_a/0004.answer
new file mode 100644
index 0000000..2040193
--- /dev/null
+++ b/test/files/appendix_a/0004.answer
@@ -0,0 +1 @@
+[UINT] value 24
diff --git a/test/files/appendix_a/0005.answer b/test/files/appendix_a/0005.answer
new file mode 100644
index 0000000..aebf27b
--- /dev/null
+++ b/test/files/appendix_a/0005.answer
@@ -0,0 +1 @@
+[UINT] value 25
diff --git a/test/files/appendix_a/0006.answer b/test/files/appendix_a/0006.answer
new file mode 100644
index 0000000..944ef47
--- /dev/null
+++ b/test/files/appendix_a/0006.answer
@@ -0,0 +1 @@
+[UINT] value 100
diff --git a/test/files/appendix_a/0007.answer b/test/files/appendix_a/0007.answer
new file mode 100644
index 0000000..dda4c4f
--- /dev/null
+++ b/test/files/appendix_a/0007.answer
@@ -0,0 +1 @@
+[UINT] value 1000
diff --git a/test/files/appendix_a/0008.answer b/test/files/appendix_a/0008.answer
new file mode 100644
index 0000000..984795b
--- /dev/null
+++ b/test/files/appendix_a/0008.answer
@@ -0,0 +1 @@
+[UINT] value 1000000
diff --git a/test/files/appendix_a/0009.answer b/test/files/appendix_a/0009.answer
new file mode 100644
index 0000000..8960b40
--- /dev/null
+++ b/test/files/appendix_a/0009.answer
@@ -0,0 +1 @@
+[UINT] value 1000000000000
diff --git a/test/files/appendix_a/0010.answer b/test/files/appendix_a/0010.answer
new file mode 100644
index 0000000..529f210
--- /dev/null
+++ b/test/files/appendix_a/0010.answer
@@ -0,0 +1 @@
+[UINT] value 18446744073709551615
diff --git a/test/files/appendix_a/0010.hex b/test/files/appendix_a/0010.hex
index f925e5a..ab5a053 100644
--- a/test/files/appendix_a/0010.hex
+++ b/test/files/appendix_a/0010.hex
@@ -1 +1 @@
-1bfffffffffffffffc249010000000000000000f \ No newline at end of file
+1bffffffffffffffff