From: Marcus Comstedt Date: Sun, 31 Aug 2014 08:56:00 +0000 (+0200) Subject: C++: Provide fallbacks for missing stoi/stod functions X-Git-Tag: libsigrok-0.4.0~1065 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=d92de05ad1d8004643ec5cd81227e456be5a261f;p=libsigrok.git C++: Provide fallbacks for missing stoi/stod functions Notably, Android does not provide these functions. The fallback implementation is based on the one in the GNU ISO C++ Library. --- diff --git a/bindings/cxx/ConfigKey_methods.cpp b/bindings/cxx/ConfigKey_methods.cpp index 98b4e45b..ceeea025 100644 --- a/bindings/cxx/ConfigKey_methods.cpp +++ b/bindings/cxx/ConfigKey_methods.cpp @@ -30,6 +30,46 @@ const ConfigKey *ConfigKey::get(string identifier) return get(info->key); } +#include "config.h" + +#ifndef HAVE_STOI_STOD + +/* Fallback implementation of stoi and stod */ + +#include +#include +#include +#include + +static inline int stoi( const std::string& str ) +{ + char *endptr; + errno = 0; + const long ret = std::strtol(str.c_str(), &endptr, 10); + if (endptr == str.c_str()) + throw std::invalid_argument("stoi"); + else if (errno == ERANGE || + ret < std::numeric_limits::min() || + ret > std::numeric_limits::max()) + throw std::out_of_range("stoi"); + else + return ret; +} + +static inline double stod( const std::string& str ) +{ + char *endptr; + errno = 0; + const double ret = std::strtod(str.c_str(), &endptr); + if (endptr == str.c_str()) + throw std::invalid_argument("stod"); + else if (errno == ERANGE) + throw std::out_of_range("stod"); + else + return ret; +} +#endif + Glib::VariantBase ConfigKey::parse_string(string value) const { GVariant *variant; diff --git a/configure.ac b/configure.ac index a60450cd..798128ef 100644 --- a/configure.ac +++ b/configure.ac @@ -386,6 +386,19 @@ PKG_CHECK_MODULES([glibmm], [glibmm-2.4 >= 2.32.0], CXXLIBS="$CXXLIBS $glibmm_LIBS"], [BINDINGS_CXX="no"; cxx_msg="glibmm required"]) +# C++ bindings want stoi and stod +if test "x$BINDINGS_CXX" == "xyes"; then + AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([for stoi and stod]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include ], + [{ return std::stoi("1")+std::stod("1.0"); }])], + [AC_MSG_RESULT([yes]); + AC_DEFINE_UNQUOTED(HAVE_STOI_STOD, [1], + [Specifies whether we have the stoi and stod functions.])], + [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++]) +fi + # PyGObject is needed for the Python bindings. PKG_CHECK_MODULES([pygobject], [pygobject-3.0 >= 3.0.0], [CXXFLAGS="$CXXFLAGS $pygobject_CFLAGS";