diff --git a/applications/test/argList/Make/files b/applications/test/argList/Make/files
new file mode 100644
index 0000000000..f1d558cc1c
--- /dev/null
+++ b/applications/test/argList/Make/files
@@ -0,0 +1,3 @@
+Test-argList.C
+
+EXE = $(FOAM_USER_APPBIN)/Test-argList
diff --git a/applications/test/argList/Make/options b/applications/test/argList/Make/options
new file mode 100644
index 0000000000..6a9e9810b3
--- /dev/null
+++ b/applications/test/argList/Make/options
@@ -0,0 +1,2 @@
+/* EXE_INC = -I$(LIB_SRC)/cfdTools/include */
+/* EXE_LIBS = -lfiniteVolume */
diff --git a/applications/test/argList/Test-argList.C b/applications/test/argList/Test-argList.C
new file mode 100644
index 0000000000..50763f15af
--- /dev/null
+++ b/applications/test/argList/Test-argList.C
@@ -0,0 +1,80 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#include "argList.H"
+#include "IOstreams.H"
+#include "StringStream.H"
+
+using namespace Foam;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+// Main program:
+
+int main(int argc, char *argv[])
+{
+ argList::noBanner();
+ argList::noParallel();
+ argList::noFunctionObjects();
+ argList::removeOption("case");
+
+ argList::addOption("label", "value", "Test parsing of label");
+ argList::addOption("scalar", "value", "Test parsing of scalar");
+
+ argList args(argc, argv);
+
+ label ival;
+ scalar sval;
+
+ Info<< nl;
+
+ Info<< "-label = " << flush;
+ if (args.optionReadIfPresent("label", ival))
+ {
+ Info<< ival << endl;
+ }
+ else
+ {
+ Info<< "not specified" << endl;
+ }
+
+ Info<< "-scalar = " << flush;
+ if (args.optionReadIfPresent("scalar", sval))
+ {
+ Info<< sval << endl;
+ }
+ else
+ {
+ Info<< "not specified" << endl;
+ }
+
+ Info<< "\nEnd\n" << endl;
+
+ return 0;
+}
+
+
+// ************************************************************************* //
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/applications/utilities/mesh/conversion/plot3dToFoam/plot3dToFoam.C b/applications/utilities/mesh/conversion/plot3dToFoam/plot3dToFoam.C
index e4b5e8b4e8..cc24941602 100644
--- a/applications/utilities/mesh/conversion/plot3dToFoam/plot3dToFoam.C
+++ b/applications/utilities/mesh/conversion/plot3dToFoam/plot3dToFoam.C
@@ -93,8 +93,8 @@ int main(int argc, char *argv[])
const scalar scaleFactor = args.optionLookupOrDefault("scale", 1.0);
- bool readBlank = !args.optionFound("noBlank");
- bool singleBlock = args.optionFound("singleBlock");
+ const bool readBlank = !args.optionFound("noBlank");
+ const bool singleBlock = args.optionFound("singleBlock");
scalar twoDThickness = -1;
if (args.optionReadIfPresent("2D", twoDThickness))
{
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/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/global/argList/argList.H b/src/OpenFOAM/global/argList/argList.H
index b60cd9fa13..cba9bb009f 100644
--- a/src/OpenFOAM/global/argList/argList.H
+++ b/src/OpenFOAM/global/argList/argList.H
@@ -281,10 +281,10 @@ public:
inline T argRead(const label index) const;
//- Return options
- inline const Foam::HashTable& options() const;
+ inline const HashTable& options() const;
//- Return non-const access to options
- inline Foam::HashTable& options();
+ inline HashTable& options();
//- Return the argument string associated with the named option
inline const string& option(const word& opt) const;
@@ -302,7 +302,7 @@ public:
//- Read a value from the named option if present.
// Return true if the named option was found.
template
- inline bool optionReadIfPresent(const word& opt, T&) const;
+ inline bool optionReadIfPresent(const word& opt, T& val) const;
//- Read a value from the named option if present.
// Return true if the named option was found, otherwise
@@ -311,7 +311,7 @@ public:
inline bool optionReadIfPresent
(
const word& opt,
- T&,
+ T& val,
const T& deflt
) const;
@@ -328,7 +328,7 @@ public:
template
List optionReadList(const word& opt) const
{
- return readList(optionLookup(opt)());
+ return Foam::readList(optionLookup(opt)());
}
@@ -369,7 +369,7 @@ public:
//- Add extra notes for the usage information
// This string is used "as-is" without additional formatting
- static void addNote(const string&);
+ static void addNote(const string& note);
//- Remove option from validOptions and from optionUsage
static void removeOption(const word& opt);
diff --git a/src/OpenFOAM/global/argList/argListI.H b/src/OpenFOAM/global/argList/argListI.H
index 28caff6acb..4f1b5fdf8d 100644
--- a/src/OpenFOAM/global/argList/argListI.H
+++ b/src/OpenFOAM/global/argList/argListI.H
@@ -127,53 +127,84 @@ inline Foam::IStringStream Foam::argList::optionLookup(const word& opt) const
namespace Foam
{
- // Template specialization for string
+ //
+ // Specializations for argRead
+ //
+
template<>
inline Foam::string
- Foam::argList::argRead(const label index) const
+ argList::argRead(const label index) const
{
return args_[index];
}
- // Template specialization for word
template<>
inline Foam::word
- Foam::argList::argRead(const label index) const
+ argList::argRead(const label index) const
{
return args_[index];
}
- // Template specialization for fileName
template<>
inline Foam::fileName
- Foam::argList::argRead(const label index) const
+ argList::argRead(const label index) const
{
return args_[index];
}
- // Template specialization for string
+ template<>
+ inline Foam::label
+ argList::argRead(const label index) const
+ {
+ return Foam::readLabel(args_[index]);
+ }
+
+ template<>
+ inline Foam::scalar
+ argList::argRead(const label index) const
+ {
+ return Foam::readScalar(args_[index]);
+ }
+
+ //
+ // Specializations for optionRead
+ //
+
template<>
inline Foam::string
- Foam::argList::optionRead(const word& opt) const
+ argList::optionRead(const word& opt) const
{
return options_[opt];
}
- // Template specialization for word
template<>
inline Foam::word
- Foam::argList::optionRead(const word& opt) const
+ argList::optionRead(const word& opt) const
{
return options_[opt];
}
- // Template specialization for fileName
template<>
inline Foam::fileName
- Foam::argList::optionRead(const word& opt) const
+ argList::optionRead(const word& opt) const
{
return options_[opt];
}
+
+ template<>
+ inline Foam::label
+ argList::optionRead(const word& opt) const
+ {
+ return Foam::readLabel(options_[opt]);
+ }
+
+ template<>
+ inline Foam::scalar
+ argList::optionRead(const word& opt) const
+ {
+ return Foam::readScalar(options_[opt]);
+ }
+
}
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/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/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/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
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