From e7d6cdc7ff5ed6e06da1cfd6312528c5f2cf749d Mon Sep 17 00:00:00 2001 From: Klemen Vodopivec Date: Tue, 14 Apr 2020 15:58:08 -0400 Subject: [PATCH 1/4] Made it build on EPICS 3.14.12.6, all unit tests pass. --- example/ticker.cpp | 12 ++++-- src/client.cpp | 2 +- src/data.cpp | 2 +- src/evhelper.cpp | 6 +-- src/log.cpp | 8 ++-- src/pvxs/log.h | 1 + src/util.cpp | 103 ++++++++++++++++++++++++++++++++++++++++++++ src/utilpvt.h | 33 ++++++++++++++ test/testconfig.cpp | 6 +-- test/testget.cpp | 8 ++-- test/testinfo.cpp | 8 ++-- test/testmon.cpp | 4 +- test/testput.cpp | 12 +++--- test/testrpc.cpp | 2 +- tools/call.cpp | 2 +- tools/get.cpp | 2 +- tools/info.cpp | 2 +- tools/monitor.cpp | 2 +- tools/put.cpp | 2 +- tools/pvxvct.cpp | 2 +- 20 files changed, 181 insertions(+), 38 deletions(-) diff --git a/example/ticker.cpp b/example/ticker.cpp index c9d91959f..5161091be 100644 --- a/example/ticker.cpp +++ b/example/ticker.cpp @@ -31,9 +31,13 @@ int main(int argc, char* argv[]) } if(argc>=3) { - double rate = 0.0; - - if(epicsParseDouble(argv[2], &rate, nullptr) || rate<=0.0) { + double rate; + try { + rate = std::stod(argv[2]); + if (rate <= 0.0) { + throw std::runtime_error("negative"); + } + } catch (...) { std::cerr<<"Rate must be a positive number, not "<& chan) diff --git a/src/data.cpp b/src/data.cpp index e1de3e454..ad4f0959e 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -728,7 +728,7 @@ void Value::traverse(const std::string &expr, bool modify) maybedot = false; size_t sep = expr.find_first_of(']', pos); - unsigned long long index=0; + epicsUInt64 index=0; if(expr[pos]=='[' && sep!=std::string::npos && sep-pos>=2 diff --git a/src/evhelper.cpp b/src/evhelper.cpp index 40477ddc2..58b7d829f 100644 --- a/src/evhelper.cpp +++ b/src/evhelper.cpp @@ -129,7 +129,7 @@ struct evbase::Pvt : public epicsThreadRunable if(event_add(keepalive.get(), &tick)) throw std::runtime_error("Can't start keepalive timer"); - start_sync.trigger(); + start_sync.signal(); log_info_printf(logerr, "Enter loop worker for %p\n", base.get()); @@ -141,7 +141,7 @@ struct evbase::Pvt : public epicsThreadRunable }catch(std::exception& e){ log_exc_printf(logerr, "Unhandled exception in event_base run : %s\n", e.what()); - start_sync.trigger(); + start_sync.signal(); } } @@ -165,7 +165,7 @@ struct evbase::Pvt : public epicsThreadRunable } } if(work.notify) - work.notify->trigger(); + work.notify->signal(); } } static diff --git a/src/log.cpp b/src/log.cpp index a4790bfbf..4a0b9c398 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -28,9 +28,11 @@ #include #include -#if EPICS_VERSION_INT>=VERSION_INT(3,15,0,0) -# include -# define USE_STACKTRACE +#ifdef VERSION_INT +# if EPICS_VERSION_INT>=VERSION_INT(3,15,0,0) +# include +# define USE_STACKTRACE +# endif #endif #include "evhelper.h" diff --git a/src/pvxs/log.h b/src/pvxs/log.h index 19321db7a..a1c5afc44 100644 --- a/src/pvxs/log.h +++ b/src/pvxs/log.h @@ -8,6 +8,7 @@ #include +#include #include #include diff --git a/src/util.cpp b/src/util.cpp index 4db2503af..763f64f8a 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -24,6 +24,7 @@ #include "udp_collector.h" #include "pvxsVCS.h" +#include "utilpvt.h" namespace pvxs { @@ -408,3 +409,105 @@ void indent(std::ostream& strm, unsigned level) { } }} + +#ifndef HAVE_EPICSPARSE +int epicsParseInt8(const char* s, epicsInt8* val, int base, char**) +{ + try { + *val = (std::stoi(s, 0, base) & 0xff); + return 0; + } catch (...) { + return -1; + } +} + +int epicsParseInt16(const char* s, epicsInt16* val, int base, char**) +{ + try { + *val = (std::stoi(s, 0, base) & 0xffff); + return 0; + } catch (...) { + return -1; + } +} + +int epicsParseInt32(const char* s, epicsInt32* val, int base, char**) +{ + try { + *val = (std::stoi(s, 0, base) & 0xffffffff); + return 0; + } catch (...) { + return -1; + } +} + +int epicsParseInt64(const char* s, epicsInt64* val, int base, char**) +{ + try { + *val = (std::stoi(s, 0, base) & 0xffffffffffffffff); + return 0; + } catch (...) { + return -1; + } +} + +int epicsParseUInt8(const char* s, epicsUInt8* val, int base, char**) +{ + try { + *val = (std::stoul(s, 0, base) & 0xff); + return 0; + } catch (...) { + return -1; + } +} + +int epicsParseUInt16(const char* s, epicsUInt16* val, int base, char**) +{ + try { + *val = (std::stoul(s, 0, base) & 0xffff); + return 0; + } catch (...) { + return -1; + } +} + +int epicsParseUInt32(const char* s, epicsUInt32* val, int base, char**) +{ + try { + *val = (std::stoul(s, 0, base) & 0xffffffff); + return 0; + } catch (...) { + return -1; + } +} + +int epicsParseUInt64(const char* s, epicsUInt64* val, int base, char**) +{ + try { + *val = (std::stoul(s, 0, base) & 0xffffffffffffffff); + return 0; + } catch (...) { + return -1; + } +} + +int epicsParseFloat(const char* s, epicsFloat32* val, char**) +{ + try { + *val = std::stof(s); + return 0; + } catch (...) { + return -1; + } +} + +int epicsParseDouble(const char* s, epicsFloat64* val, char**) +{ + try { + *val = std::stod(s); + return 0; + } catch (...) { + return -1; + } +} +#endif // HAVE_EPICSPARSE diff --git a/src/utilpvt.h b/src/utilpvt.h index da1740a4d..8f285101b 100644 --- a/src/utilpvt.h +++ b/src/utilpvt.h @@ -24,6 +24,8 @@ #include +#include + #include #include @@ -35,6 +37,37 @@ # endif #endif +#ifdef VERSION_INT +# if EPICS_VERSION_INT>=VERSION_INT(3,15,0,0) +# define HAVE_EPICSPARSE +# define HAVE_INT64 +# endif +#endif + +#ifndef HAVE_INT64 + typedef int64_t epicsInt64; + typedef uint64_t epicsUInt64; +#endif // HAVE_INT64 + +#ifndef HAVE_EPICSPARSE + int epicsParseInt8(const char* s, epicsInt8* val, int base, char** units); + int epicsParseInt16(const char* s, epicsInt16* val, int base, char** units); + int epicsParseInt32(const char* s, epicsInt32* val, int base, char** units); + int epicsParseInt64(const char* s, epicsInt64* val, int base, char** units); + int epicsParseUInt8(const char* s, epicsUInt8* val, int base, char** units); + int epicsParseUInt16(const char* s, epicsUInt16* val, int base, char** units); + int epicsParseUInt32(const char* s, epicsUInt32* val, int base, char** units); + int epicsParseUInt64(const char* s, epicsUInt64* val, int base, char** units); + int epicsParseFloat(const char* s, epicsFloat32* val, char** units); + int epicsParseDouble(const char* s, epicsFloat64* val, char** units); +# define epicsParseFloat32(str, to, units) epicsParseFloat(str, to, units) +# define epicsParseFloat64(str, to, units) epicsParseDouble(str, to, units) +# define epicsParseLong(str, to, base, units) epicsParseInt32(str, to, base, units) +# define epicsParseULong(str, to, base, units) epicsParseUInt32(str, to, base, units) +# define epicsParseLLong(str, to, base, units) epicsParseInt64(str, to, base, units) +# define epicsParseULLong(str, to, base, units) epicsParseUInt64(str, to, base, units) +#endif // HAVE_EPICSPARSE + namespace pvxs {namespace impl { //! in-line string builder (eg. for exception messages) diff --git a/test/testconfig.cpp b/test/testconfig.cpp index 0114db87d..2e7ce11be 100644 --- a/test/testconfig.cpp +++ b/test/testconfig.cpp @@ -39,9 +39,9 @@ void testParse() testEq(conf.addressList[1], "5.6.7.8:9876"); } - epicsEnvUnset("EPICS_PVA_ADDR_LIST"); - epicsEnvUnset("EPICS_PVA_AUTO_ADDR_LIST"); - epicsEnvUnset("EPICS_PVA_BROADCAST_PORT"); + //epicsEnvUnset("EPICS_PVA_ADDR_LIST"); + //epicsEnvUnset("EPICS_PVA_AUTO_ADDR_LIST"); + //epicsEnvUnset("EPICS_PVA_BROADCAST_PORT"); } } diff --git a/test/testget.cpp b/test/testget.cpp index c22b67750..4f1b0dc14 100644 --- a/test/testget.cpp +++ b/test/testget.cpp @@ -73,7 +73,7 @@ struct Tester { auto op = cli.get("mailbox") .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); @@ -140,7 +140,7 @@ struct Tester { auto op = cli.info("mailbox") .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); @@ -162,7 +162,7 @@ struct Tester { cli.info("mailbox") .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); @@ -221,7 +221,7 @@ void testError(bool phase) auto op = cli.get("mailbox") .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); diff --git a/test/testinfo.cpp b/test/testinfo.cpp index d60c249a9..fef0e4b27 100644 --- a/test/testinfo.cpp +++ b/test/testinfo.cpp @@ -49,7 +49,7 @@ struct Tester { auto op = cli.info("mailbox") .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); @@ -116,7 +116,7 @@ struct Tester { auto op = cli.info("mailbox") .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); @@ -138,7 +138,7 @@ struct Tester { cli.info("mailbox") .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); @@ -183,7 +183,7 @@ void testError() auto op = cli.info("mailbox") .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); diff --git a/test/testmon.cpp b/test/testmon.cpp index 855bbb809..5fa15ad1a 100644 --- a/test/testmon.cpp +++ b/test/testmon.cpp @@ -59,7 +59,7 @@ struct BasicTest { .maskDisconnected(false) .event([this](client::Subscription& sub) { testDiag("Event evt"); - evt.trigger(); + evt.signal(); }) .exec(); } @@ -165,7 +165,7 @@ struct TestLifeCycle : public BasicTest .maskDisconnected(false) .event([&evt2](client::Subscription& sub) { testDiag("Event evt2"); - evt2.trigger(); + evt2.signal(); }) .exec(); diff --git a/test/testput.cpp b/test/testput.cpp index eaefb3258..81dc568e6 100644 --- a/test/testput.cpp +++ b/test/testput.cpp @@ -65,7 +65,7 @@ struct Tester : public TesterBase }) .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); @@ -141,7 +141,7 @@ struct Tester : public TesterBase auto op = cli.info("mailbox") .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); @@ -163,7 +163,7 @@ struct Tester : public TesterBase cli.info("mailbox") .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); @@ -192,7 +192,7 @@ struct TestPutBuilder : public TesterBase .set("nonexistant", "nope", false) .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); @@ -242,7 +242,7 @@ void testRO() }) .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); @@ -294,7 +294,7 @@ void testError() auto op = cli.get("mailbox") .result([&actual, &done](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); diff --git a/test/testrpc.cpp b/test/testrpc.cpp index 13b513f87..89a30ff53 100644 --- a/test/testrpc.cpp +++ b/test/testrpc.cpp @@ -59,7 +59,7 @@ struct Tester { auto op = cli.rpc("mailbox", std::move(arg)) .result([this](client::Result&& result) { actual = std::move(result); - done.trigger(); + done.signal(); }) .exec(); diff --git a/tools/call.cpp b/tools/call.cpp index 0fe905fac..019235c3c 100644 --- a/tools/call.cpp +++ b/tools/call.cpp @@ -141,7 +141,7 @@ int main(int argc, char *argv[]) std::cerr<<"Error "< Date: Wed, 15 Apr 2020 15:06:01 -0400 Subject: [PATCH 2/4] Add BASE 3.14 to travis CI --- .travis.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.travis.yml b/.travis.yml index 42f6f7086..d89d4a313 100644 --- a/.travis.yml +++ b/.travis.yml @@ -77,6 +77,15 @@ jobs: - gdb - cmake + - env: BASE=3.14 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gdb + - cmake + - env: BASE=7.0 compiler: clang addons: From c27787c649c91df365c35e1f6d19fab84cc0de83 Mon Sep 17 00:00:00 2001 From: Klemen Vodopivec Date: Thu, 16 Apr 2020 09:18:22 -0400 Subject: [PATCH 3/4] Add function export specifiers PVXS_API to epicsParse* functions. --- src/util.cpp | 150 ++++++++++++++++++++++++++++++-------------------- src/utilpvt.h | 38 ++++++------- 2 files changed, 109 insertions(+), 79 deletions(-) diff --git a/src/util.cpp b/src/util.cpp index 763f64f8a..9043862f2 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -411,103 +411,133 @@ void indent(std::ostream& strm, unsigned level) { }} #ifndef HAVE_EPICSPARSE -int epicsParseInt8(const char* s, epicsInt8* val, int base, char**) +PVXS_API int epicsParseInt8(const char* s, epicsInt8* val, int base, char**) { try { - *val = (std::stoi(s, 0, base) & 0xff); - return 0; - } catch (...) { - return -1; - } + size_t idx; + epicsInt8 v = (std::stoi(s, &idx, base) & 0xff); + if (idx == std::string(s).length()) { + *val = v; + return 0; + } + } catch (...) {} + return -1; } -int epicsParseInt16(const char* s, epicsInt16* val, int base, char**) +PVXS_API int epicsParseInt16(const char* s, epicsInt16* val, int base, char**) { try { - *val = (std::stoi(s, 0, base) & 0xffff); - return 0; - } catch (...) { - return -1; - } + size_t idx; + epicsInt16 v = (std::stoi(s, &idx, base) & 0xffff); + if (idx == std::string(s).length()) { + *val = v; + return 0; + } + } catch (...) {} + return -1; } -int epicsParseInt32(const char* s, epicsInt32* val, int base, char**) +PVXS_API int epicsParseInt32(const char* s, epicsInt32* val, int base, char**) { try { - *val = (std::stoi(s, 0, base) & 0xffffffff); - return 0; - } catch (...) { - return -1; - } + size_t idx; + epicsInt32 v = (std::stoi(s, &idx, base) & 0xffffffff); + if (idx == std::string(s).length()) { + *val = v; + return 0; + } + } catch (...) {} + return -1; } -int epicsParseInt64(const char* s, epicsInt64* val, int base, char**) +PVXS_API int epicsParseInt64(const char* s, epicsInt64* val, int base, char**) { try { - *val = (std::stoi(s, 0, base) & 0xffffffffffffffff); - return 0; - } catch (...) { - return -1; - } + size_t idx; + epicsInt64 v = (std::stoi(s, &idx, base) & 0xffffffffffffffff); + if (idx == std::string(s).length()) { + *val = v; + return 0; + } + } catch (...) {} + return -1; } -int epicsParseUInt8(const char* s, epicsUInt8* val, int base, char**) +PVXS_API int epicsParseUInt8(const char* s, epicsUInt8* val, int base, char**) { try { - *val = (std::stoul(s, 0, base) & 0xff); - return 0; - } catch (...) { - return -1; - } + size_t idx; + epicsUInt8 v = (std::stoul(s, &idx, base) & 0xff); + if (idx == std::string(s).length()) { + *val = v; + return 0; + } + } catch (...) {} + return -1; } -int epicsParseUInt16(const char* s, epicsUInt16* val, int base, char**) +PVXS_API int epicsParseUInt16(const char* s, epicsUInt16* val, int base, char**) { try { - *val = (std::stoul(s, 0, base) & 0xffff); - return 0; - } catch (...) { - return -1; - } + size_t idx; + epicsUInt16 v = (std::stoul(s, &idx, base) & 0xffff); + if (idx == std::string(s).length()) { + *val = v; + return 0; + } + } catch (...) {} + return -1; } -int epicsParseUInt32(const char* s, epicsUInt32* val, int base, char**) +PVXS_API int epicsParseUInt32(const char* s, epicsUInt32* val, int base, char**) { try { - *val = (std::stoul(s, 0, base) & 0xffffffff); - return 0; - } catch (...) { - return -1; - } + size_t idx; + epicsUInt32 v = (std::stoul(s, &idx, base) & 0xffffffff); + if (idx == std::string(s).length()) { + *val = v; + return 0; + } + } catch (...) {} + return -1; } -int epicsParseUInt64(const char* s, epicsUInt64* val, int base, char**) +PVXS_API int epicsParseUInt64(const char* s, epicsUInt64* val, int base, char**) { try { - *val = (std::stoul(s, 0, base) & 0xffffffffffffffff); - return 0; - } catch (...) { - return -1; - } + size_t idx; + epicsUInt64 v = (std::stoul(s, &idx, base) & 0xffffffffffffffff); + if (idx == std::string(s).length()) { + *val = v; + return 0; + } + } catch (...) {} + return -1; } -int epicsParseFloat(const char* s, epicsFloat32* val, char**) +PVXS_API int epicsParseFloat(const char* s, epicsFloat32* val, char**) { try { - *val = std::stof(s); - return 0; - } catch (...) { - return -1; - } + size_t idx; + epicsFloat32 v = std::stof(s, &idx); + if (idx == std::string(s).length()) { + *val = v; + return 0; + } + } catch (...) {} + return -1; } -int epicsParseDouble(const char* s, epicsFloat64* val, char**) +PVXS_API int epicsParseDouble(const char* s, epicsFloat64* val, char**) { try { - *val = std::stod(s); - return 0; - } catch (...) { - return -1; - } + size_t idx; + epicsFloat64 v = std::stod(s, &idx); + if (idx == std::string(s).length()) { + *val = v; + return 0; + } + } catch (...) {} + return -1; } #endif // HAVE_EPICSPARSE diff --git a/src/utilpvt.h b/src/utilpvt.h index 8f285101b..477cedd30 100644 --- a/src/utilpvt.h +++ b/src/utilpvt.h @@ -40,32 +40,32 @@ #ifdef VERSION_INT # if EPICS_VERSION_INT>=VERSION_INT(3,15,0,0) # define HAVE_EPICSPARSE -# define HAVE_INT64 +# define HAVE_EPICSINT64 # endif #endif -#ifndef HAVE_INT64 +#ifndef HAVE_EPICSINT64 typedef int64_t epicsInt64; typedef uint64_t epicsUInt64; -#endif // HAVE_INT64 +#endif // HAVE_EPICSINT64 #ifndef HAVE_EPICSPARSE - int epicsParseInt8(const char* s, epicsInt8* val, int base, char** units); - int epicsParseInt16(const char* s, epicsInt16* val, int base, char** units); - int epicsParseInt32(const char* s, epicsInt32* val, int base, char** units); - int epicsParseInt64(const char* s, epicsInt64* val, int base, char** units); - int epicsParseUInt8(const char* s, epicsUInt8* val, int base, char** units); - int epicsParseUInt16(const char* s, epicsUInt16* val, int base, char** units); - int epicsParseUInt32(const char* s, epicsUInt32* val, int base, char** units); - int epicsParseUInt64(const char* s, epicsUInt64* val, int base, char** units); - int epicsParseFloat(const char* s, epicsFloat32* val, char** units); - int epicsParseDouble(const char* s, epicsFloat64* val, char** units); -# define epicsParseFloat32(str, to, units) epicsParseFloat(str, to, units) -# define epicsParseFloat64(str, to, units) epicsParseDouble(str, to, units) -# define epicsParseLong(str, to, base, units) epicsParseInt32(str, to, base, units) -# define epicsParseULong(str, to, base, units) epicsParseUInt32(str, to, base, units) -# define epicsParseLLong(str, to, base, units) epicsParseInt64(str, to, base, units) -# define epicsParseULLong(str, to, base, units) epicsParseUInt64(str, to, base, units) + PVXS_API int epicsParseInt8(const char* s, epicsInt8* val, int base, char** units); + PVXS_API int epicsParseInt16(const char* s, epicsInt16* val, int base, char** units); + PVXS_API int epicsParseInt32(const char* s, epicsInt32* val, int base, char** units); + PVXS_API int epicsParseInt64(const char* s, epicsInt64* val, int base, char** units); + PVXS_API int epicsParseUInt8(const char* s, epicsUInt8* val, int base, char** units); + PVXS_API int epicsParseUInt16(const char* s, epicsUInt16* val, int base, char** units); + PVXS_API int epicsParseUInt32(const char* s, epicsUInt32* val, int base, char** units); + PVXS_API int epicsParseUInt64(const char* s, epicsUInt64* val, int base, char** units); + PVXS_API int epicsParseFloat(const char* s, epicsFloat32* val, char** units); + PVXS_API int epicsParseDouble(const char* s, epicsFloat64* val, char** units); +# define epicsParseFloat32(str, to, units) epicsParseFloat(str, to, units) +# define epicsParseFloat64(str, to, units) epicsParseDouble(str, to, units) +# define epicsParseLong(str, to, base, units) epicsParseInt32(str, to, base, units) +# define epicsParseULong(str, to, base, units) epicsParseUInt32(str, to, base, units) +# define epicsParseLLong(str, to, base, units) epicsParseInt64(str, to, base, units) +# define epicsParseULLong(str, to, base, units) epicsParseUInt64(str, to, base, units) #endif // HAVE_EPICSPARSE namespace pvxs {namespace impl { From e81b09846106bc0a9d25742b513eeaf0d6c94754 Mon Sep 17 00:00:00 2001 From: Klemen Vodopivec Date: Fri, 17 Apr 2020 09:15:34 -0400 Subject: [PATCH 4/4] More efficiently check for std::sto* errors. --- src/util.cpp | 20 ++++++++++---------- src/utilpvt.h | 8 +++----- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/util.cpp b/src/util.cpp index 9043862f2..dd83995e6 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -416,7 +416,7 @@ PVXS_API int epicsParseInt8(const char* s, epicsInt8* val, int base, char**) try { size_t idx; epicsInt8 v = (std::stoi(s, &idx, base) & 0xff); - if (idx == std::string(s).length()) { + if (s[idx]=='\0') { *val = v; return 0; } @@ -429,7 +429,7 @@ PVXS_API int epicsParseInt16(const char* s, epicsInt16* val, int base, char**) try { size_t idx; epicsInt16 v = (std::stoi(s, &idx, base) & 0xffff); - if (idx == std::string(s).length()) { + if (s[idx]=='\0') { *val = v; return 0; } @@ -442,7 +442,7 @@ PVXS_API int epicsParseInt32(const char* s, epicsInt32* val, int base, char**) try { size_t idx; epicsInt32 v = (std::stoi(s, &idx, base) & 0xffffffff); - if (idx == std::string(s).length()) { + if (s[idx]=='\0') { *val = v; return 0; } @@ -455,7 +455,7 @@ PVXS_API int epicsParseInt64(const char* s, epicsInt64* val, int base, char**) try { size_t idx; epicsInt64 v = (std::stoi(s, &idx, base) & 0xffffffffffffffff); - if (idx == std::string(s).length()) { + if (s[idx]=='\0') { *val = v; return 0; } @@ -468,7 +468,7 @@ PVXS_API int epicsParseUInt8(const char* s, epicsUInt8* val, int base, char**) try { size_t idx; epicsUInt8 v = (std::stoul(s, &idx, base) & 0xff); - if (idx == std::string(s).length()) { + if (s[idx]=='\0') { *val = v; return 0; } @@ -481,7 +481,7 @@ PVXS_API int epicsParseUInt16(const char* s, epicsUInt16* val, int base, char**) try { size_t idx; epicsUInt16 v = (std::stoul(s, &idx, base) & 0xffff); - if (idx == std::string(s).length()) { + if (s[idx]=='\0') { *val = v; return 0; } @@ -494,7 +494,7 @@ PVXS_API int epicsParseUInt32(const char* s, epicsUInt32* val, int base, char**) try { size_t idx; epicsUInt32 v = (std::stoul(s, &idx, base) & 0xffffffff); - if (idx == std::string(s).length()) { + if (s[idx]=='\0') { *val = v; return 0; } @@ -507,7 +507,7 @@ PVXS_API int epicsParseUInt64(const char* s, epicsUInt64* val, int base, char**) try { size_t idx; epicsUInt64 v = (std::stoul(s, &idx, base) & 0xffffffffffffffff); - if (idx == std::string(s).length()) { + if (s[idx]=='\0') { *val = v; return 0; } @@ -520,7 +520,7 @@ PVXS_API int epicsParseFloat(const char* s, epicsFloat32* val, char**) try { size_t idx; epicsFloat32 v = std::stof(s, &idx); - if (idx == std::string(s).length()) { + if (s[idx]=='\0') { *val = v; return 0; } @@ -533,7 +533,7 @@ PVXS_API int epicsParseDouble(const char* s, epicsFloat64* val, char**) try { size_t idx; epicsFloat64 v = std::stod(s, &idx); - if (idx == std::string(s).length()) { + if (s[idx]=='\0') { *val = v; return 0; } diff --git a/src/utilpvt.h b/src/utilpvt.h index 477cedd30..4d756cd8e 100644 --- a/src/utilpvt.h +++ b/src/utilpvt.h @@ -37,11 +37,9 @@ # endif #endif -#ifdef VERSION_INT -# if EPICS_VERSION_INT>=VERSION_INT(3,15,0,0) -# define HAVE_EPICSPARSE -# define HAVE_EPICSINT64 -# endif +#if EPICS_VERSION_INT>=VERSION_INT(3,15,0,0) +# define HAVE_EPICSPARSE +# define HAVE_EPICSINT64 #endif #ifndef HAVE_EPICSINT64