Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Development
openfoam
Commits
d318a630
Commit
d318a630
authored
May 28, 2018
by
Mark OLESEN
Browse files
ENH: add directive '#sinclude' (or '#includeIfPresent' as long name)
- consistency with make and more succinct. - reduce code duplication in findEtcFiles.
parent
e3bb7ffd
Changes
13
Hide whitespace changes
Inline
Side-by-side
applications/test/dictionary/testDict
View file @
d318a630
...
...
@@ -14,8 +14,8 @@ FoamFile
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include
IfPresent
"someUnknownFile"
#include
IfPresent
"$FOAM_CASE/someUnknownFile"
#
s
include
"someUnknownFile"
#
s
include
"$FOAM_CASE/someUnknownFile"
#includeIfPresent "$FOAM_CASE/someUnknownFile-$FOAM_CASENAME"
internalField uniform 1;
...
...
applications/utilities/miscellaneous/foamDictionary/foamDictionary.C
View file @
d318a630
...
...
@@ -59,7 +59,7 @@ Usage
the resulting dictionary to standard output.
- \par -includes
List the \c \#include and \c \#include
IfPresent
files to standard output
List the \c \#include and \c \#
s
include files to standard output
- \par -disableFunctionEntries
Do not expand macros or directives (\#include etc)
...
...
@@ -307,7 +307,7 @@ int main(int argc, char *argv[])
argList
::
addBoolOption
(
"includes"
,
"List the #include/#include
IfPresent
files to standard output"
"List the #include/#
s
include files to standard output"
);
argList
::
addBoolOption
(
...
...
src/OpenFOAM/Make/files
View file @
d318a630
...
...
@@ -231,7 +231,6 @@ $(functionEntries)/functionEntry/functionEntry.C
$(functionEntries)/includeEntry/includeEntry.C
$(functionEntries)/includeEtcEntry/includeEtcEntry.C
$(functionEntries)/includeFuncEntry/includeFuncEntry.C
$(functionEntries)/includeIfPresentEntry/includeIfPresentEntry.C
$(functionEntries)/inputMode/inputMode.C
$(functionEntries)/removeEntry/removeEntry.C
...
...
src/OpenFOAM/db/dictionary/functionEntries/README
View file @
d318a630
...
...
@@ -10,8 +10,9 @@
#remove | dict | keyType or List<keyType>
| |
#include | dict/primitive | string
#include
Etc
| dict/primitive | string
#
s
include
| dict/primitive | string
#includeIfPresent | dict/primitive | string
#includeEtc | dict/primitive | string
#includeFunc | dict | word
| |
#calc | dict/primitive | string
...
...
@@ -27,4 +28,4 @@ Pending future extensions
#undef | dict | keyType or List<keyType>
201
7-11
-2
6
201
8-05
-2
8
src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C
View file @
d318a630
...
...
@@ -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) 2018 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
...
...
@@ -57,9 +57,47 @@ namespace functionEntries
primitiveEntryIstream
,
include
);
addNamedToMemberFunctionSelectionTable
(
functionEntry
,
sincludeEntry
,
execute
,
dictionaryIstream
,
sinclude
);
addNamedToMemberFunctionSelectionTable
(
functionEntry
,
sincludeEntry
,
execute
,
primitiveEntryIstream
,
sinclude
);
// Compat 1712 and earlier
addNamedToMemberFunctionSelectionTable
(
functionEntry
,
sincludeEntry
,
execute
,
dictionaryIstream
,
includeIfPresent
);
addNamedToMemberFunctionSelectionTable
(
functionEntry
,
sincludeEntry
,
execute
,
primitiveEntryIstream
,
includeIfPresent
);
}
}
// * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * //
Foam
::
fileName
Foam
::
functionEntries
::
includeEntry
::
resolveFile
...
...
@@ -97,7 +135,7 @@ bool Foam::functionEntries::includeEntry::execute
const
fileName
fName
(
resolveFile
(
is
.
name
().
path
(),
rawName
,
parentDict
));
autoPtr
<
ISstream
>
ifsPtr
(
fileHandler
().
NewIFstream
(
fName
));
ISstream
&
ifs
=
ifsPtr
()
;
auto
&
ifs
=
*
ifsPtr
;
if
(
ifs
)
{
...
...
@@ -144,7 +182,7 @@ bool Foam::functionEntries::includeEntry::execute
const
fileName
fName
(
resolveFile
(
is
.
name
().
path
(),
rawName
,
parentDict
));
autoPtr
<
ISstream
>
ifsPtr
(
fileHandler
().
NewIFstream
(
fName
));
ISstream
&
ifs
=
ifsPtr
()
;
auto
&
ifs
=
*
ifsPtr
;
if
(
ifs
)
{
...
...
@@ -180,4 +218,79 @@ bool Foam::functionEntries::includeEntry::execute
}
bool
Foam
::
functionEntries
::
sincludeEntry
::
execute
(
dictionary
&
parentDict
,
Istream
&
is
)
{
const
fileName
rawName
(
is
);
const
fileName
fName
(
resolveFile
(
is
.
name
().
path
(),
rawName
,
parentDict
));
autoPtr
<
ISstream
>
ifsPtr
(
fileHandler
().
NewIFstream
(
fName
));
auto
&
ifs
=
*
ifsPtr
;
if
(
ifs
)
{
if
(
Foam
::
functionEntries
::
includeEntry
::
log
)
{
Info
<<
fName
<<
endl
;
}
// Add watch on included file
const
dictionary
&
top
=
parentDict
.
topDict
();
if
(
isA
<
regIOobject
>
(
top
))
{
regIOobject
&
rio
=
const_cast
<
regIOobject
&>
(
dynamic_cast
<
const
regIOobject
&>
(
top
)
);
rio
.
addWatch
(
fName
);
}
parentDict
.
read
(
ifs
);
}
return
true
;
// Never fails
}
bool
Foam
::
functionEntries
::
sincludeEntry
::
execute
(
const
dictionary
&
parentDict
,
primitiveEntry
&
entry
,
Istream
&
is
)
{
const
fileName
rawName
(
is
);
const
fileName
fName
(
resolveFile
(
is
.
name
().
path
(),
rawName
,
parentDict
));
autoPtr
<
ISstream
>
ifsPtr
(
fileHandler
().
NewIFstream
(
fName
));
auto
&
ifs
=
*
ifsPtr
;
if
(
ifs
)
{
if
(
Foam
::
functionEntries
::
includeEntry
::
log
)
{
Info
<<
fName
<<
endl
;
}
// Add watch on included file
const
dictionary
&
top
=
parentDict
.
topDict
();
if
(
isA
<
regIOobject
>
(
top
))
{
regIOobject
&
rio
=
const_cast
<
regIOobject
&>
(
dynamic_cast
<
const
regIOobject
&>
(
top
)
);
rio
.
addWatch
(
fName
);
}
entry
.
read
(
parentDict
,
ifs
);
}
return
true
;
// Never fails
}
// ************************************************************************* //
src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.H
View file @
d318a630
...
...
@@ -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) 2018 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
...
...
@@ -25,19 +25,25 @@ Class
Foam::functionEntries::includeEntry
Description
Specify an include file when reading dictionaries, expects a
single string
to follow.
A dictionary directive for including a file, expects a single string
to follow.
An example of the \c \#include directive:
An example of the \c \#include directive
to include a file
:
\verbatim
#include "includeFile"
#include "includeFile
MustExist
"
\endverbatim
The usual expansion of environment variables and other constructs
(eg, the \c ~OpenFOAM/ expansion) is retained.
An example of the \c \#sinclude directive to conditionally include a file
when it exists.
\verbatim
#sinclude "includeFileCanBeMissing"
\endverbatim
The usual expansion of environment variables and other expansions
(eg, a leading "<case>/", "<system>/", "<etc>/", ...) are retained.
See also
fileName, string::expand()
fileName, string::expand()
, functionEntries::sincludeEntry
SourceFiles
includeEntry.C
...
...
@@ -97,7 +103,35 @@ public:
primitiveEntry
&
entry
,
Istream
&
is
);
};
/*---------------------------------------------------------------------------*\
Class sincludeEntry Declaration
\*---------------------------------------------------------------------------*/
//- A dictionary directive for conditionally including a file,
//- expects a single string to follow.
//
// The \c \#sinclude directive (and the \c \#includeIfPresent alias) behaves
// identically to the \c \#include directive, but does not generate an error
// if the file does not exist.
class
sincludeEntry
:
public
includeEntry
{
public:
//- Include file (if it exists) in a sub-dict context
static
bool
execute
(
dictionary
&
parentDict
,
Istream
&
is
);
//- Include file (if it exists) in a primitiveEntry context
static
bool
execute
(
const
dictionary
&
parentDict
,
primitiveEntry
&
entry
,
Istream
&
is
);
};
...
...
src/OpenFOAM/db/dictionary/functionEntries/includeEtcEntry/includeEtcEntry.C
View file @
d318a630
...
...
@@ -96,7 +96,7 @@ bool Foam::functionEntries::includeEtcEntry::execute
const
fileName
fName
(
resolveEtcFile
(
rawName
,
parentDict
));
autoPtr
<
ISstream
>
ifsPtr
(
fileHandler
().
NewIFstream
(
fName
));
ISstream
&
ifs
=
ifsPtr
()
;
auto
&
ifs
=
*
ifsPtr
;
if
(
ifs
)
{
...
...
@@ -131,7 +131,7 @@ bool Foam::functionEntries::includeEtcEntry::execute
const
fileName
fName
(
resolveEtcFile
(
rawName
,
parentDict
));
autoPtr
<
ISstream
>
ifsPtr
(
fileHandler
().
NewIFstream
(
fName
));
ISstream
&
ifs
=
ifsPtr
()
;
auto
&
ifs
=
*
ifsPtr
;
if
(
ifs
)
{
...
...
src/OpenFOAM/db/dictionary/functionEntries/includeEtcEntry/includeEtcEntry.H
View file @
d318a630
...
...
@@ -25,6 +25,9 @@ Class
Foam::functionEntries::includeEtcEntry
Description
A dictionary directive for including a file found using the findEtcFile()
mechanism.
Specify an etc file to include when reading dictionaries, expects a
single string to follow.
...
...
src/OpenFOAM/db/dictionary/functionEntries/includeIfPresentEntry/includeIfPresentEntry.C
deleted
100644 → 0
View file @
e3bb7ffd
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
\\/ 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
"includeIfPresentEntry.H"
#include
"dictionary.H"
#include
"IFstream.H"
#include
"regIOobject.H"
#include
"addToMemberFunctionSelectionTable.H"
#include
"fileOperation.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace
Foam
{
namespace
functionEntries
{
addNamedToMemberFunctionSelectionTable
(
functionEntry
,
includeIfPresentEntry
,
execute
,
dictionaryIstream
,
includeIfPresent
);
addNamedToMemberFunctionSelectionTable
(
functionEntry
,
includeIfPresentEntry
,
execute
,
primitiveEntryIstream
,
includeIfPresent
);
}
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool
Foam
::
functionEntries
::
includeIfPresentEntry
::
execute
(
dictionary
&
parentDict
,
Istream
&
is
)
{
const
fileName
rawName
(
is
);
const
fileName
fName
(
resolveFile
(
is
.
name
().
path
(),
rawName
,
parentDict
));
autoPtr
<
ISstream
>
ifsPtr
(
fileHandler
().
NewIFstream
(
fName
));
ISstream
&
ifs
=
ifsPtr
();
if
(
ifs
)
{
if
(
Foam
::
functionEntries
::
includeEntry
::
log
)
{
Info
<<
fName
<<
endl
;
}
// Add watch on included file
const
dictionary
&
top
=
parentDict
.
topDict
();
if
(
isA
<
regIOobject
>
(
top
))
{
regIOobject
&
rio
=
const_cast
<
regIOobject
&>
(
dynamic_cast
<
const
regIOobject
&>
(
top
)
);
rio
.
addWatch
(
fName
);
}
parentDict
.
read
(
ifs
);
}
return
true
;
}
bool
Foam
::
functionEntries
::
includeIfPresentEntry
::
execute
(
const
dictionary
&
parentDict
,
primitiveEntry
&
entry
,
Istream
&
is
)
{
const
fileName
rawName
(
is
);
const
fileName
fName
(
resolveFile
(
is
.
name
().
path
(),
rawName
,
parentDict
));
autoPtr
<
ISstream
>
ifsPtr
(
fileHandler
().
NewIFstream
(
fName
));
ISstream
&
ifs
=
ifsPtr
();
if
(
ifs
)
{
if
(
Foam
::
functionEntries
::
includeEntry
::
log
)
{
Info
<<
fName
<<
endl
;
}
// Add watch on included file
const
dictionary
&
top
=
parentDict
.
topDict
();
if
(
isA
<
regIOobject
>
(
top
))
{
regIOobject
&
rio
=
const_cast
<
regIOobject
&>
(
dynamic_cast
<
const
regIOobject
&>
(
top
)
);
rio
.
addWatch
(
fName
);
}
entry
.
read
(
parentDict
,
ifs
);
}
return
true
;
}
// ************************************************************************* //
src/OpenFOAM/db/dictionary/functionEntries/includeIfPresentEntry/includeIfPresentEntry.H
deleted
100644 → 0
View file @
e3bb7ffd
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ 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/>.
Class
Foam::functionEntries::includeIfPresentEntry
Description
Specify a file to include if it exists. Expects a single string to follow.
The \c \#includeIfPresent directive is similar to the \c \#include
directive, but does not generate an error if the file does not exist.
See also
Foam::functionEntries::includeEntry
SourceFiles
includeIfPresentEntry.C
\*---------------------------------------------------------------------------*/
#ifndef includeIfPresentEntry_H
#define includeIfPresentEntry_H
#include
"includeEntry.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace
Foam
{
namespace
functionEntries
{
/*---------------------------------------------------------------------------*\
Class includeIfPresentEntry Declaration
\*---------------------------------------------------------------------------*/
class
includeIfPresentEntry
:
public
includeEntry
{
public:
//- Include (if present) in a sub-dict context
static
bool
execute
(
dictionary
&
parentDict
,
Istream
&
is
);
//- Include (if present) in a primitiveEntry context
static
bool
execute
(
const
dictionary
&
parentDict
,
primitiveEntry
&
entry
,
Istream
&
is
);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
}
// End namespace functionEntries
}
// End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //
src/OpenFOAM/global/etcFiles/etcFiles.C
View file @
d318a630
...
...
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
\\/ M anipulation | Copyright (C) 2017
-2018
OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
...
...
@@ -32,8 +32,10 @@ License
//
// These could be exposed too (if required), but are fairly special purpose.
//
//! \cond fileScope
//
namespace
{
// Assign 'queried' parameter to the user resource directory.
// Return true if this directory exists.
//
...
...
@@ -62,9 +64,15 @@ static inline bool groupResourceDir(Foam::fileName& queried)
return
Foam
::
isDir
(
queried
);
}
//
Fallback (w
hen WM_PROJECT_SITE is unset
)
//
W
hen WM_PROJECT_SITE is unset
:
queried
=
Foam
::
getEnv
(
"WM_PROJECT_INST_DIR"
)
/
"site"
;
return
(
queried
.
size
()
>
5
&&
Foam
::
isDir
(
queried
));
return
(
queried
.
size
()
>
4
&&
Foam
::
isDir
(
queried
));
// NOTE: this alternative bit of code corresponds to how we patch things
// for spack (and EasyBuild?) to avoid leaking out to the parent directory
//
// queried = Foam::getEnv("WM_PROJECT_DIR")/"site";
// return (queried.size() > 4 && Foam::isDir(queried));
}
...
...
@@ -77,170 +85,124 @@ static inline bool groupResourceDir(Foam::fileName& queried)
static
inline
bool
projectResourceDir
(
Foam
::
fileName
&
queried
)
{
queried
=
Foam
::
getEnv
(
"WM_PROJECT_DIR"
)
/
"etc"
;
return
(
queried
.
size
()
>
4
&&
Foam
::
isDir
(
queried
));
return
(
queried
.
size
()
>
3
&&
Foam
::
isDir
(
queried
));
}
//! \endcond
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Foam
::
fileNameList
Foam
::
findEtcDirs
Foam
::
fileNameList
searchEtc
(
const
fileName
&
name
,
const
bool
findFirst
const
Foam
::
fileName
&
name
,
const
bool
findFirst
,
bool
(
*
accept
)(
const
Foam
::
fileName
&
)
)
{