From 86fd58c8c6bcc24184150ce78af8b5b0f23d1eba Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Mon, 27 Feb 2023 20:14:59 +0100 Subject: [PATCH] Move the sign extension function to a common place --- src/array.c | 20 ++++++++++++++++++++ src/array.h | 3 +++ src/uwatec_smart_parser.c | 21 +-------------------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/array.c b/src/array.c index 1216d41..29f5faf 100644 --- a/src/array.c +++ b/src/array.c @@ -384,3 +384,23 @@ dec2bcd (unsigned char value) unsigned char lo = value % 10; return (hi << 4) | lo; } + +/* + * When turning a two's-complement number with a certain number + * of bits into one with more bits, the sign bit must be repeated + * in all the extra bits. + */ +unsigned int +signextend (unsigned int value, unsigned int nbits) +{ + if (nbits <= 0 || nbits > 32) + return 0; + + unsigned int signbit = 1U << (nbits - 1); + unsigned int mask = signbit - 1; + + if ((value & signbit) == signbit) + return value | ~mask; + else + return value & mask; +} diff --git a/src/array.h b/src/array.h index ac4c3b1..a6ef21e 100644 --- a/src/array.h +++ b/src/array.h @@ -123,6 +123,9 @@ bcd2dec (unsigned char value); unsigned char dec2bcd (unsigned char value); +unsigned int +signextend (unsigned int value, unsigned int nbits); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/src/uwatec_smart_parser.c b/src/uwatec_smart_parser.c index 39a927c..bd849a8 100644 --- a/src/uwatec_smart_parser.c +++ b/src/uwatec_smart_parser.c @@ -893,25 +893,6 @@ uwatec_galileo_identify (unsigned char value) } -static unsigned int -uwatec_smart_fixsignbit (unsigned int x, unsigned int n) -{ - if (n <= 0 || n > 32) - return 0; - - unsigned int signbit = (1 << (n - 1)); - unsigned int mask = (signbit - 1); - - // When turning a two's-complement number with a certain number - // of bits into one with more bits, the sign bit must be repeated - // in all the extra bits. - if ((x & signbit) == signbit) - return x | ~mask; - else - return x & mask; -} - - static dc_status_t uwatec_smart_parse (uwatec_smart_parser_t *parser, dc_sample_callback_t callback, void *userdata) { @@ -1018,7 +999,7 @@ uwatec_smart_parse (uwatec_smart_parser_t *parser, dc_sample_callback_t callback } // Fix the sign bit. - signed int svalue = uwatec_smart_fixsignbit (value, nbits); + signed int svalue = signextend (value, nbits); // Parse the value. unsigned int idx = 0;