Commit ec5d9cdf authored by mattijs's avatar mattijs
Browse files

Merge remote-tracking branch 'origin/develop' into develop-pre-release

parents d703f09d 14e9ef34
......@@ -14,8 +14,8 @@ FoamFile
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#includeIfPresent "someUnknownFile"
#includeIfPresent "$FOAM_CASE/someUnknownFile"
#sinclude "someUnknownFile"
#sinclude "$FOAM_CASE/someUnknownFile"
#includeIfPresent "$FOAM_CASE/someUnknownFile-$FOAM_CASENAME"
internalField uniform 1;
......
......@@ -59,7 +59,7 @@ Usage
the resulting dictionary to standard output.
- \par -includes
List the \c \#include and \c \#includeIfPresent files to standard output
List the \c \#include and \c \#sinclude 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/#includeIfPresent files to standard output"
"List the #include/#sinclude files to standard output"
);
argList::addBoolOption
(
......
......@@ -49,6 +49,11 @@ alias util 'cd $FOAM_UTILITIES'
alias tut 'cd $FOAM_TUTORIALS'
alias run 'cd $FOAM_RUN'
alias ufoam 'cd $WM_PROJECT_USER_DIR'
alias uapp 'cd $WM_PROJECT_USER_DIR/applications'
alias usol 'cd $WM_PROJECT_USER_DIR/applications/solvers'
alias uutil 'cd $WM_PROJECT_USER_DIR/applications/utilities'
# Refresh the environment
# ~~~~~~~~~~~~~~~~~~~~~~~
......
......@@ -175,6 +175,11 @@ unalias util
unalias tut
unalias run
unalias ufoam
unalias uapp
unalias usol
unalias uutil
unalias wmRefresh
unalias foamVersion
unalias foamPV
......
......@@ -47,6 +47,11 @@ alias util='cd $FOAM_UTILITIES'
alias tut='cd $FOAM_TUTORIALS'
alias run='cd $FOAM_RUN'
alias ufoam='cd $WM_PROJECT_USER_DIR'
alias uapp='cd $WM_PROJECT_USER_DIR/applications'
alias usol='cd $WM_PROJECT_USER_DIR/applications/solvers'
alias uutil='cd $WM_PROJECT_USER_DIR/applications/utilities'
# Refresh the environment
# ~~~~~~~~~~~~~~~~~~~~~~~
......@@ -106,4 +111,22 @@ foamPV()
}
# OpenFOAM working directory with basic env replacements
# ~~~~~~~~~~~~~~~~~~~~~~~~~~
unset -f foamPwd 2>/dev/null
foamPwd()
{
if [ -d "$WM_PROJECT_DIR" ]
then
echo $PWD | sed \
-e "s#^${FOAM_RUN}#\$FOAM_RUN#;" \
-e "s#^${WM_PROJECT_DIR}#\$WM_PROJECT_DIR#;" \
-e "s#^${WM_PROJECT_USER_DIR}#\$WM_PROJECT_USER_DIR#;" \
-e "s#^${HOME}#\$HOME#";
else
echo $PWD | sed -e "s#^${HOME}#\$HOME#;"
fi
}
#------------------------------------------------------------------------------
......@@ -170,10 +170,19 @@ unalias util 2>/dev/null
unalias tut 2>/dev/null
unalias run 2>/dev/null
unalias ufoam 2>/dev/null
unalias uapp 2>/dev/null
unalias usol 2>/dev/null
unalias uutil 2>/dev/null
unset -f wmRefresh 2>/dev/null
unset -f foamPwd 2>/dev/null
unset -f foamVersion 2>/dev/null
unset -f foamPV 2>/dev/null
# NB: no good way to remove foamPwd reference in PS1.
# Remove old completions, which look like
# "complete ... -F _of_complete_ APPNAME
# For economy, obtain list first
......
......@@ -50,7 +50,7 @@ string pOpen(const string& cmd, label line=0)
char *buf = nullptr;
// Read line number of lines
for (label cnt = 0; cnt <= line; cnt++)
for (label cnt = 0; cnt <= line; ++cnt)
{
size_t linecap = 0;
ssize_t linelen = ::getline(&buf, &linecap, cmdPipe);
......@@ -96,6 +96,14 @@ inline word addressToWord(const uintptr_t addr)
}
inline string& shorterPath(string& s)
{
s.replace(cwd() + '/', "");
s.replace(home(), "~");
return s;
}
void printSourceFileAndLine
(
Ostream& os,
......@@ -132,14 +140,12 @@ void printSourceFileAndLine
}
else if (line == "??:0")
{
os << " in " << filename;
line = filename;
os << " in " << shorterPath(line).c_str();
}
else
{
string cwdLine(line.replaceAll(cwd() + '/', ""));
string homeLine(cwdLine.replaceAll(home(), "~"));
os << " at " << homeLine.c_str();
os << " at " << shorterPath(line).c_str();
}
}
}
......@@ -202,7 +208,7 @@ void Foam::error::safePrintStack(std::ostream& os)
// See if they contain function between () e.g. "(__libc_start_main+0xd0)"
// and see if cplus_demangle can make sense of part before +
for (size_t i = 0; i < size; i++)
for (size_t i = 0; i < size; ++i)
{
string msg(strings[i]);
fileName programFile;
......@@ -226,7 +232,7 @@ void Foam::error::printStack(Ostream& os)
fileName fname = "???";
word address;
for(size_t i=0; i<size; i++)
for (size_t i=0; i<size; ++i)
{
int st = dladdr(callstack[i], info);
......
......@@ -233,7 +233,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
......
......@@ -10,8 +10,9 @@
#remove | dict | keyType or List<keyType>
| |
#include | dict/primitive | string
#includeEtc | dict/primitive | string
#sinclude | 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>
2017-11-26
2018-05-28
......@@ -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
}
// ************************************************************************* //
......@@ -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 "includeFileMustExist"
\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
);
};
......
......@@ -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)
{
......
......@@ -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.
......
/*---------------------------------------------------------------------------*\
========= |
\\ / 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;
}
// ************************************************************************* //
/*---------------------------------------------------------------------------*\
========= |
\\ / 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