From 2b3aa086733b25dcef8007a27ab764a5028d879f Mon Sep 17 00:00:00 2001
From: John <ebusd@ebusd.eu>
Date: Tue, 7 Jan 2025 08:21:26 +0100
Subject: [PATCH] fix previous commit for i386, optimize comparison

---
 src/lib/ebus/datatype.cpp | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/lib/ebus/datatype.cpp b/src/lib/ebus/datatype.cpp
index a617bb39..62940b37 100755
--- a/src/lib/ebus/datatype.cpp
+++ b/src/lib/ebus/datatype.cpp
@@ -1205,23 +1205,24 @@ result_t NumberDataType::parseInput(const string inputStr, unsigned int* parsedV
         return RESULT_ERR_INVALID_NUM;
       }
     } else {
-      unsigned int maxBit = m_bitCount != 32 ? 1 << m_bitCount : 0;
       const char* str = inputStr.c_str();
       char* strEnd = nullptr;
       if (m_divisor == 1) {
         if (hasFlag(SIG)) {
           long signedValue = strtol(str, &strEnd, 0);
-          if (errno == ERANGE || (maxBit && (signedValue < -(maxBit/2L) || signedValue >= maxBit/2L))) {
+          if (errno == ERANGE
+          || (m_bitCount != 32 && (signedValue < 0L ? (signedValue < -(1L << (m_bitCount - 1))) : (signedValue >= (1L << (m_bitCount - 1)))))
+          ) {
             return RESULT_ERR_OUT_OF_RANGE;  // value out of range
           }
           if (signedValue < 0 && m_bitCount != 32) {
-            value = (unsigned int)(signedValue + maxBit);
+            value = (unsigned int)(signedValue + (1L << m_bitCount));
           } else {
             value = (unsigned int)signedValue;
           }
         } else {
           value = (unsigned int)strtoul(str, &strEnd, 0);
-          if (errno == ERANGE || (maxBit && value >= maxBit)) {
+          if (errno == ERANGE || (m_bitCount != 32 && value >= (1U << m_bitCount))) {
             return RESULT_ERR_OUT_OF_RANGE;
           }
         }
@@ -1240,10 +1241,10 @@ result_t NumberDataType::parseInput(const string inputStr, unsigned int* parsedV
         }
         if (hasFlag(SIG)) {
           double max = exp2(m_bitCount - 1);
-          if (dvalue < -max || dvalue >= max) {
+          if (dvalue < 0.0 ? (dvalue < -max) : (dvalue >= max)) {
             return RESULT_ERR_OUT_OF_RANGE;  // value out of range
           }
-          if (dvalue < 0 && m_bitCount != 32) {
+          if (dvalue < 0.0 && m_bitCount != 32) {
             value = static_cast<int>(dvalue + (1 << m_bitCount));
           } else {
             value = static_cast<int>(dvalue);