diff --git a/Foundation/include/Poco/FPEnvironment.h b/Foundation/include/Poco/FPEnvironment.h index 7b9cb3fb5..fb35d1d00 100644 --- a/Foundation/include/Poco/FPEnvironment.h +++ b/Foundation/include/Poco/FPEnvironment.h @@ -29,6 +29,8 @@ #include "Poco/FPEnvironment_DEC.h" #elif defined(sun) || defined(__sun) #include "Poco/FPEnvironment_SUN.h" +#elif defined(__QNX__) +#include "Poco/FPEnvironment_QNX.h" #elif defined(POCO_OS_FAMILY_UNIX) #include "Poco/FPEnvironment_C99.h" #elif defined(POCO_OS_FAMILY_WINDOWS) diff --git a/Foundation/include/Poco/FPEnvironment_QNX.h b/Foundation/include/Poco/FPEnvironment_QNX.h new file mode 100644 index 000000000..4f4c953bc --- /dev/null +++ b/Foundation/include/Poco/FPEnvironment_QNX.h @@ -0,0 +1,135 @@ +// +// FPEnvironment_QNX.h +// +// $Id: //poco/1.4/Foundation/include/Poco/FPEnvironment_QNX.h#1 $ +// +// Library: Foundation +// Package: Core +// Module: FPEnvironment +// +// Definitions of class FPEnvironmentImpl for QNX. +// +// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#ifndef Foundation_FPEnvironment_QNX_INCLUDED +#define Foundation_FPEnvironment_QNX_INCLUDED + + +#include "Poco/Foundation.h" +#include +#include + + +namespace Poco { + + +class FPEnvironmentImpl +{ +protected: + enum RoundingModeImpl + { + FP_ROUND_DOWNWARD_IMPL = FE_DOWNWARD, + FP_ROUND_UPWARD_IMPL = FE_UPWARD, + FP_ROUND_TONEAREST_IMPL = FE_TONEAREST, + FP_ROUND_TOWARDZERO_IMPL = FE_TOWARDZERO + }; + enum FlagImpl + { + FP_DIVIDE_BY_ZERO_IMPL = FE_DIVBYZERO, + FP_INEXACT_IMPL = FE_INEXACT, + FP_OVERFLOW_IMPL = FE_OVERFLOW, + FP_UNDERFLOW_IMPL = FE_UNDERFLOW, + FP_INVALID_IMPL = FE_INVALID + }; + FPEnvironmentImpl(); + FPEnvironmentImpl(const FPEnvironmentImpl& env); + ~FPEnvironmentImpl(); + FPEnvironmentImpl& operator = (const FPEnvironmentImpl& env); + void keepCurrentImpl(); + static void clearFlagsImpl(); + static bool isFlagImpl(FlagImpl flag); + static void setRoundingModeImpl(RoundingModeImpl mode); + static RoundingModeImpl getRoundingModeImpl(); + static bool isInfiniteImpl(float value); + static bool isInfiniteImpl(double value); + static bool isInfiniteImpl(long double value); + static bool isNaNImpl(float value); + static bool isNaNImpl(double value); + static bool isNaNImpl(long double value); + static float copySignImpl(float target, float source); + static double copySignImpl(double target, double source); + static long double copySignImpl(long double target, long double source); + +private: + fenv_t _env; +}; + + +// +// inlines +// +inline bool FPEnvironmentImpl::isInfiniteImpl(float value) +{ + using namespace std; + return isinf(value) != 0; +} + + +inline bool FPEnvironmentImpl::isInfiniteImpl(double value) +{ + using namespace std; + return isinf(value) != 0; +} + + +inline bool FPEnvironmentImpl::isInfiniteImpl(long double value) +{ + using namespace std; + return isinf((double) value) != 0; +} + + +inline bool FPEnvironmentImpl::isNaNImpl(float value) +{ + using namespace std; + return isnan(value) != 0; +} + + +inline bool FPEnvironmentImpl::isNaNImpl(double value) +{ + using namespace std; + return isnan(value) != 0; +} + + +inline bool FPEnvironmentImpl::isNaNImpl(long double value) +{ + using namespace std; + return isnan((double) value) != 0; +} + + +inline float FPEnvironmentImpl::copySignImpl(float target, float source) +{ + using namespace std; + return copysignf(target, source); +} + + +inline double FPEnvironmentImpl::copySignImpl(double target, double source) +{ + using namespace std; + return copysign(target, source); +} + + +} // namespace Poco + + +#endif // Foundation_FPEnvironment_QNX_INCLUDED diff --git a/Foundation/include/Poco/NumericString.h b/Foundation/include/Poco/NumericString.h index bd3dd900c..0ad3d2e64 100644 --- a/Foundation/include/Poco/NumericString.h +++ b/Foundation/include/Poco/NumericString.h @@ -31,6 +31,7 @@ #endif #include #include +#include #if !defined(POCO_NO_LOCALE) #include #endif @@ -86,7 +87,7 @@ bool strToInt(const char* pStr, I& result, short base, char thSep = ',') /// the return value is false with the result value undetermined. { if (!pStr) return false; - while (isspace(*pStr)) ++pStr; + while (std::isspace(*pStr)) ++pStr; if (*pStr == '\0') return false; short sign = 1; if ((base == 10) && (*pStr == '-')) diff --git a/Foundation/include/Poco/UTFString.h b/Foundation/include/Poco/UTFString.h index d71675508..7bd937b20 100644 --- a/Foundation/include/Poco/UTFString.h +++ b/Foundation/include/Poco/UTFString.h @@ -30,12 +30,12 @@ namespace Poco { struct UTF16CharTraits { - typedef std::fpos u16streampos; - typedef UInt16 char_type; - typedef int int_type; - typedef std::streamoff off_type; - typedef u16streampos pos_type; - typedef mbstate_t state_type; + typedef std::fpos u16streampos; + typedef UInt16 char_type; + typedef int int_type; + typedef std::streamoff off_type; + typedef u16streampos pos_type; + typedef std::mbstate_t state_type; static void assign(char_type& c1, const char_type& c2) { @@ -147,12 +147,12 @@ struct UTF16CharTraits struct UTF32CharTraits { - typedef std::fpos u32streampos; - typedef UInt32 char_type; - typedef int int_type; - typedef std::streamoff off_type; - typedef u32streampos pos_type; - typedef mbstate_t state_type; + typedef std::fpos u32streampos; + typedef UInt32 char_type; + typedef int int_type; + typedef std::streamoff off_type; + typedef u32streampos pos_type; + typedef std::mbstate_t state_type; static void assign(char_type& c1, const char_type& c2) { diff --git a/Foundation/src/FPEnvironment.cpp b/Foundation/src/FPEnvironment.cpp index 31477c18e..9f1913e31 100644 --- a/Foundation/src/FPEnvironment.cpp +++ b/Foundation/src/FPEnvironment.cpp @@ -24,6 +24,8 @@ #include "FPEnvironment_DEC.cpp" #elif defined(sun) || defined(__sun) #include "FPEnvironment_SUN.cpp" +#elif defined(__QNX__) +#include "FPEnvironment_QNX.cpp" #elif defined(POCO_OS_FAMILY_UNIX) #include "FPEnvironment_C99.cpp" #elif defined(POCO_OS_FAMILY_WINDOWS) diff --git a/Foundation/src/FPEnvironment_QNX.cpp b/Foundation/src/FPEnvironment_QNX.cpp new file mode 100644 index 000000000..4065a190c --- /dev/null +++ b/Foundation/src/FPEnvironment_QNX.cpp @@ -0,0 +1,84 @@ +// +// FPEnvironment_QNX.cpp +// +// $Id: //poco/1.4/Foundation/src/FPEnvironment_QNX.cpp#1 $ +// +// Library: Foundation +// Package: Core +// Module: FPEnvironment +// +// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/FPEnvironment_QNX.h" + + +namespace Poco { + + +FPEnvironmentImpl::FPEnvironmentImpl() +{ + fegetenv(&_env); +} + + +FPEnvironmentImpl::FPEnvironmentImpl(const FPEnvironmentImpl& env) +{ + _env = env._env; +} + + +FPEnvironmentImpl::~FPEnvironmentImpl() +{ + fesetenv(&_env); +} + + +FPEnvironmentImpl& FPEnvironmentImpl::operator = (const FPEnvironmentImpl& env) +{ + _env = env._env; + return *this; +} + + +void FPEnvironmentImpl::keepCurrentImpl() +{ + fegetenv(&_env); +} + + +void FPEnvironmentImpl::clearFlagsImpl() +{ + feclearexcept(FE_ALL_EXCEPT); +} + + +bool FPEnvironmentImpl::isFlagImpl(FlagImpl flag) +{ + return fetestexcept(flag) != 0; +} + + +void FPEnvironmentImpl::setRoundingModeImpl(RoundingModeImpl mode) +{ + fesetround(mode); +} + + +FPEnvironmentImpl::RoundingModeImpl FPEnvironmentImpl::getRoundingModeImpl() +{ + return (RoundingModeImpl) fegetround(); +} + + +long double FPEnvironmentImpl::copySignImpl(long double target, long double source) +{ + return (source >= 0 && target >= 0) || (source < 0 && target < 0) ? target : -target; +} + + +} // namespace Poco