messageDirective.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) 2021 OpenCFD Ltd.
9 -------------------------------------------------------------------------------
10 License
11  This file is part of OpenFOAM.
12 
13  OpenFOAM is free software: you can redistribute it and/or modify it
14  under the terms of the GNU General Public License as published by
15  the Free Software Foundation, either version 3 of the License, or
16  (at your option) any later version.
17 
18  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21  for more details.
22 
23  You should have received a copy of the GNU General Public License
24  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25 
26 \*---------------------------------------------------------------------------*/
27 
28 #include "messageDirective.H"
29 #include "dictionary.H"
30 #include "stringOps.H"
32 
33 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
34 
35 namespace Foam
36 {
37 namespace functionEntries
38 {
40  (
41  functionEntry,
42  messageDirective,
43  execute,
44  dictionaryIstream,
45  message
46  );
47 
49  (
50  functionEntry,
51  messageDirective,
52  execute,
53  primitiveEntryIstream,
54  message
55  );
56 
57 } // End namespace functionEntry
58 } // End namespace Foam
59 
60 
61 // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
62 
63 bool Foam::functionEntries::messageDirective::evaluate
64 (
65  const dictionary& parentDict,
66  Istream& is
67 )
68 {
69  token tok(is);
70 
71  // The string to evaluate
72  string str;
73 
74  if (tok.isStringType()) // Also accepts a single bare word
75  {
76  // - #message expr
77  // - #message "expr"
78  // - #message #{ expr #}
79  str = tok.stringToken();
80  }
81  else if (tok.isPunctuation(token::BEGIN_BLOCK))
82  {
83  // - #message { expr }
84  // strip comments
85  if (!continueReadUntilRightBrace(is, str, true))
86  {
88  (
89  is,
90  "Premature end while reading #message - missing '}'?"
91  );
92  }
93  }
94  else
95  {
97  << "Invalid input for #message."
98  " Expecting a string or block to expand, but found" << nl
99  << tok.info() << endl
100  << exit(FatalIOError);
101  }
102 
103  stringOps::inplaceExpand(str, parentDict);
105 
106  if (!str.empty() && error::master())
107  {
108  // Use stderr directly, in case message should be part of startup
109  std::cerr
110  << str << " (file: \""
111  << parentDict.relativeName() << "\" line: "
112  << tok.lineNumber() << ")\n" << std::flush;
113  }
114 
115  return true;
116 }
117 
118 
119 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
120 
122 (
123  dictionary& parentDict,
124  Istream& is
125 )
126 {
127  evaluate(parentDict, is);
128 
129  return true;
130 }
131 
132 
134 (
135  const dictionary& parentDict,
137  Istream& is
138 )
139 {
140  evaluate(parentDict, is);
141 
142  return true;
143 }
144 
145 // ************************************************************************* //
Begin block [isseparator].
Definition: token.H:165
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:125
A list of keyword definitions, which are a keyword followed by a number of values (eg...
Definition: dictionary.H:129
An Istream is an abstract base class for all input systems (streams, files, token lists etc)...
Definition: Istream.H:57
constexpr char nl
The newline &#39;\n&#39; character (0x0a)
Definition: Ostream.H:50
void inplaceTrim(std::string &s)
Trim leading and trailing whitespace inplace.
Definition: stringOps.C:1054
static bool continueReadUntilRightBrace(Istream &is, std::string &str, const bool stripComments=true)
Slurp a string until a closing &#39;}&#39; is found.
Definition: functionEntry.C:59
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:531
A keyword and a list of tokens comprise a primitiveEntry. A primitiveEntry can be read...
static void reportReadWarning(const IOstream &, const std::string &)
Report a read warning (on std::cerr)
Definition: entry.C:41
static bool master(const label communicator=-1)
Like Pstream::master but with a Pstream::parRun guard in case Pstream has not yet been initialised...
Definition: error.C:53
string evaluate(label fieldWidth, const std::string &s, size_t pos=0, size_t len=std::string::npos)
String evaluation with specified (positive, non-zero) field width.
void inplaceExpand(std::string &s, const HashTable< string > &mapping, const char sigil='$')
Inplace expand occurrences of variables according to the mapping. Does not use environment values...
Definition: stringOps.C:718
Ostream & flush(Ostream &os)
Flush stream.
Definition: Ostream.H:521
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
Definition: error.H:627
Macros for easy insertion into member function selection tables.
addNamedToMemberFunctionSelectionTable(functionEntry, calcEntry, execute, dictionaryIstream, calc)
static bool execute(const dictionary &parentDict, primitiveEntry &entry, Istream &is)
Execute in a primitiveEntry context.
Namespace for OpenFOAM.
A keyword and a list of tokens is an &#39;entry&#39;.
Definition: entry.H:63
IOerror FatalIOError
Error stream (stdout output on all processes), with additional &#39;FOAM FATAL IO ERROR&#39; header text and ...