Loading...
Searching...
No Matches
int64IO.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2014-2016,2024 OpenFOAM Foundation
9 Copyright (C) 2017-2021 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
12 This file is part of OpenFOAM.
13
14 OpenFOAM is free software: you can redistribute it and/or modify it
15 under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
18
19 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26
27\*---------------------------------------------------------------------------*/
28
29#include "int64.H"
30#include "error.H"
31#include "parsing.H"
32#include "IOstreams.H"
33#include <cinttypes>
34#include <cmath>
35
36// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
37
38int64_t Foam::readInt64(const char* buf)
39{
40 char *endptr = nullptr;
41 errno = 0;
42 const intmax_t parsed = ::strtoimax(buf, &endptr, 10);
43
44 const int64_t val = int64_t(parsed);
45
46 const parsing::errorType err =
47 (
48 (parsed < INT64_MIN || parsed > INT64_MAX)
50 : parsing::checkConversion(buf, endptr)
51 );
52
53 if (err != parsing::errorType::NONE)
54 {
55 FatalIOErrorInFunction("unknown")
56 << parsing::errorNames[err] << " '" << buf << "'"
58 }
59
60 return val;
61}
62
63
64bool Foam::readInt64(const char* buf, int64_t& val)
65{
66 char *endptr = nullptr;
67 errno = 0;
68 const intmax_t parsed = ::strtoimax(buf, &endptr, 10);
69
70 val = int64_t(parsed);
71
72 return
73 (
74 (parsed < INT64_MIN || parsed > INT64_MAX)
75 ? false
77 );
78}
79
80
81int64_t Foam::readInt64(Istream& is)
82{
83 int64_t val(0);
84 is >> val;
85
86 return val;
87}
88
89
90Foam::Istream& Foam::operator>>(Istream& is, int64_t& val)
91{
92 token t(is);
93
94 if (!t.good())
95 {
97 << "Bad token - could not get int64"
98 << exit(FatalIOError);
99 is.setBad();
100 return is;
101 }
102
103 // Accept separated '-' (or '+') while expecting a number.
104 // This can arise during dictionary expansions (Eg, -$value)
105
106 char prefix = 0;
107 if (t.isPunctuation())
108 {
109 prefix = t.pToken();
110 if (prefix == token::PLUS || prefix == token::MINUS)
111 {
112 is >> t;
113 }
114 }
115
116 if (t.is_int64())
117 {
118 val = int64_t
119 (
120 (prefix == token::MINUS)
121 ? (0 - t.int64Token())
122 : t.int64Token()
123 );
124 }
125 else if (t.isScalar())
126 {
127 const scalar sval
128 (
129 (prefix == token::MINUS)
130 ? (0 - t.scalarToken())
131 : t.scalarToken()
132 );
133
134 const intmax_t parsed = intmax_t(std::round(sval));
135 val = 0 + int64_t(parsed);
136
137 // Accept integral floating-point values.
138 // Eg, from string expression evaluation (#1696)
139
140 if (parsed < INT64_MIN || parsed > INT64_MAX)
141 {
143 << "Expected integral (int64), value out-of-range "
144 << t.info()
145 << exit(FatalIOError);
146 is.setBad();
147 return is;
148 }
149 else if (1e-4 < std::abs(sval - scalar(parsed)))
150 {
152 << "Expected integral (int64), found non-integral value "
153 << t.info()
154 << exit(FatalIOError);
155 is.setBad();
156 return is;
157 }
158 }
159 else
160 {
162 << "Wrong token type - expected label (int64), found ";
163 if (prefix == token::PLUS || prefix == token::MINUS)
164 {
165 FatalIOError << '\'' << prefix << "' followed by ";
166 }
167 FatalIOError << t.info() << exit(FatalIOError);
168 is.setBad();
169 return is;
171
172 is.check(FUNCTION_NAME);
173 return is;
174}
175
176
177Foam::Ostream& Foam::operator<<(Ostream& os, const int64_t val)
178{
179 os.write(val);
180 os.check(FUNCTION_NAME);
181 return os;
182}
183
184
185#ifdef __APPLE__ // (__SIZEOF_LONG__ == 8)
186Foam::Istream& Foam::operator>>(Istream& is, long& val)
187{
188 int64_t ival;
189 is >> ival;
190 val = static_cast<long>(ival);
191 return is;
192}
193
194Foam::Ostream& Foam::operator<<(Ostream& os, const long val)
195{
196 return (os << int64_t(val));
197}
198#endif
199
200
201// ************************************************************************* //
Useful combination of include files which define Sin, Sout and Serr and the use of IO streams general...
void setBad() noexcept
Set stream state to be 'bad'.
Definition IOstream.H:488
virtual bool check(const char *operation) const
Check IOstream status for given operation.
Definition IOstream.C:45
An Istream is an abstract base class for all input systems (streams, files, token lists etc)....
Definition Istream.H:60
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition Ostream.H:59
A token holds an item read from Istream.
Definition token.H:70
bool isPunctuation() const noexcept
Token is PUNCTUATION.
Definition tokenI.H:650
bool is_int64() const noexcept
Token is INTEGER_64 or is convertible to one.
Definition tokenI.H:753
@ PLUS
Addition [isseparator].
Definition token.H:157
@ MINUS
Subtract or start of negative number.
Definition token.H:158
punctuationToken pToken() const
Return punctuation character.
Definition tokenI.H:676
bool good() const noexcept
True if token is not UNDEFINED or ERROR.
Definition tokenI.H:584
bool isScalar() const noexcept
Token is FLOAT or DOUBLE.
Definition tokenI.H:971
int64_t int64Token() const
Return int64 value, convert from other integer type or Error.
Definition tokenI.H:767
scalar scalarToken() const
Return float or double value.
Definition tokenI.H:981
InfoProxy< token > info() const noexcept
Return info proxy, for printing token information to a stream.
Definition token.H:1253
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
Definition error.H:629
OBJstream os(runTime.globalPath()/outputName)
64bit signed integer
#define FUNCTION_NAME
errorType
Enumeration for possible parsing error.
Definition parsing.H:56
@ RANGE
Range error.
Definition parsing.H:59
@ NONE
No error encountered.
Definition parsing.H:57
const Foam::Enum< errorType > errorNames
Strings corresponding to the errorType.
errorType checkConversion(const char *buf, char *endptr)
Sanity check after strtof, strtod, etc.
Definition parsingI.H:22
Ostream & operator<<(Ostream &, const boundaryPatch &p)
Write boundaryPatch as dictionary entries (without surrounding braces).
Istream & operator>>(Istream &, directionInfo &)
IOerror FatalIOError
Error stream (stdout output on all processes), with additional 'FOAM FATAL IO ERROR' header text and ...
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition errorManip.H:125
int64_t readInt64(Istream &is)
Read int64_t from stream.
Definition int64IO.C:74
volScalarField & e