From 61c603f1748780f701c74f219a243de6fd8d9939 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Fri, 15 Sep 2017 14:35:51 +0200 Subject: [PATCH 01/20] STYLE: typo in doxygen string --- src/OpenFOAM/primitives/predicates/predicates.H | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenFOAM/primitives/predicates/predicates.H b/src/OpenFOAM/primitives/predicates/predicates.H index e751c7e957..0d7d8539fa 100644 --- a/src/OpenFOAM/primitives/predicates/predicates.H +++ b/src/OpenFOAM/primitives/predicates/predicates.H @@ -72,7 +72,7 @@ public: return true; } - //- Binary predicate returning false + //- Binary predicate returning true template inline bool operator()(const T1&, const T2&) const { From accebc74ee818e40f39e6f9077542052c3ff2ebe Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Mon, 18 Sep 2017 10:47:07 +0200 Subject: [PATCH 02/20] ENH: improve consistency in parsing primitives from strings (issue #590) - Any trailing whitespace when parsing from strings or character buffers is ignored rather than being treated as an error. This is consistent with behaviour when reading from an Istream and with leading whitespace being ignored in the underlying atof/atod, strtof/strtod... functions. - Allow parsing directly from a std::string instead of just from a 'char*'. This reflects the C++11 addition of std::stod to complement the C functions strtod. This also makes it easier to parse string directly without using an IStringStream. - Two-parameter parsing methods return success/failure. Eg, if (readInt32(str, &int32Val)) ... - One-parameter parsing methods return the value on success or emit a FatalIOError. Eg, const char* buf; int32Val = readInt32(buf, &); - Improved consistency when parsing unsigned ints. Use strtoimax and strtoumax throughout. - Rename readDoubleScalar -> readDouble, readFloatScalar -> readFloat. Using the primitive name directly instead of the Foam typedef for better consistency with readInt32 etc. - Clean/improve parseNasScalar. Handle normal numbers directly, reduce some operations. --- applications/test/primitives/Make/files | 3 + applications/test/primitives/Make/options | 5 + .../test/primitives/Test-primitives.C | 198 ++++++++++++++++++ src/OSspecific/POSIX/printStack.C | 2 +- src/OpenFOAM/Make/files | 1 + src/OpenFOAM/primitives/Scalar/Scalar.C | 69 ++++-- src/OpenFOAM/primitives/Scalar/Scalar.H | 56 +++-- .../Scalar/doubleScalar/doubleScalar.C | 14 +- .../Scalar/doubleScalar/doubleScalar.H | 63 ++---- .../Scalar/floatScalar/floatScalar.C | 16 +- .../Scalar/floatScalar/floatScalar.H | 65 +++--- .../primitives/Scalar/scalar/scalar.C | 19 +- .../primitives/Scalar/scalar/scalar.H | 14 +- src/OpenFOAM/primitives/ints/int/int.H | 27 ++- src/OpenFOAM/primitives/ints/int/intIO.C | 60 +++++- src/OpenFOAM/primitives/ints/int32/int32.C | 21 +- src/OpenFOAM/primitives/ints/int32/int32.H | 70 +++++-- src/OpenFOAM/primitives/ints/int32/int32IO.C | 106 ++++++---- src/OpenFOAM/primitives/ints/int64/int64.C | 21 +- src/OpenFOAM/primitives/ints/int64/int64.H | 62 ++++-- src/OpenFOAM/primitives/ints/int64/int64IO.C | 96 ++++++--- src/OpenFOAM/primitives/ints/label/label.H | 34 +++ src/OpenFOAM/primitives/ints/uLabel/uLabel.H | 39 +++- src/OpenFOAM/primitives/ints/uint/uint.H | 5 +- src/OpenFOAM/primitives/ints/uint32/uint32.C | 21 +- src/OpenFOAM/primitives/ints/uint32/uint32.H | 58 ++++- .../primitives/ints/uint32/uint32IO.C | 91 +++++--- src/OpenFOAM/primitives/ints/uint64/uint64.C | 21 +- src/OpenFOAM/primitives/ints/uint64/uint64.H | 59 +++++- .../primitives/ints/uint64/uint64IO.C | 91 +++++--- .../primitives/strings/parsing/parsing.C | 38 ++++ .../primitives/strings/parsing/parsing.H | 85 ++++++++ .../primitives/strings/parsing/parsingI.H | 55 +++++ src/fileFormats/nas/NASCore.C | 84 +++++--- src/fileFormats/nas/NASCore.H | 11 +- 35 files changed, 1310 insertions(+), 370 deletions(-) create mode 100644 applications/test/primitives/Make/files create mode 100644 applications/test/primitives/Make/options create mode 100644 applications/test/primitives/Test-primitives.C create mode 100644 src/OpenFOAM/primitives/strings/parsing/parsing.C create mode 100644 src/OpenFOAM/primitives/strings/parsing/parsing.H create mode 100644 src/OpenFOAM/primitives/strings/parsing/parsingI.H diff --git a/applications/test/primitives/Make/files b/applications/test/primitives/Make/files new file mode 100644 index 0000000000..44e878cb04 --- /dev/null +++ b/applications/test/primitives/Make/files @@ -0,0 +1,3 @@ +Test-primitives.C + +EXE = $(FOAM_USER_APPBIN)/Test-primitives diff --git a/applications/test/primitives/Make/options b/applications/test/primitives/Make/options new file mode 100644 index 0000000000..7ce182425d --- /dev/null +++ b/applications/test/primitives/Make/options @@ -0,0 +1,5 @@ +EXE_INC = \ + -I$(LIB_SRC)/fileFormats/lnInclude + +EXE_LIBS = \ + -lfileFormats diff --git a/applications/test/primitives/Test-primitives.C b/applications/test/primitives/Test-primitives.C new file mode 100644 index 0000000000..72017bfee9 --- /dev/null +++ b/applications/test/primitives/Test-primitives.C @@ -0,0 +1,198 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Application + Test-primitives + +Description + Parsing etc for primitives. + +\*---------------------------------------------------------------------------*/ + +#include "scalar.H" +#include "label.H" +#include "StringStream.H" +#include "NASCore.H" +#include "parsing.H" +#include "Tuple2.H" + +using namespace Foam; + +// Shadow fileFormats::NASCore::readNasScalar +inline scalar readNasScalar(const std::string& str) +{ + return fileFormats::NASCore::readNasScalar(str); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +template +unsigned testParsing +( + TYPE (*function)(const std::string&), + const List>& tests +) +{ + unsigned nFail = 0; + + // Expect some failures + const bool prev = FatalIOError.throwExceptions(); + + for (const Tuple2& test : tests) + { + const std::string& str = test.first(); + const bool expected = test.second(); + + bool parsed = true; + + TYPE val; + try + { + val = function (str); + } + catch (Foam::error& err) + { + parsed = false; + } + + if (parsed) + { + if (expected) + { + Info<< "(pass) parsed " << str << " = " << val << nl; + } + else + { + ++nFail; + Info<< "(fail) unexpected success for " << str << nl; + } + } + else + { + if (expected) + { + ++nFail; + Info<< "(fail) unexpected failure " << str << nl; + } + else + { + Info<< "(pass) expected failure " << str << nl; + } + } + } + + FatalIOError.throwExceptions(prev); + + return nFail; +} + + +int main(int argc, char *argv[]) +{ + unsigned nFail = 0; + + { + Info<< nl << "Test readDouble:" << nl; + nFail += testParsing + ( + &readDouble, + { + { "", false }, + { " ", false }, + { " xxx ", false }, + { " 1234E-", false }, + { " 1234E junk", false }, + { " 3.14159 ", true }, + { " 31.4159E-1 " , true }, + } + ); + } + + { + Info<< nl << "Test readFloat:" << nl; + nFail += testParsing + ( + &readFloat, + { + { " 3.14159 ", true }, + { " 31.4159E-1 " , true }, + { " 31.4159E200 " , false }, + { " 31.4159E20 " , true }, + } + ); + } + + { + Info<< nl << "Test readNasScalar:" << nl; + nFail += testParsing + ( + &readNasScalar, + { + { " 3.14159 ", true }, + { " 31.4159E-1 " , true }, + { " 314.159-2 " , true }, + { " 31.4159E200 " , true }, + { " 31.4159E20 " , true }, + } + ); + } + + { + Info<< nl << "Test readInt32 (max= " << INT32_MAX << "):" << nl; + nFail += testParsing + ( + &readInt32, + { + { " 3.14159 ", false }, + { " 31.4159E-1 " , false }, + { "100" , true }, + { " 2147483644" , true }, + { " 2147483700 " , false }, + } + ); + } + + { + Info<< nl << "Test readUint32 (max= " << INT32_MAX << "):" << nl; + nFail += testParsing + ( + &readUint32, + { + { " 2147483644" , true }, + { " 2147483700 " , true }, + } + ); + } + + if (nFail) + { + Info<< nl << "failed " << nFail << " tests" << nl; + return 1; + } + + Info<< nl << "passed all tests" << nl; + return 0; +} + +// ************************************************************************* // diff --git a/src/OSspecific/POSIX/printStack.C b/src/OSspecific/POSIX/printStack.C index 4031b91d77..51978a66a7 100644 --- a/src/OSspecific/POSIX/printStack.C +++ b/src/OSspecific/POSIX/printStack.C @@ -28,7 +28,7 @@ License #include "IFstream.H" #include "StringStream.H" -#include +#include #include #include #include diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files index ac475a06fe..cc59794bae 100644 --- a/src/OpenFOAM/Make/files +++ b/src/OpenFOAM/Make/files @@ -114,6 +114,7 @@ $(strings)/wordRe/wordRe.C $(strings)/wordRes/wordRes.C $(strings)/lists/hashedWordList.C $(strings)/stringOps/stringOps.C +$(strings)/parsing/parsing.C ops = primitives/ops $(ops)/flipOp.C diff --git a/src/OpenFOAM/primitives/Scalar/Scalar.C b/src/OpenFOAM/primitives/Scalar/Scalar.C index 941349cce6..d8eb7e06fc 100644 --- a/src/OpenFOAM/primitives/Scalar/Scalar.C +++ b/src/OpenFOAM/primitives/Scalar/Scalar.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -42,9 +42,9 @@ const Scalar pTraits::rootMax = ScalarROOTVGREAT; const char* const pTraits::componentNames[] = { "" }; -pTraits::pTraits(const Scalar& p) +pTraits::pTraits(const Scalar& val) : - p_(p) + p_(val) {} @@ -54,7 +54,7 @@ pTraits::pTraits(Istream& is) } -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// * * * * * * * * * * * * * * * IO/Conversion * * * * * * * * * * * * * * * // word name(const Scalar val) { @@ -76,18 +76,59 @@ word name(const std::string& fmt, const Scalar val) } -// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // - -Scalar readScalar(Istream& is) +Scalar ScalarRead(const char* buf) { - Scalar rs; - is >> rs; + char* endptr = nullptr; + errno = 0; - return rs; + const Scalar val = ScalarConvert(buf, &endptr); + + const parsing::errorType err = parsing::checkConversion(buf, endptr); + if (err != parsing::errorType::NONE) + { + FatalIOErrorInFunction("unknown") + << parsing::errorNames[err] << " '" << buf << "'" + << exit(FatalIOError); + } + + return val; } -Istream& operator>>(Istream& is, Scalar& s) +bool readScalar(const char* buf, Scalar& val) +{ + char* endptr = nullptr; + errno = 0; + + val = ScalarConvert(buf, &endptr); + + const parsing::errorType err = parsing::checkConversion(buf, endptr); + if (err != parsing::errorType::NONE) + { + #ifdef FULLDEBUG + IOWarningInFunction("unknown") + << parsing::errorNames[err] << " '" << buf << "'" + << endl; + #endif + return false; + } + + return true; +} + + +// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // + +Scalar ScalarRead(Istream& is) +{ + Scalar val; + is >> val; + + return val; +} + + +Istream& operator>>(Istream& is, Scalar& val) { token t(is); @@ -99,7 +140,7 @@ Istream& operator>>(Istream& is, Scalar& s) if (t.isNumber()) { - s = t.number(); + val = t.number(); } else { @@ -116,9 +157,9 @@ Istream& operator>>(Istream& is, Scalar& s) } -Ostream& operator<<(Ostream& os, const Scalar s) +Ostream& operator<<(Ostream& os, const Scalar val) { - os.write(s); + os.write(val); os.check(FUNCTION_NAME); return os; } diff --git a/src/OpenFOAM/primitives/Scalar/Scalar.H b/src/OpenFOAM/primitives/Scalar/Scalar.H index ea5c5239da..798ca75a23 100644 --- a/src/OpenFOAM/primitives/Scalar/Scalar.H +++ b/src/OpenFOAM/primitives/Scalar/Scalar.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -25,7 +25,7 @@ Typedef Foam::Scalar Description - Single floating point number (float or double) + Floating-point number (float or double) SourceFiles Scalar.C @@ -81,10 +81,10 @@ public: // Constructors //- Construct from primitive - explicit pTraits(const Scalar&); + explicit pTraits(const Scalar& val); //- Construct from Istream - pTraits(Istream&); + pTraits(Istream& is); // Member Functions @@ -103,21 +103,47 @@ public: }; -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// * * * * * * * * * * * * * * * IO/Conversion * * * * * * * * * * * * * * * // //- Return a string representation of a Scalar -word name(const Scalar); - +word name(const Scalar val); //- Return a word representation of a Scalar, using printf-style formatter. // The representation is not checked for valid word characters. -word name(const char* fmt, const Scalar); - +word name(const char* fmt, const Scalar val); //- Return a word representation of a Scalar, using printf-style formatter. // The representation is not checked for valid word characters. -word name(const std::string& fmt, const Scalar); +word name(const std::string& fmt, const Scalar val); +//- Parse entire buffer as a float/double, skipping leading/trailing whitespace. +// \return Parsed value or FatalIOError on any problem +Scalar ScalarRead(const char* buf); + +//- Parse entire string as a float/double, skipping leading/trailing whitespace. +// \return Parsed value or FatalIOError on any problem +inline Scalar ScalarRead(const std::string& str) +{ + return ScalarRead(str.c_str()); +} + +//- Parse entire buffer as a float/double, skipping leading/trailing whitespace. +// \return True if successful. +bool readScalar(const char* buf, Scalar& val); + +//- Parse entire string as a float/double, skipping leading/trailing whitespace. +// \return True if successful. +inline bool readScalar(const std::string& str, Scalar& val) +{ + return readScalar(str.c_str(), val); +} + +Scalar ScalarRead(Istream& is); +Istream& operator>>(Istream& is, Scalar& val); +Ostream& operator<<(Ostream& os, const Scalar val); + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // Standard C++ transcendental functions transFunc(sqrt) @@ -344,8 +370,8 @@ inline Scalar cmptMag(const Scalar s) inline Scalar sqrtSumSqr(const Scalar a, const Scalar b) { - Scalar maga = mag(a); - Scalar magb = mag(b); + const Scalar maga = mag(a); + const Scalar magb = mag(b); if (maga > magb) { @@ -372,12 +398,6 @@ inline Scalar stabilise(const Scalar s, const Scalar small) } -// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // - -Scalar readScalar(Istream&); -Istream& operator>>(Istream&, Scalar&); -Ostream& operator<<(Ostream&, const Scalar); - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/OpenFOAM/primitives/Scalar/doubleScalar/doubleScalar.C b/src/OpenFOAM/primitives/Scalar/doubleScalar/doubleScalar.C index 378b7d592a..da73874c63 100644 --- a/src/OpenFOAM/primitives/Scalar/doubleScalar/doubleScalar.C +++ b/src/OpenFOAM/primitives/Scalar/doubleScalar/doubleScalar.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -24,24 +24,32 @@ License \*---------------------------------------------------------------------------*/ #include "doubleScalar.H" +#include "error.H" +#include "parsing.H" #include "IOstreams.H" #include // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Scalar.C is used for template-like substitution + #define Scalar doubleScalar #define ScalarVGREAT doubleScalarVGREAT #define ScalarVSMALL doubleScalarVSMALL #define ScalarROOTVGREAT doubleScalarROOTVGREAT #define ScalarROOTVSMALL doubleScalarROOTVSMALL -#define readScalar readDoubleScalar +#define ScalarRead readDouble +#define ScalarConvert ::strtod + #include "Scalar.C" + #undef Scalar #undef ScalarVGREAT #undef ScalarVSMALL #undef ScalarROOTVGREAT #undef ScalarROOTVSMALL -#undef readScalar +#undef ScalarRead +#undef ScalarConvert // ************************************************************************* // diff --git a/src/OpenFOAM/primitives/Scalar/doubleScalar/doubleScalar.H b/src/OpenFOAM/primitives/Scalar/doubleScalar/doubleScalar.H index 3089947853..b7a0b8fd56 100644 --- a/src/OpenFOAM/primitives/Scalar/doubleScalar/doubleScalar.H +++ b/src/OpenFOAM/primitives/Scalar/doubleScalar/doubleScalar.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -25,7 +25,7 @@ Typedef Foam::doubleScalar Description - Double precision floating point scalar type. + Floating-point double precision scalar type. SourceFiles doubleScalar.C @@ -59,48 +59,20 @@ static const doubleScalar doubleScalarROOTSMALL = 3.0e-8; static const doubleScalar doubleScalarVSMALL = 1.0e-300; static const doubleScalar doubleScalarROOTVSMALL = 1.0e-150; -//- Read whole of buf as a scalar. Return true if succesful. -inline bool readScalar(const char* buf, doubleScalar& s) -{ - char* endPtr; - s = strtod(buf, &endPtr); - - return (*endPtr == '\0'); -} #define Scalar doubleScalar #define ScalarVGREAT doubleScalarVGREAT #define ScalarVSMALL doubleScalarVSMALL #define ScalarROOTVGREAT doubleScalarROOTVGREAT #define ScalarROOTVSMALL doubleScalarROOTVSMALL -#define readScalar readDoubleScalar +#define ScalarRead readDouble + inline Scalar mag(const Scalar s) { return ::fabs(s); } -#define transFunc(func) \ -inline Scalar func(const Scalar s) \ -{ \ - return ::func(s); \ -} - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -} // End namespace Foam - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -#include "Scalar.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -namespace Foam -{ - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - inline Scalar hypot(const Scalar x, const Scalar y) { return ::hypot(x, y); @@ -121,19 +93,30 @@ inline Scalar yn(const int n, const Scalar s) return ::yn(n, s); } -#undef Scalar -#undef ScalarVGREAT -#undef ScalarVSMALL -#undef ScalarROOTVGREAT -#undef ScalarROOTVSMALL -#undef readScalar -#undef transFunc - +// Normal (double-precision) transcendental functions +#define transFunc(func) \ +inline Scalar func(const Scalar s) \ +{ \ + return ::func(s); \ +} // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "Scalar.H" + +#undef Scalar +#undef ScalarVGREAT +#undef ScalarVSMALL +#undef ScalarROOTVGREAT +#undef ScalarROOTVSMALL +#undef ScalarRead +#undef transFunc + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif diff --git a/src/OpenFOAM/primitives/Scalar/floatScalar/floatScalar.C b/src/OpenFOAM/primitives/Scalar/floatScalar/floatScalar.C index dec0b215d3..94d40441f7 100644 --- a/src/OpenFOAM/primitives/Scalar/floatScalar/floatScalar.C +++ b/src/OpenFOAM/primitives/Scalar/floatScalar/floatScalar.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -24,24 +24,32 @@ License \*---------------------------------------------------------------------------*/ #include "floatScalar.H" +#include "error.H" +#include "parsing.H" #include "IOstreams.H" #include // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Scalar.C is used for template-like substitution + #define Scalar floatScalar #define ScalarVGREAT floatScalarVGREAT #define ScalarVSMALL floatScalarVSMALL #define ScalarROOTVGREAT floatScalarROOTVGREAT #define ScalarROOTVSMALL floatScalarROOTVSMALL -#define readScalar readFloatScalar +#define ScalarRead readFloat +#define ScalarConvert ::strtof + #include "Scalar.C" + #undef Scalar -#undef ScalarVSMALL +#undef ScalarVGREAT #undef ScalarVSMALL #undef ScalarROOTVGREAT #undef ScalarROOTVSMALL -#undef readScalar +#undef ScalarRead +#undef ScalarConvert // ************************************************************************* // diff --git a/src/OpenFOAM/primitives/Scalar/floatScalar/floatScalar.H b/src/OpenFOAM/primitives/Scalar/floatScalar/floatScalar.H index 1cfb728a23..07c8a4aa66 100644 --- a/src/OpenFOAM/primitives/Scalar/floatScalar/floatScalar.H +++ b/src/OpenFOAM/primitives/Scalar/floatScalar/floatScalar.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -25,7 +25,7 @@ Typedef Foam::floatScalar Description - Float precision floating point scalar type. + Floating-point single precision scalar type. SourceFiles floatScalar.C @@ -48,7 +48,7 @@ namespace Foam typedef float floatScalar; -// Largest and smallest scalar values allowed in certain parts of the code +// Largest and smallest scalar values allowed in certain parts of the code. // (6 is the number of significant figures in an // IEEE single precision number. See limits.h or float.h) static const floatScalar floatScalarGREAT = 1.0e+6; @@ -59,48 +59,20 @@ static const floatScalar floatScalarROOTSMALL = 1.0e-3; static const floatScalar floatScalarVSMALL = 1.0e-37; static const floatScalar floatScalarROOTVSMALL = 1.0e-18; -//- Read whole of buf as a scalar. Return true if succesful. -inline bool readScalar(const char* buf, floatScalar& s) -{ - char* endPtr; - s = strtof(buf, &endPtr); - - return (*endPtr == '\0'); -} #define Scalar floatScalar #define ScalarVGREAT floatScalarVGREAT #define ScalarVSMALL floatScalarVSMALL #define ScalarROOTVGREAT floatScalarROOTVGREAT #define ScalarROOTVSMALL floatScalarROOTVSMALL -#define readScalar readFloatScalar +#define ScalarRead readFloat + inline Scalar mag(const Scalar s) { return ::fabsf(s); } -#define transFunc(func) \ -inline Scalar func(const Scalar s) \ -{ \ - return ::func##f(s); \ -} - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -} // End namespace Foam - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -#include "Scalar.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -namespace Foam -{ - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - inline Scalar hypot(const Scalar x, const Scalar y) { return ::hypotf(x, y); @@ -121,19 +93,30 @@ inline Scalar yn(const int n, const Scalar s) return ::ynf(n, s); } -#undef Scalar -#undef ScalarVGREAT -#undef ScalarVSMALL -#undef ScalarROOTVGREAT -#undef ScalarROOTVSMALL -#undef readScalar -#undef transFunc - +// Single-precision transcendental functions (with 'f' appended to the name) +#define transFunc(func) \ +inline Scalar func(const Scalar s) \ +{ \ + return ::func##f(s); \ +} // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "Scalar.H" + +#undef Scalar +#undef ScalarVGREAT +#undef ScalarVSMALL +#undef ScalarROOTVGREAT +#undef ScalarROOTVSMALL +#undef ScalarRead +#undef transFunc + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif diff --git a/src/OpenFOAM/primitives/Scalar/scalar/scalar.C b/src/OpenFOAM/primitives/Scalar/scalar/scalar.C index 4b9748979a..a863db21e2 100644 --- a/src/OpenFOAM/primitives/Scalar/scalar/scalar.C +++ b/src/OpenFOAM/primitives/Scalar/scalar/scalar.C @@ -24,24 +24,17 @@ License \*---------------------------------------------------------------------------*/ #include "scalar.H" +#include "IOstreams.H" -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // -namespace Foam +Foam::scalar Foam::readScalar(Istream& is) { + scalar val; + is >> val; -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -scalar readScalar(Istream& is) -{ - scalar rs; - is >> rs; - - return rs; + return val; } -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -} // End namespace Foam // ************************************************************************* // diff --git a/src/OpenFOAM/primitives/Scalar/scalar/scalar.H b/src/OpenFOAM/primitives/Scalar/scalar/scalar.H index 7c7c00cefc..e705dc8550 100644 --- a/src/OpenFOAM/primitives/Scalar/scalar/scalar.H +++ b/src/OpenFOAM/primitives/Scalar/scalar/scalar.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -25,7 +25,7 @@ Typedef Foam::scalar Description - Single floating point number identical to float or double depending on + A floating-point number identical to float or double depending on whether WM_SP or WM_DP is defined. SourceFiles @@ -58,6 +58,11 @@ namespace Foam static const scalar ROOTVSMALL = floatScalarROOTVSMALL; scalar readScalar(Istream& is); + + inline scalar readScalar(const std::string& str) + { + return readFloat(str); + } } #elif defined(WM_DP) @@ -77,6 +82,11 @@ namespace Foam static const scalar ROOTVSMALL = doubleScalarROOTVSMALL; scalar readScalar(Istream& is); + + inline scalar readScalar(const std::string& str) + { + return readDouble(str); + } } #endif diff --git a/src/OpenFOAM/primitives/ints/int/int.H b/src/OpenFOAM/primitives/ints/int/int.H index a3ab4b5ac1..aa865c3f39 100644 --- a/src/OpenFOAM/primitives/ints/int/int.H +++ b/src/OpenFOAM/primitives/ints/int/int.H @@ -25,7 +25,7 @@ Primitive int Description - System integer + System signed integer SourceFiles intIO.C @@ -67,7 +67,30 @@ MAXMIN(int64_t, int64_t, int64_t) // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // -int readInt(Istream&); +//- Read int from stream +int readInt(Istream& is); + +//- Parse entire buffer as an int, skipping leading/trailing whitespace. +// \return Parsed value or FatalIOError on any problem +int readInt(const char* buf); + +//- Parse entire string as an int, skipping leading/trailing whitespace. +// \return Parsed value or FatalIOError on any problem +inline int readInt(const std::string& str) +{ + return readInt(str.c_str()); +} + +//- Read entire buffer as an int, skipping leading/trailing whitespace. +// \return True if successful. +bool readInt(const char* buf, int& val); + +//- Read entire string as an int32_t, skipping leading/trailing whitespace. +// \return True if successful. +inline bool readInt(const std::string& str, int& val) +{ + return readInt(str.c_str(), val); +} // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/primitives/ints/int/intIO.C b/src/OpenFOAM/primitives/ints/int/intIO.C index 9250e37313..6a2901aefb 100644 --- a/src/OpenFOAM/primitives/ints/int/intIO.C +++ b/src/OpenFOAM/primitives/ints/int/intIO.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -24,10 +24,68 @@ License \*---------------------------------------------------------------------------*/ #include "int.H" +#include "error.H" +#include "parsing.H" #include "IOstreams.H" +#include // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // +int Foam::readInt(const char* buf) +{ + char *endptr = nullptr; + errno = 0; + const intmax_t parsed = ::strtoimax(buf, &endptr, 10); + + const int val = int(parsed); + + if (parsed < INT_MIN || parsed > INT_MAX) + { + // Range error + errno = ERANGE; + } + + const parsing::errorType err = parsing::checkConversion(buf, endptr); + if (err != parsing::errorType::NONE) + { + FatalIOErrorInFunction("unknown") + << parsing::errorNames[err] << " '" << buf << "'" + << exit(FatalIOError); + } + + return val; +} + + +bool Foam::readInt(const char* buf, int& val) +{ + char *endptr = nullptr; + errno = 0; + const intmax_t parsed = ::strtoimax(buf, &endptr, 10); + + val = int(parsed); + + if (parsed < INT_MIN || parsed > INT_MAX) + { + // Range error + errno = ERANGE; + } + + const parsing::errorType err = parsing::checkConversion(buf, endptr); + if (err != parsing::errorType::NONE) + { + #ifdef FULLDEBUG + IOWarningInFunction("unknown") + << parsing::errorNames[err] << " '" << buf << "'" + << endl; + #endif + return false; + } + + return true; +} + + int Foam::readInt(Istream& is) { int val; diff --git a/src/OpenFOAM/primitives/ints/int32/int32.C b/src/OpenFOAM/primitives/ints/int32/int32.C index 4a209fc50b..daa14a004e 100644 --- a/src/OpenFOAM/primitives/ints/int32/int32.C +++ b/src/OpenFOAM/primitives/ints/int32/int32.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -24,6 +24,21 @@ License \*---------------------------------------------------------------------------*/ #include "int32.H" +#include "stringOps.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Foam::word Foam::name(const char* fmt, const int32_t val) +{ + return stringOps::name(fmt, val); +} + + +Foam::word Foam::name(const std::string& fmt, const int32_t val) +{ + return stringOps::name(fmt, val); +} + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -36,9 +51,9 @@ const int32_t Foam::pTraits::rootMax = pTraits::max; const char* const Foam::pTraits::componentNames[] = { "" }; -Foam::pTraits::pTraits(const int32_t& p) +Foam::pTraits::pTraits(const int32_t& val) : - p_(p) + p_(val) {} Foam::pTraits::pTraits(Istream& is) diff --git a/src/OpenFOAM/primitives/ints/int32/int32.H b/src/OpenFOAM/primitives/ints/int32/int32.H index 62ae4b7af7..3e883827fb 100644 --- a/src/OpenFOAM/primitives/ints/int32/int32.H +++ b/src/OpenFOAM/primitives/ints/int32/int32.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -22,10 +22,10 @@ License along with OpenFOAM. If not, see . Primitive - int32 + int32_t Description - 32bit integer + 32bit signed integer SourceFiles int32.C @@ -57,34 +57,72 @@ class Ostream; //- Return a word representation of an int32 inline word name(const int32_t val) { - // no stripping required + // No stripping required return word(std::to_string(val), false); } //- Return a word representation of an int32, using printf-style formatter. // The representation is not checked for valid word characters. -word name(const char* fmt, const int32_t); +word name(const char* fmt, const int32_t val); //- Return a word representation of an int32, using printf-style formatter. // The representation is not checked for valid word characters. -word name(const std::string&, const int32_t); +word name(const std::string&, const int32_t val); // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // -int32_t readInt32(Istream&); -bool read(const char*, int32_t&); -Istream& operator>>(Istream&, int32_t&); -Ostream& operator<<(Ostream&, const int32_t); +//- Read int32_t from stream +int32_t readInt32(Istream& is); + +//- Parse entire buffer as a int32_t, skipping leading/trailing whitespace. +// \return Parsed value or FatalIOError on any problem +int32_t readInt32(const char* buf); + +//- Parse entire string as a int32_t, skipping leading/trailing whitespace. +// \return Parsed value or FatalIOError on any problem +inline int32_t readInt32(const std::string& str) +{ + return readInt32(str.c_str()); +} + +//- Read entire buffer as a int32_t, skipping leading/trailing whitespace. +// \return True if successful. +bool readInt32(const char* buf, int32_t& val); + +//- Read entire string as a int32_t, skipping leading/trailing whitespace. +// \return True if successful. +inline bool readInt32(const std::string& str, int32_t& val) +{ + return readInt32(str.c_str(), val); +} + +//- Same as readInt32 +// \return True if successful. +inline bool read(const char* buf, int32_t& val) +{ + return readInt32(buf, val); +} + +//- Same as readInt32 +// \return True if successful. +inline bool read(const std::string& str, int32_t& val) +{ + return readInt32(str, val); +} + + +Istream& operator>>(Istream& is, int32_t& val); +Ostream& operator<<(Ostream& os, const int32_t val); // On 32bit OSs long is not unambiguously int32_t (or int64_t) causing problems // for IO operator resolution. // This problem is avoided by explicitly defining the following operators: #if WM_ARCH_OPTION == 32 - Istream& operator>>(Istream&, long&); - Ostream& operator<<(Ostream&, const long); + Istream& operator>>(Istream& is, long& val); + Ostream& operator<<(Ostream& os, const long val); #endif @@ -127,10 +165,10 @@ public: // Constructors //- Construct from primitive - explicit pTraits(const int32_t&); + explicit pTraits(const int32_t& val); //- Construct from Istream - pTraits(Istream&); + pTraits(Istream& is); // Member Functions @@ -149,9 +187,9 @@ public: }; -inline int32_t mag(const int32_t l) +inline int32_t mag(const int32_t val) { - return ::abs(l); + return ::abs(val); } diff --git a/src/OpenFOAM/primitives/ints/int32/int32IO.C b/src/OpenFOAM/primitives/ints/int32/int32IO.C index 0a7f18b6f2..f1b4f23fb0 100644 --- a/src/OpenFOAM/primitives/ints/int32/int32IO.C +++ b/src/OpenFOAM/primitives/ints/int32/int32IO.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -24,29 +24,69 @@ License \*---------------------------------------------------------------------------*/ #include "int32.H" -#include "stringOps.H" +#include "error.H" +#include "parsing.H" #include "IOstreams.H" - -#include -#include - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -Foam::word Foam::name(const char* fmt, const int32_t val) -{ - return stringOps::name(fmt, val); -} - - -Foam::word Foam::name(const std::string& fmt, const int32_t val) -{ - return stringOps::name(fmt, val); -} - +#include // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // -Foam::Istream& Foam::operator>>(Istream& is, int32_t& i) +int32_t Foam::readInt32(const char* buf) +{ + char *endptr = nullptr; + errno = 0; + const intmax_t parsed = ::strtoimax(buf, &endptr, 10); + + const int32_t val = int32_t(parsed); + + if (parsed < INT32_MIN || parsed > INT32_MAX) + { + // Range error + errno = ERANGE; + } + + const parsing::errorType err = parsing::checkConversion(buf, endptr); + if (err != parsing::errorType::NONE) + { + FatalIOErrorInFunction("unknown") + << parsing::errorNames[err] << " '" << buf << "'" + << exit(FatalIOError); + } + + return val; +} + + +bool Foam::readInt32(const char* buf, int32_t& val) +{ + char *endptr = nullptr; + errno = 0; + const intmax_t parsed = ::strtoimax(buf, &endptr, 10); + + val = int32_t(parsed); + + if (parsed < INT32_MIN || parsed > INT32_MAX) + { + // Range error + errno = ERANGE; + } + + const parsing::errorType err = parsing::checkConversion(buf, endptr); + if (err != parsing::errorType::NONE) + { + #ifdef FULLDEBUG + IOWarningInFunction("unknown") + << parsing::errorNames[err] << " '" << buf << "'" + << endl; + #endif + return false; + } + + return true; +} + + +Foam::Istream& Foam::operator>>(Istream& is, int32_t& val) { token t(is); @@ -58,7 +98,7 @@ Foam::Istream& Foam::operator>>(Istream& is, int32_t& i) if (t.isLabel()) { - i = int32_t(t.labelToken()); + val = int32_t(t.labelToken()); } else { @@ -84,35 +124,23 @@ int32_t Foam::readInt32(Istream& is) } -bool Foam::read(const char* buf, int32_t& s) +Foam::Ostream& Foam::operator<<(Ostream& os, const int32_t val) { - char *endptr = nullptr; - errno = 0; - intmax_t l = strtoimax(buf, &endptr, 10); - s = int32_t(l); - return - (*endptr == 0) && (errno == 0) - && (l >= INT32_MIN) && (l <= INT32_MAX); -} - - -Foam::Ostream& Foam::operator<<(Ostream& os, const int32_t i) -{ - os.write(label(i)); + os.write(label(val)); os.check(FUNCTION_NAME); return os; } #if WM_ARCH_OPTION == 32 -Foam::Istream& Foam::operator>>(Istream& is, long& i) +Foam::Istream& Foam::operator>>(Istream& is, long& val) { - return operator>>(is, reinterpret_cast(i)); + return operator>>(is, reinterpret_cast(val)); } -Foam::Ostream& Foam::operator<<(Ostream& os, const long i) +Foam::Ostream& Foam::operator<<(Ostream& os, const long val) { - os << int32_t(i); + os << int32_t(val); return os; } #endif diff --git a/src/OpenFOAM/primitives/ints/int64/int64.C b/src/OpenFOAM/primitives/ints/int64/int64.C index f182c9d276..ecc1eb3731 100644 --- a/src/OpenFOAM/primitives/ints/int64/int64.C +++ b/src/OpenFOAM/primitives/ints/int64/int64.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -24,6 +24,21 @@ License \*---------------------------------------------------------------------------*/ #include "int64.H" +#include "stringOps.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Foam::word Foam::name(const char* fmt, const int64_t val) +{ + return stringOps::name(fmt, val); +} + + +Foam::word Foam::name(const std::string& fmt, const int64_t val) +{ + return stringOps::name(fmt, val); +} + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -36,9 +51,9 @@ const int64_t Foam::pTraits::rootMax = pTraits::max; const char* const Foam::pTraits::componentNames[] = { "" }; -Foam::pTraits::pTraits(const int64_t& p) +Foam::pTraits::pTraits(const int64_t& val) : - p_(p) + p_(val) {} Foam::pTraits::pTraits(Istream& is) diff --git a/src/OpenFOAM/primitives/ints/int64/int64.H b/src/OpenFOAM/primitives/ints/int64/int64.H index addb637a77..8c53bbe443 100644 --- a/src/OpenFOAM/primitives/ints/int64/int64.H +++ b/src/OpenFOAM/primitives/ints/int64/int64.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -22,10 +22,10 @@ License along with OpenFOAM. If not, see . Primitive - int64 + int64_t Description - 64bit integer + 64bit signed integer SourceFiles int64.C @@ -58,7 +58,7 @@ class Ostream; //- Return a word representation of an int64 inline word name(const int64_t val) { - // no stripping required + // No stripping required return word(std::to_string(val), false); } @@ -75,10 +75,48 @@ word name(const std::string& fmt, const int64_t); // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // -int64_t readInt64(Istream&); -bool read(const char*, int64_t&); -Istream& operator>>(Istream&, int64_t&); -Ostream& operator<<(Ostream&, const int64_t); +//- Read int64_t from stream +int64_t readInt64(Istream& is); + +//- Parse entire buffer as a int64_t, skipping leading/trailing whitespace. +// \return Parsed value or FatalIOError on any problem +int64_t readInt64(const char* buf); + +//- Parse entire string as a int64_t, skipping leading/trailing whitespace. +// \return Parsed value or FatalIOError on any problem +inline int64_t readInt64(const std::string& str) +{ + return readInt64(str.c_str()); +} + +//- Read entire buffer as a int64_t, skipping leading/trailing whitespace. +// \return True if successful. +bool readInt64(const char* buf, int64_t& val); + +//- Read entire string as a int64_t, skipping leading/trailing whitespace. +// \return True if successful. +inline bool readInt64(const std::string& str, int64_t& val) +{ + return readInt64(str.c_str(), val); +} + +//- Same as readInt64 +// \return True if successful. +inline bool read(const char* buf, int64_t& val) +{ + return readInt64(buf, val); +} + +//- Same as readInt64 +// \return True if successful. +inline bool read(const std::string& str, int64_t& val) +{ + return readInt64(str, val); +} + + +Istream& operator>>(Istream& is, int64_t& val); +Ostream& operator<<(Ostream& os, const int64_t val); //- Template specialization for pTraits template<> @@ -119,10 +157,10 @@ public: // Constructors //- Construct from primitive - explicit pTraits(const int64_t&); + explicit pTraits(const int64_t& val); //- Construct from Istream - pTraits(Istream&); + pTraits(Istream& is); // Member Functions @@ -141,9 +179,9 @@ public: }; -inline int64_t mag(const int64_t l) +inline int64_t mag(const int64_t val) { - return ::labs(l); + return ::labs(val); } diff --git a/src/OpenFOAM/primitives/ints/int64/int64IO.C b/src/OpenFOAM/primitives/ints/int64/int64IO.C index 19d93bf8a8..d16d979d6f 100644 --- a/src/OpenFOAM/primitives/ints/int64/int64IO.C +++ b/src/OpenFOAM/primitives/ints/int64/int64IO.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -24,29 +24,69 @@ License \*---------------------------------------------------------------------------*/ #include "int64.H" -#include "stringOps.H" +#include "error.H" +#include "parsing.H" #include "IOstreams.H" - -#include -#include - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -Foam::word Foam::name(const char* fmt, const int64_t val) -{ - return stringOps::name(fmt, val); -} - - -Foam::word Foam::name(const std::string& fmt, const int64_t val) -{ - return stringOps::name(fmt, val); -} - +#include // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // -Foam::Istream& Foam::operator>>(Istream& is, int64_t& i) +int64_t Foam::readInt64(const char* buf) +{ + char *endptr = nullptr; + errno = 0; + const intmax_t parsed = ::strtoimax(buf, &endptr, 10); + + const int64_t val = int64_t(parsed); + + if (parsed < INT64_MIN || parsed > INT64_MAX) + { + // Range error + errno = ERANGE; + } + + const parsing::errorType err = parsing::checkConversion(buf, endptr); + if (err != parsing::errorType::NONE) + { + FatalIOErrorInFunction("unknown") + << parsing::errorNames[err] << " '" << buf << "'" + << exit(FatalIOError); + } + + return val; +} + + +bool Foam::readInt64(const char* buf, int64_t& val) +{ + char *endptr = nullptr; + errno = 0; + const intmax_t parsed = ::strtoimax(buf, &endptr, 10); + + val = int64_t(parsed); + + if (parsed < INT64_MIN || parsed > INT64_MAX) + { + // Range error + errno = ERANGE; + } + + const parsing::errorType err = parsing::checkConversion(buf, endptr); + if (err != parsing::errorType::NONE) + { + #ifdef FULLDEBUG + IOWarningInFunction("unknown") + << parsing::errorNames[err] << " '" << buf << "'" + << endl; + #endif + return false; + } + + return true; +} + + +Foam::Istream& Foam::operator>>(Istream& is, int64_t& val) { token t(is); @@ -58,7 +98,7 @@ Foam::Istream& Foam::operator>>(Istream& is, int64_t& i) if (t.isLabel()) { - i = int64_t(t.labelToken()); + val = int64_t(t.labelToken()); } else { @@ -84,19 +124,9 @@ int64_t Foam::readInt64(Istream& is) } -bool Foam::read(const char* buf, int64_t& s) +Foam::Ostream& Foam::operator<<(Ostream& os, const int64_t val) { - char *endptr = nullptr; - errno = 0; - intmax_t l = strtoimax(buf, &endptr, 10); - s = int64_t(l); - return (*endptr == 0) && (errno == 0); -} - - -Foam::Ostream& Foam::operator<<(Ostream& os, const int64_t i) -{ - os.write(label(i)); + os.write(label(val)); os.check(FUNCTION_NAME); return os; } diff --git a/src/OpenFOAM/primitives/ints/label/label.H b/src/OpenFOAM/primitives/ints/label/label.H index 846803d081..08b4d1ff39 100644 --- a/src/OpenFOAM/primitives/ints/label/label.H +++ b/src/OpenFOAM/primitives/ints/label/label.H @@ -61,11 +61,45 @@ typedef INT_SIZE(int, _t) label; static const label labelMin = INT_SIZE(INT, _MIN); static const label labelMax = INT_SIZE(INT, _MAX); +//- Read label from stream. +// Uses readInt32 or readInt64 according to WM_LABEL_SIZE inline label readLabel(Istream& is) { return INT_SIZE(readInt,) (is); } +//- Parse entire buffer as a label, skipping leading/trailing whitespace. +// Uses readInt32 or readInt64 according to WM_LABEL_SIZE +// \return Parsed value or FatalIOError on any problem +inline label readLabel(const char* buf) +{ + return INT_SIZE(readInt,) (buf); +} + +//- Parse entire string as a label, skipping leading/trailing whitespace. +// Uses readInt32 or readInt64 according to WM_LABEL_SIZE +// \return Parsed value or FatalIOError on any problem +inline label readLabel(const std::string& str) +{ + return INT_SIZE(readInt,) (str); +} + +//- Parse entire buffer as a label, skipping leading/trailing whitespace. +// Uses readInt32 or readInt64 according to WM_LABEL_SIZE +// \return True if successful. +inline bool readLabel(const char* buf, label& val) +{ + return INT_SIZE(readInt,) (buf, val); +} + +//- Parse entire string as a label, skipping leading/trailing whitespace. +// Uses readInt32 or readInt64 according to WM_LABEL_SIZE +// \return True if successful. +inline bool readLabel(const std::string& str, label& val) +{ + return INT_SIZE(readInt,) (str, val); +} + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/primitives/ints/uLabel/uLabel.H b/src/OpenFOAM/primitives/ints/uLabel/uLabel.H index 0c712fa376..9a8713f733 100644 --- a/src/OpenFOAM/primitives/ints/uLabel/uLabel.H +++ b/src/OpenFOAM/primitives/ints/uLabel/uLabel.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -28,7 +28,7 @@ Description A uLabel is an uint32_t or uint64_t as specified by the pre-processor macro WM_LABEL_SIZE. - A readLabel function is defined so that uLabel can be constructed from + A readULabel function is defined so that uLabel can be constructed from Istream. \*---------------------------------------------------------------------------*/ @@ -60,11 +60,46 @@ typedef UINT_SIZE(uint, _t) uLabel; static const uLabel uLabelMax = UINT_SIZE(UINT, _MAX); +//- Read uLabel from stream. +// Uses readUint32 or readUint64 according to WM_LABEL_SIZE inline uLabel readULabel(Istream& is) { return UINT_SIZE(readUint,) (is); } +//- Parse entire buffer as a uLabel, skipping leading/trailing whitespace. +// Uses readUint32 or readUint64 according to WM_LABEL_SIZE +// \return Parsed value or FatalIOError on any problem +inline uLabel readULabel(const char* buf) +{ + return UINT_SIZE(readUint,) (buf); +} + +//- Parse entire string as a uLabel, skipping leading/trailing whitespace. +// Uses readUint32 or readUint64 according to WM_LABEL_SIZE +// \return Parsed value or FatalIOError on any problem +inline uLabel readULabel(const std::string& str) +{ + return UINT_SIZE(readUint,) (str); +} + +//- Parse entire buffer as a uLabel, skipping leading/trailing whitespace. +// Uses readUint32 or readUint64 according to WM_LABEL_SIZE +// \return True if successful. +inline bool readULabel(const char* buf, uLabel& val) +{ + return UINT_SIZE(readUint,) (buf, val); +} + + +//- Parse entire string as a uLabel, skipping leading/trailing whitespace. +// Uses readUint32 or readUint64 according to WM_LABEL_SIZE +// \return True if successful. +inline bool readULabel(const std::string& str, uLabel& val) +{ + return UINT_SIZE(readUint,) (str, val); +} + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/primitives/ints/uint/uint.H b/src/OpenFOAM/primitives/ints/uint/uint.H index ea2430dc35..8234ed996a 100644 --- a/src/OpenFOAM/primitives/ints/uint/uint.H +++ b/src/OpenFOAM/primitives/ints/uint/uint.H @@ -25,7 +25,7 @@ Primitive uint Description - System uinteger + System unsigned integer SourceFiles uintIO.C @@ -67,7 +67,8 @@ MAXMIN(uint64_t, uint64_t, uint64_t) // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // -unsigned int readUint(Istream&); +//- Read unsigned int from stream +unsigned int readUint(Istream& is); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/primitives/ints/uint32/uint32.C b/src/OpenFOAM/primitives/ints/uint32/uint32.C index 2fec72846d..16fd477ea6 100644 --- a/src/OpenFOAM/primitives/ints/uint32/uint32.C +++ b/src/OpenFOAM/primitives/ints/uint32/uint32.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -24,6 +24,21 @@ License \*---------------------------------------------------------------------------*/ #include "uint32.H" +#include "stringOps.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Foam::word Foam::name(const char* fmt, const uint32_t val) +{ + return stringOps::name(fmt, val); +} + + +Foam::word Foam::name(const std::string& fmt, const uint32_t val) +{ + return stringOps::name(fmt, val); +} + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -36,9 +51,9 @@ const uint32_t Foam::pTraits::rootMax = pTraits::max; const char* const Foam::pTraits::componentNames[] = { "" }; -Foam::pTraits::pTraits(const uint32_t& p) +Foam::pTraits::pTraits(const uint32_t& val) : - p_(p) + p_(val) {} Foam::pTraits::pTraits(Istream& is) diff --git a/src/OpenFOAM/primitives/ints/uint32/uint32.H b/src/OpenFOAM/primitives/ints/uint32/uint32.H index 72707d30da..d7b7c1b41d 100644 --- a/src/OpenFOAM/primitives/ints/uint32/uint32.H +++ b/src/OpenFOAM/primitives/ints/uint32/uint32.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -22,10 +22,10 @@ License along with OpenFOAM. If not, see . Primitive - uint32 + uint32_t Description - 32bit uinteger + 32bit unsigned integer SourceFiles uint32.C @@ -57,7 +57,7 @@ class Ostream; //- Return a word representation of a uint32 inline word name(const uint32_t val) { - // no stripping required + // No stripping required return word(std::to_string(val), false); } @@ -74,10 +74,48 @@ word name(const std::string& fmt, const uint32_t); // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // -uint32_t readUint32(Istream&); -bool read(const char*, uint32_t&); -Istream& operator>>(Istream&, uint32_t&); -Ostream& operator<<(Ostream&, const uint32_t); +//- Read uint32_t from stream +uint32_t readUint32(Istream& is); + +//- Parse entire buffer as a uint32_t, skipping leading/trailing whitespace. +// \return Parsed value or FatalIOError on any problem +uint32_t readUint32(const char* buf); + +//- Parse entire string as a uint32_t, skipping leading/trailing whitespace. +// \return Parsed value or FatalIOError on any problem +inline uint32_t readUint32(const std::string& str) +{ + return readUint32(str.c_str()); +} + +//- Read entire buffer as a uint32_t, skipping leading/trailing whitespace. +// \return True if successful. +bool readUint32(const char* buf, uint32_t& val); + +//- Read entire string as a uint32_t, skipping leading/trailing whitespace. +// \return True if successful. +inline bool readUint32(const std::string& str, uint32_t& val) +{ + return readUint32(str.c_str(), val); +} + +//- Same as readUint32 +// \return True if successful. +inline bool read(const char* buf, uint32_t& val) +{ + return readUint32(buf, val); +} + +//- Same as readUint32 +// \return True if successful. +inline bool read(const std::string& str, uint32_t& val) +{ + return readUint32(str, val); +} + + +Istream& operator>>(Istream& is, uint32_t& val); +Ostream& operator<<(Ostream& os, const uint32_t val); //- Template specialization for pTraits template<> @@ -118,10 +156,10 @@ public: // Constructors //- Construct from primitive - explicit pTraits(const uint32_t&); + explicit pTraits(const uint32_t& val); //- Construct from Istream - pTraits(Istream&); + pTraits(Istream& is); // Member Functions diff --git a/src/OpenFOAM/primitives/ints/uint32/uint32IO.C b/src/OpenFOAM/primitives/ints/uint32/uint32IO.C index 240c1029a8..bf4e6fb8a0 100644 --- a/src/OpenFOAM/primitives/ints/uint32/uint32IO.C +++ b/src/OpenFOAM/primitives/ints/uint32/uint32IO.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -24,26 +24,68 @@ License \*---------------------------------------------------------------------------*/ #include "uint32.H" -#include "stringOps.H" +#include "parsing.H" #include "IOstreams.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -Foam::word Foam::name(const char* fmt, const uint32_t val) -{ - return stringOps::name(fmt, val); -} - - -Foam::word Foam::name(const std::string& fmt, const uint32_t val) -{ - return stringOps::name(fmt, val); -} - +#include // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // -Foam::Istream& Foam::operator>>(Istream& is, uint32_t& i) +uint32_t Foam::readUint32(const char* buf) +{ + char *endptr = nullptr; + errno = 0; + const uintmax_t parsed = ::strtoumax(buf, &endptr, 10); + + const uint32_t val = uint32_t(parsed); + + if (parsed > UINT32_MAX) + { + // Range error + errno = ERANGE; + } + + const parsing::errorType err = parsing::checkConversion(buf, endptr); + if (err != parsing::errorType::NONE) + { + FatalIOErrorInFunction("unknown") + << parsing::errorNames[err] << " '" << buf << "'" + << exit(FatalIOError); + } + + return val; +} + + +bool Foam::readUint32(const char* buf, uint32_t& val) +{ + char *endptr = nullptr; + errno = 0; + const uintmax_t parsed = ::strtoumax(buf, &endptr, 10); + + val = uint32_t(parsed); + + if (parsed > UINT32_MAX) + { + // Range error + errno = ERANGE; + } + + const parsing::errorType err = parsing::checkConversion(buf, endptr); + if (err != parsing::errorType::NONE) + { + #ifdef FULLDEBUG + IOWarningInFunction("unknown") + << parsing::errorNames[err] << " '" << buf << "'" + << endl; + #endif + return false; + } + + return true; +} + + +Foam::Istream& Foam::operator>>(Istream& is, uint32_t& val) { token t(is); @@ -55,7 +97,7 @@ Foam::Istream& Foam::operator>>(Istream& is, uint32_t& i) if (t.isLabel()) { - i = uint32_t(t.labelToken()); + val = uint32_t(t.labelToken()); } else { @@ -81,18 +123,9 @@ uint32_t Foam::readUint32(Istream& is) } -bool Foam::read(const char* buf, uint32_t& s) +Foam::Ostream& Foam::operator<<(Ostream& os, const uint32_t val) { - char *endptr = nullptr; - long l = strtol(buf, &endptr, 10); - s = uint32_t(l); - return (*endptr == 0); -} - - -Foam::Ostream& Foam::operator<<(Ostream& os, const uint32_t i) -{ - os.write(label(i)); + os.write(label(val)); os.check(FUNCTION_NAME); return os; } diff --git a/src/OpenFOAM/primitives/ints/uint64/uint64.C b/src/OpenFOAM/primitives/ints/uint64/uint64.C index b4ca245d25..c154a7f917 100644 --- a/src/OpenFOAM/primitives/ints/uint64/uint64.C +++ b/src/OpenFOAM/primitives/ints/uint64/uint64.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -24,6 +24,21 @@ License \*---------------------------------------------------------------------------*/ #include "uint64.H" +#include "stringOps.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Foam::word Foam::name(const char* fmt, const uint64_t val) +{ + return stringOps::name(fmt, val); +} + + +Foam::word Foam::name(const std::string& fmt, const uint64_t val) +{ + return stringOps::name(fmt, val); +} + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -36,9 +51,9 @@ const uint64_t Foam::pTraits::rootMax = pTraits::max; const char* const Foam::pTraits::componentNames[] = { "" }; -Foam::pTraits::pTraits(const uint64_t& p) +Foam::pTraits::pTraits(const uint64_t& val) : - p_(p) + p_(val) {} Foam::pTraits::pTraits(Istream& is) diff --git a/src/OpenFOAM/primitives/ints/uint64/uint64.H b/src/OpenFOAM/primitives/ints/uint64/uint64.H index af79433e3f..fa803f5f54 100644 --- a/src/OpenFOAM/primitives/ints/uint64/uint64.H +++ b/src/OpenFOAM/primitives/ints/uint64/uint64.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -22,10 +22,10 @@ License along with OpenFOAM. If not, see . Primitive - uint64 + uint64_t Description - 64bit uinteger + 64bit unsigned integer SourceFiles uint64.C @@ -44,7 +44,6 @@ SourceFiles #include "pTraits.H" #include "direction.H" - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam @@ -58,7 +57,7 @@ class Ostream; //- Return a word representation of a uint64 inline word name(const uint64_t val) { - // no stripping required + // No stripping required return word(std::to_string(val), false); } @@ -75,10 +74,48 @@ word name(const std::string& fmt, const uint64_t); // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // -uint64_t readUint64(Istream&); -bool read(const char*, uint64_t&); -Istream& operator>>(Istream&, uint64_t&); -Ostream& operator<<(Ostream&, const uint64_t); +//- Read uint64_t from stream. +uint64_t readUint64(Istream& is); + +//- Parse entire buffer as uint64_t, skipping leading/trailing whitespace. +// \return Parsed value or FatalIOError on any problem +uint64_t readUint64(const char* buf); + +//- Parse entire string as uint64_t, skipping leading/trailing whitespace. +// \return Parsed value or FatalIOError on any problem +inline uint64_t readUint64(const std::string& str) +{ + return readUint64(str.c_str()); +} + +//- Parse entire buffer as uint64_t, skipping leading/trailing whitespace. +// \return True if successful. +bool readUint64(const char* buf, uint64_t& val); + +//- Parse entire string as uint64_t, skipping leading/trailing whitespace. +// \return True if successful. +inline bool readUint64(const std::string& str, uint64_t& val) +{ + return readUint64(str.c_str(), val); +} + +//- Same as readUint64 +// \return True if successful. +inline bool read(const char* buf, uint64_t& val) +{ + return readUint64(buf, val); +} + +//- Same as readUint64 +// \return True if successful. +inline bool read(const std::string& str, uint64_t& val) +{ + return readUint64(str, val); +} + + +Istream& operator>>(Istream& is, uint64_t& val); +Ostream& operator<<(Ostream& os, const uint64_t val); //- Template specialization for pTraits template<> @@ -119,10 +156,10 @@ public: // Constructors //- Construct from primitive - explicit pTraits(const uint64_t&); + explicit pTraits(const uint64_t& val); //- Construct from Istream - pTraits(Istream&); + pTraits(Istream& is); // Member Functions diff --git a/src/OpenFOAM/primitives/ints/uint64/uint64IO.C b/src/OpenFOAM/primitives/ints/uint64/uint64IO.C index 18eb5ab5f4..2f23b89ddd 100644 --- a/src/OpenFOAM/primitives/ints/uint64/uint64IO.C +++ b/src/OpenFOAM/primitives/ints/uint64/uint64IO.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -24,26 +24,68 @@ License \*---------------------------------------------------------------------------*/ #include "uint64.H" -#include "stringOps.H" +#include "parsing.H" #include "IOstreams.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -Foam::word Foam::name(const char* fmt, const uint64_t val) -{ - return stringOps::name(fmt, val); -} - - -Foam::word Foam::name(const std::string& fmt, const uint64_t val) -{ - return stringOps::name(fmt, val); -} - +#include // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // -Foam::Istream& Foam::operator>>(Istream& is, uint64_t& i) +uint64_t Foam::readUint64(const char* buf) +{ + char *endptr = nullptr; + errno = 0; + const uintmax_t parsed = ::strtoumax(buf, &endptr, 10); + + const uint64_t val = uint64_t(parsed); + + if (parsed > UINT64_MAX) + { + // Range error + errno = ERANGE; + } + + const parsing::errorType err = parsing::checkConversion(buf, endptr); + if (err != parsing::errorType::NONE) + { + FatalIOErrorInFunction("unknown") + << parsing::errorNames[err] << " '" << buf << "'" + << exit(FatalIOError); + } + + return val; +} + + +bool Foam::readUint64(const char* buf, uint64_t& val) +{ + char *endptr = nullptr; + errno = 0; + const uintmax_t parsed = ::strtoumax(buf, &endptr, 10); + + val = uint64_t(parsed); + + if (parsed > UINT64_MAX) + { + // Range error + errno = ERANGE; + } + + const parsing::errorType err = parsing::checkConversion(buf, endptr); + if (err != parsing::errorType::NONE) + { + #ifdef FULLDEBUG + IOWarningInFunction("unknown") + << parsing::errorNames[err] << " '" << buf << "'" + << endl; + #endif + return false; + } + + return true; +} + + +Foam::Istream& Foam::operator>>(Istream& is, uint64_t& val) { token t(is); @@ -55,7 +97,7 @@ Foam::Istream& Foam::operator>>(Istream& is, uint64_t& i) if (t.isLabel()) { - i = uint64_t(t.labelToken()); + val = uint64_t(t.labelToken()); } else { @@ -81,18 +123,9 @@ uint64_t Foam::readUint64(Istream& is) } -bool Foam::read(const char* buf, uint64_t& s) +Foam::Ostream& Foam::operator<<(Ostream& os, const uint64_t val) { - char *endptr = nullptr; - long l = strtol(buf, &endptr, 10); - s = uint64_t(l); - return (*endptr == 0); -} - - -Foam::Ostream& Foam::operator<<(Ostream& os, const uint64_t i) -{ - os.write(label(i)); + os.write(label(val)); os.check(FUNCTION_NAME); return os; } diff --git a/src/OpenFOAM/primitives/strings/parsing/parsing.C b/src/OpenFOAM/primitives/strings/parsing/parsing.C new file mode 100644 index 0000000000..2b81829528 --- /dev/null +++ b/src/OpenFOAM/primitives/strings/parsing/parsing.C @@ -0,0 +1,38 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "parsing.H" + +// * * * * * * * * * * * * * * * * Global Data * * * * * * * * * * * * * * * // + +const Foam::Enum +Foam::parsing::errorNames +{ + { errorType::GENERAL, "General error parsing" }, + { errorType::TRAILING, "Trailing content found parsing" }, +}; + + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/strings/parsing/parsing.H b/src/OpenFOAM/primitives/strings/parsing/parsing.H new file mode 100644 index 0000000000..bef3d34f9c --- /dev/null +++ b/src/OpenFOAM/primitives/strings/parsing/parsing.H @@ -0,0 +1,85 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Namespace + Foam::parsing + +Description + Collection of static functions and data related to parsing + +SourceFiles + parsing.C + parsingI.H + +\*---------------------------------------------------------------------------*/ +#ifndef parsing_H +#define parsing_H + +#include "Enum.H" +#include + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Namespace parsing Declaration +\*---------------------------------------------------------------------------*/ + +namespace parsing +{ + // Enumerations + + //- Enumeration for possible parsing error + enum class errorType + { + NONE = 0, //!< No error encountered + GENERAL = 1, //!< General parsing error + TRAILING = 2, //!< Trailing content detected + }; + + + //- Strings corresponding to the errorType + extern const Foam::Enum errorNames; + + //- Sanity check after strtof, strtod, etc. + // Should set errno = 0 prior to the conversion. + inline errorType checkConversion(const char* buf, char* endptr); + + +} // End namespace parsing + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "parsingI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/strings/parsing/parsingI.H b/src/OpenFOAM/primitives/strings/parsing/parsingI.H new file mode 100644 index 0000000000..7f6a4087a1 --- /dev/null +++ b/src/OpenFOAM/primitives/strings/parsing/parsingI.H @@ -0,0 +1,55 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +inline Foam::parsing::errorType Foam::parsing::checkConversion +( + const char* buf, + char* endptr +) +{ + if (errno || endptr == buf) + { + // Some type of error OR no conversion + return errorType::GENERAL; + } + + // Trailing spaces are permitted + while (isspace(*endptr)) + { + ++endptr; + } + + if (*endptr != '\0') + { + // Trailing content + return errorType::TRAILING; + } + + // Valid conversion + return errorType::NONE; +} + + +// ************************************************************************* // diff --git a/src/fileFormats/nas/NASCore.C b/src/fileFormats/nas/NASCore.C index 705f3e62c0..45fe1f30cc 100644 --- a/src/fileFormats/nas/NASCore.C +++ b/src/fileFormats/nas/NASCore.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -24,7 +24,55 @@ License \*---------------------------------------------------------------------------*/ #include "NASCore.H" -#include "StringStream.H" +#include "parsing.H" + +// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // + +Foam::scalar Foam::fileFormats::NASCore::readNasScalar(const string& str) +{ + const auto signPos = str.find_last_of("+-"); + + if + ( + signPos == std::string::npos + || signPos == 0 + || str[signPos-1] == 'E' || str[signPos-1] == 'e' + || isspace(str[signPos-1]) + ) + { + // A normal number format + return readScalar(str); + } + + + // Nastran compact number format. + // Eg, "1234-2" instead of "1234E-2" + + scalar value = 0; + int exponent = 0; // Any integer + + if + ( + readScalar(str.substr(0, signPos), value) // Mantissa + && readInt(str.substr(signPos), exponent) // Exponent (with sign) + ) + { + // Note: this does not catch underflow/overflow + // (especially when scalar is a float) + value *= ::pow(10, exponent); + } + else + { + FatalIOErrorInFunction("unknown") + << parsing::errorNames[parsing::errorType::GENERAL] << str + << exit(FatalIOError); + + value = 0; + } + + return value; +} + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // @@ -32,36 +80,4 @@ Foam::fileFormats::NASCore::NASCore() {} -// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // - -Foam::scalar Foam::fileFormats::NASCore::parseNASCoord(const string& s) -{ - scalar value = 0; - - const size_t expSign = s.find_last_of("+-"); - - if (expSign != std::string::npos && expSign > 0 && !isspace(s[expSign-1])) - { - scalar exponent = 0; - - // Parse as per strtod/strtof - allowing trailing space or [Ee] - readScalar(s.substr(0, expSign).c_str(), value); // mantissa - readScalar(s.substr(expSign+1).c_str(), exponent); - - if (s[expSign] == '-') - { - exponent = -exponent; - } - - value *= ::pow(10, exponent); - } - else - { - readScalar(s.c_str(), value); - } - - return value; -} - - // ************************************************************************* // diff --git a/src/fileFormats/nas/NASCore.H b/src/fileFormats/nas/NASCore.H index ebe3dabb97..41c6f466cc 100644 --- a/src/fileFormats/nas/NASCore.H +++ b/src/fileFormats/nas/NASCore.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -56,7 +56,14 @@ public: // Public Member Functions //- Extract numbers from things like "-2.358-8" (same as "-2.358e-8") - static scalar parseNASCoord(const string& s); + static scalar readNasScalar(const string& str); + + //- Extract numbers from things like "-2.358-8" (same as "-2.358e-8") + // \deprecated use readNasScalar instead (deprecated Sep 2017) + inline static scalar parseNASCoord(const string& str) + { + return readNasScalar(str); + } // Constructors From a4e63e2bfb1864b507b71ef150e148f70dc5caac Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Thu, 21 Sep 2017 16:10:33 +0200 Subject: [PATCH 03/20] STYLE: avoid IStringStream when parsing primitives --- src/OpenFOAM/dimensionSet/dimensionSetIO.C | 10 +-- .../tableReaders/csv/csvTableReader.C | 11 ++-- .../primitives/functions/Function1/CSV/CSV.C | 13 ++-- .../edgeMeshFormats/nas/NASedgeFormat.C | 30 ++++----- .../surfaceFormats/nas/NASsurfaceFormat.C | 53 +++++++-------- .../triSurface/interfaces/NAS/readNAS.C | 64 ++++++++----------- .../radiationModels/fvDOM/fvDOM/fvDOM.C | 8 +-- 7 files changed, 84 insertions(+), 105 deletions(-) diff --git a/src/OpenFOAM/dimensionSet/dimensionSetIO.C b/src/OpenFOAM/dimensionSet/dimensionSetIO.C index 3977383160..9fcfd9ee20 100644 --- a/src/OpenFOAM/dimensionSet/dimensionSetIO.C +++ b/src/OpenFOAM/dimensionSet/dimensionSetIO.C @@ -143,7 +143,7 @@ void Foam::dimensionSet::tokeniser::splitWord(const word& w) const word subWord = w.substr(start, i-start); if (isdigit(subWord[0]) || subWord[0] == token::SUBTRACT) { - push(token(readScalar(IStringStream(subWord)()))); + push(token(readScalar(subWord))); } else { @@ -154,7 +154,9 @@ void Foam::dimensionSet::tokeniser::splitWord(const word& w) { if (isdigit(w[i])) { - push(token(readScalar(IStringStream(w[i])()))); + // Single digit: as scalar value + const scalar val = (w[i] - '0'); + push(token(val)); } else { @@ -169,7 +171,7 @@ void Foam::dimensionSet::tokeniser::splitWord(const word& w) const word subWord = w.substr(start); if (isdigit(subWord[0]) || subWord[0] == token::SUBTRACT) { - push(token(readScalar(IStringStream(subWord)()))); + push(token(readScalar(subWord))); } else { @@ -539,7 +541,7 @@ Foam::Istream& Foam::dimensionSet::read { const word symbol = symbolPow.substr(0, index); const word exp = symbolPow.substr(index+1); - scalar exponent = readScalar(IStringStream(exp)()); + scalar exponent = readScalar(exp); dimensionedScalar s; s.read(readSet[symbol], readSet); diff --git a/src/OpenFOAM/interpolations/interpolationTable/tableReaders/csv/csvTableReader.C b/src/OpenFOAM/interpolations/interpolationTable/tableReaders/csv/csvTableReader.C index ae2c0cb5e0..51adcb3381 100644 --- a/src/OpenFOAM/interpolations/interpolationTable/tableReaders/csv/csvTableReader.C +++ b/src/OpenFOAM/interpolations/interpolationTable/tableReaders/csv/csvTableReader.C @@ -71,7 +71,7 @@ namespace Foam << exit(FatalError); } - return readScalar(IStringStream(splitted[componentColumns_[0]])()); + return readScalar(splitted[componentColumns_[0]]); } @@ -80,7 +80,7 @@ namespace Foam { Type result; - for(label i = 0;i < pTraits::nComponents; i++) + for (label i = 0; i < pTraits::nComponents; ++i) { if (componentColumns_[i] >= splitted.size()) { @@ -90,10 +90,7 @@ namespace Foam << exit(FatalError); } - result[i] = readScalar - ( - IStringStream(splitted[componentColumns_[i]])() - ); + result[i] = readScalar(splitted[componentColumns_[i]]); } return result; @@ -150,7 +147,7 @@ void Foam::csvTableReader::operator() break; } - scalar time = readScalar(IStringStream(splitted[timeColumn_])()); + scalar time = readScalar(splitted[timeColumn_]); Type value = readValue(splitted); values.append(Tuple2(time, value)); diff --git a/src/OpenFOAM/primitives/functions/Function1/CSV/CSV.C b/src/OpenFOAM/primitives/functions/Function1/CSV/CSV.C index 1ddf2cc1ca..4ddc9123dc 100644 --- a/src/OpenFOAM/primitives/functions/Function1/CSV/CSV.C +++ b/src/OpenFOAM/primitives/functions/Function1/CSV/CSV.C @@ -43,7 +43,7 @@ Foam::label Foam::Function1Types::CSV::readValue << exit(FatalError); } - return readLabel(IStringStream(splitted[componentColumns_[0]])()); + return readLabel(splitted[componentColumns_[0]]); } @@ -61,7 +61,7 @@ Foam::scalar Foam::Function1Types::CSV::readValue << exit(FatalError); } - return readScalar(IStringStream(splitted[componentColumns_[0]])()); + return readScalar(splitted[componentColumns_[0]]); } @@ -70,18 +70,17 @@ Type Foam::Function1Types::CSV::readValue(const List& splitted) { Type result; - for (label i = 0; i < pTraits::nComponents; i++) + for (label i = 0; i < pTraits::nComponents; ++i) { if (componentColumns_[i] >= splitted.size()) { FatalErrorInFunction - << "No column " << componentColumns_[i] << " in " + << "No column " << componentColumns_[i] << " in " << splitted << endl << exit(FatalError); } - result[i] = - readScalar(IStringStream(splitted[componentColumns_[i]])()); + result[i] = readScalar(splitted[componentColumns_[i]]); } return result; @@ -189,7 +188,7 @@ void Foam::Function1Types::CSV::read() break; } - scalar x = readScalar(IStringStream(splitted[refColumn_])()); + scalar x = readScalar(splitted[refColumn_]); Type value = readValue(splitted); values.append(Tuple2(x, value)); diff --git a/src/meshTools/edgeMesh/edgeMeshFormats/nas/NASedgeFormat.C b/src/meshTools/edgeMesh/edgeMeshFormats/nas/NASedgeFormat.C index 7bcc2d3243..761ec70b31 100644 --- a/src/meshTools/edgeMesh/edgeMeshFormats/nas/NASedgeFormat.C +++ b/src/meshTools/edgeMesh/edgeMeshFormats/nas/NASedgeFormat.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -103,9 +103,9 @@ bool Foam::fileFormats::NASedgeFormat::read { edge e; - // label groupId = readLabel(IStringStream(line.substr(16,8))()); - e[0] = readLabel(IStringStream(line.substr(24,8))()); - e[1] = readLabel(IStringStream(line.substr(32,8))()); + // label groupId = readLabel(line.substr(16,8)); + e[0] = readLabel(line.substr(24,8)); + e[1] = readLabel(line.substr(32,8)); // discard groupID dynEdges.append(e); @@ -114,19 +114,19 @@ bool Foam::fileFormats::NASedgeFormat::read { edge e; - // label groupId = readLabel(IStringStream(line.substr(16,8))()); - e[0] = readLabel(IStringStream(line.substr(16,8))()); - e[1] = readLabel(IStringStream(line.substr(24,8))()); + // label groupId = readLabel(line.substr(16,8)); + e[0] = readLabel(line.substr(16,8)); + e[1] = readLabel(line.substr(24,8)); // discard groupID dynEdges.append(e); } else if (cmd == "GRID") { - label index = readLabel(IStringStream(line.substr(8,8))()); - scalar x = parseNASCoord(line.substr(24, 8)); - scalar y = parseNASCoord(line.substr(32, 8)); - scalar z = parseNASCoord(line.substr(40, 8)); + label index = readLabel(line.substr(8,8)); + scalar x = readNasScalar(line.substr(24, 8)); + scalar y = readNasScalar(line.substr(32, 8)); + scalar z = readNasScalar(line.substr(40, 8)); pointId.append(index); dynPoints.append(point(x, y, z)); @@ -139,9 +139,9 @@ bool Foam::fileFormats::NASedgeFormat::read // GRID* 126 0 -5.55999875E+02 -5.68730474E+02 // * 2.14897901E+02 - label index = readLabel(IStringStream(line.substr(8,16))()); - scalar x = parseNASCoord(line.substr(40, 16)); - scalar y = parseNASCoord(line.substr(56, 16)); + label index = readLabel(line.substr(8,16)); + scalar x = readNasScalar(line.substr(40, 16)); + scalar y = readNasScalar(line.substr(56, 16)); is.getLine(line); if (line[0] != '*') @@ -153,7 +153,7 @@ bool Foam::fileFormats::NASedgeFormat::read << "File:" << is.name() << " line:" << is.lineNumber() << exit(FatalError); } - scalar z = parseNASCoord(line.substr(8, 16)); + scalar z = readNasScalar(line.substr(8, 16)); pointId.append(index); dynPoints.append(point(x, y, z)); diff --git a/src/surfMesh/surfaceFormats/nas/NASsurfaceFormat.C b/src/surfMesh/surfaceFormats/nas/NASsurfaceFormat.C index ab37ac9a90..a7ec90fc4d 100644 --- a/src/surfMesh/surfaceFormats/nas/NASsurfaceFormat.C +++ b/src/surfMesh/surfaceFormats/nas/NASsurfaceFormat.C @@ -92,9 +92,9 @@ bool Foam::fileFormats::NASsurfaceFormat::read // ANSA extension if (line.startsWith("$ANSA_NAME")) { - string::size_type sem0 = line.find(';', 0); - string::size_type sem1 = line.find(';', sem0+1); - string::size_type sem2 = line.find(';', sem1+1); + const auto sem0 = line.find(';', 0); + const auto sem1 = line.find(';', sem0+1); + const auto sem2 = line.find(';', sem1+1); if ( @@ -103,10 +103,7 @@ bool Foam::fileFormats::NASsurfaceFormat::read && sem2 != string::npos ) { - ansaId = readLabel - ( - IStringStream(line.substr(sem0+1, sem1-sem0-1))() - ); + ansaId = readLabel(line.substr(sem0+1, sem1-sem0-1)); ansaType = line.substr(sem1+1, sem2-sem1-1); string rawName; @@ -125,11 +122,7 @@ bool Foam::fileFormats::NASsurfaceFormat::read // $HMNAME COMP 1"partName" if (line.startsWith("$HMNAME COMP") && line.find('"') != string::npos) { - label groupId = readLabel - ( - IStringStream(line.substr(16, 16))() - ); - + label groupId = readLabel(line.substr(16, 16)); IStringStream lineStream(line.substr(32)); string rawName; @@ -177,10 +170,10 @@ bool Foam::fileFormats::NASsurfaceFormat::read if (cmd == "CTRIA3") { - label groupId = readLabel(IStringStream(line.substr(16,8))()); - label a = readLabel(IStringStream(line.substr(24,8))()); - label b = readLabel(IStringStream(line.substr(32,8))()); - label c = readLabel(IStringStream(line.substr(40,8))()); + label groupId = readLabel(line.substr(16,8)); + label a = readLabel(line.substr(24,8)); + label b = readLabel(line.substr(32,8)); + label c = readLabel(line.substr(40,8)); // Convert groupID into zoneId Map