diff options
| author | rimio <vasi.vilvoiu@gmail.com> | 2018-03-01 21:24:07 +0200 |
|---|---|---|
| committer | rimio <vasi.vilvoiu@gmail.com> | 2018-03-01 21:24:07 +0200 |
| commit | dd2de65b85cdc7a7744145214ecf8ea5ebe46c25 (patch) | |
| tree | 1f6c4e1efae92285af903f59168571ec5ef98173 | |
| parent | df8d9c31e2191aeedd967560f222971d978a9a1c (diff) | |
Added endianness conversion; Added first 10 answer files; fixed test case; fixed small issue in describe tool
| -rw-r--r-- | src/ecbor.c | 51 | ||||
| -rw-r--r-- | src/ecbor_decoder.c | 9 | ||||
| -rw-r--r-- | src/ecbor_describe.c | 4 | ||||
| -rw-r--r-- | src/ecbor_internal.h | 14 | ||||
| -rw-r--r-- | test/files/appendix_a/0000.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0001.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0002.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0003.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0004.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0005.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0006.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0007.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0008.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0009.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0010.answer | 1 | ||||
| -rw-r--r-- | test/files/appendix_a/0010.hex | 2 |
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 |
