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.
This commit is contained in:
Mark Olesen
2017-09-18 10:47:07 +02:00
parent 61c603f174
commit accebc74ee
35 changed files with 1310 additions and 370 deletions

View File

@ -0,0 +1,3 @@
Test-primitives.C
EXE = $(FOAM_USER_APPBIN)/Test-primitives

View File

@ -0,0 +1,5 @@
EXE_INC = \
-I$(LIB_SRC)/fileFormats/lnInclude
EXE_LIBS = \
-lfileFormats

View File

@ -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 <http://www.gnu.org/licenses/>.
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<class TYPE>
unsigned testParsing
(
TYPE (*function)(const std::string&),
const List<Tuple2<std::string, bool>>& tests
)
{
unsigned nFail = 0;
// Expect some failures
const bool prev = FatalIOError.throwExceptions();
for (const Tuple2<std::string, bool>& 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;
}
// ************************************************************************* //

View File

@ -28,7 +28,7 @@ License
#include "IFstream.H"
#include "StringStream.H"
#include <inttypes.h>
#include <cinttypes>
#include <cxxabi.h>
#include <execinfo.h>
#include <dlfcn.h>

View File

@ -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

View File

@ -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<Scalar>::rootMax = ScalarROOTVGREAT;
const char* const pTraits<Scalar>::componentNames[] = { "" };
pTraits<Scalar>::pTraits(const Scalar& p)
pTraits<Scalar>::pTraits(const Scalar& val)
:
p_(p)
p_(val)
{}
@ -54,7 +54,7 @@ pTraits<Scalar>::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;
}

View File

@ -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

View File

@ -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 <sstream>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// 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
// ************************************************************************* //

View File

@ -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

View File

@ -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 <sstream>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// 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
// ************************************************************************* //

View File

@ -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

View File

@ -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
// ************************************************************************* //

View File

@ -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

View File

@ -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);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -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 <cinttypes>
// * * * * * * * * * * * * * * * 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;

View File

@ -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<int32_t>::rootMax = pTraits<int32_t>::max;
const char* const Foam::pTraits<int32_t>::componentNames[] = { "" };
Foam::pTraits<int32_t>::pTraits(const int32_t& p)
Foam::pTraits<int32_t>::pTraits(const int32_t& val)
:
p_(p)
p_(val)
{}
Foam::pTraits<int32_t>::pTraits(Istream& is)

View File

@ -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 <http://www.gnu.org/licenses/>.
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);
}

View File

@ -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 <inttypes.h>
#include <cerrno>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
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 <cinttypes>
// * * * * * * * * * * * * * * * 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<int32_t&>(i));
return operator>>(is, reinterpret_cast<int32_t&>(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

View File

@ -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<int64_t>::rootMax = pTraits<int64_t>::max;
const char* const Foam::pTraits<int64_t>::componentNames[] = { "" };
Foam::pTraits<int64_t>::pTraits(const int64_t& p)
Foam::pTraits<int64_t>::pTraits(const int64_t& val)
:
p_(p)
p_(val)
{}
Foam::pTraits<int64_t>::pTraits(Istream& is)

View File

@ -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 <http://www.gnu.org/licenses/>.
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<int64_t>
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);
}

View File

@ -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 <inttypes.h>
#include <cerrno>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
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 <cinttypes>
// * * * * * * * * * * * * * * * 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;
}

View File

@ -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);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -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);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -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);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -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<uint32_t>::rootMax = pTraits<uint32_t>::max;
const char* const Foam::pTraits<uint32_t>::componentNames[] = { "" };
Foam::pTraits<uint32_t>::pTraits(const uint32_t& p)
Foam::pTraits<uint32_t>::pTraits(const uint32_t& val)
:
p_(p)
p_(val)
{}
Foam::pTraits<uint32_t>::pTraits(Istream& is)

View File

@ -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 <http://www.gnu.org/licenses/>.
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<uint32_t>
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

View File

@ -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 <cinttypes>
// * * * * * * * * * * * * * * * 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;
}

View File

@ -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<uint64_t>::rootMax = pTraits<uint64_t>::max;
const char* const Foam::pTraits<uint64_t>::componentNames[] = { "" };
Foam::pTraits<uint64_t>::pTraits(const uint64_t& p)
Foam::pTraits<uint64_t>::pTraits(const uint64_t& val)
:
p_(p)
p_(val)
{}
Foam::pTraits<uint64_t>::pTraits(Istream& is)

View File

@ -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 <http://www.gnu.org/licenses/>.
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<uint64_t>
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

View File

@ -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 <cinttypes>
// * * * * * * * * * * * * * * * 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;
}

View File

@ -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 <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "parsing.H"
// * * * * * * * * * * * * * * * * Global Data * * * * * * * * * * * * * * * //
const Foam::Enum<Foam::parsing::errorType>
Foam::parsing::errorNames
{
{ errorType::GENERAL, "General error parsing" },
{ errorType::TRAILING, "Trailing content found parsing" },
};
// ************************************************************************* //

View File

@ -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 <http://www.gnu.org/licenses/>.
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 <cerrno>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
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<errorType> 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
// ************************************************************************* //

View File

@ -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 <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
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;
}
// ************************************************************************* //

View File

@ -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;
}
// ************************************************************************* //

View File

@ -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