Merge branch 'olesenm'

This commit is contained in:
andy
2009-07-28 12:42:31 +01:00
14 changed files with 291 additions and 543 deletions

3
.gitignore vendored
View File

@ -42,6 +42,9 @@ SiCortex*Gcc*/
solaris*Gcc*/
SunOS*Gcc*/
# reinstate wmake/rules that might look like build folders
!wmake/rules/*/
# doxygen generated documentation
doc/[Dd]oxygen/html
doc/[Dd]oxygen/latex

View File

@ -1,13 +1,13 @@
#!/bin/sh
cd ${0%/*} || exit 1 # run from this directory
set -x
# wmake is required for subsequent targets
( cd wmake/src && make )
# build ThirdParty sources
( cd $WM_THIRD_PARTY_DIR && ./Allwmake )
$WM_THIRD_PARTY_DIR/Allwmake
# build OpenFOAM libraries and applications
src/Allwmake
applications/Allwmake

27
README
View File

@ -30,8 +30,8 @@
check whether Qt4 is installed, and the version, type:
+ qmake --version
Both 32- and 64-bit version of ParaView were compiled with Qt-4.4.3 (with
openSuSE-11.1). If the user finds that a ParaView binary fails to run, then
Both 32-bit and 64-bit version of ParaView were compiled with Qt-4.4.3 (with
openSUSE-11.1). If the user finds that a ParaView binary fails to run, then
it is almost certainly due to a conflict in compiled and installed Qt
versions and they will need to consult the section below on "Compiling
ParaView and the PV3FoamReader module."
@ -40,10 +40,10 @@
+ ubuntu-7.10: Version 4.3.2
+ ubuntu-8.04: Version 4.3.4
+ ubuntu-9.04: Version 4.5.0
+ openSuSE-10.2: Version 4.2.1 - too old
+ openSuSE-10.3: Version 4.3.1
+ openSuSE-11.0: Version 4.4.0
+ openSuSE-11.1: Version 4.4.3
+ openSUSE-10.2: Version 4.2.1 - too old
+ openSUSE-10.3: Version 4.3.1
+ openSUSE-11.0: Version 4.4.0
+ openSUSE-11.1: Version 4.4.3
Compilation and running of ParaView has been successful using the libraries
downloaded in the "libqt4-dev" package on ubuntu.
@ -51,7 +51,7 @@
If you don't have an appropriate version of Qt installed you can download
the sources from TrollTech e.g.:
ftp://ftp.trolltech.com/qt/source/qt-x11-opensource-src-4.3.5.tar.bz2
and compile and install in /usr/local or some other location that does to
and compile and install in /usr/local or some other location that does not
conflict with the pre-installed version.
* Installation
@ -112,7 +112,7 @@
which may be obtained from http://gcc.gnu.org/.
Install the compiler in
$WM_PROJECT_INST_DIR/ThirdParty/gcc-<GCC_VERSION>/platforms/$WM_ARCH$WM_COMPILER_ARCH/
$WM_THIRD_PARTY_DIR/gcc-<GCC_VERSION>/platforms/$WM_ARCH$WM_COMPILER_ARCH/
and change the gcc version number in $WM_PROJECT_DIR/etc/settings.sh and
$WM_PROJECT_DIR/etc/settings.csh appropriately and finally update the
environment variables as in section 3.
@ -120,7 +120,7 @@
Now go to the top-level source directory $WM_PROJECT_DIR and execute the
top-level build script './Allwmake'. In principle this will build everything,
but if problems occur with the build order it may be necessary to update the
environment variables and re-execute 'Allwmake'.
environment variables and re-execute './Allwmake'.
If you experience difficulties with building the source-pack, or your platform
is not currently supported, please contact <enquiries@OpenCFD.co.uk> to
@ -160,12 +160,13 @@
* Compiling Paraview 3.6.1 and the PV3FoamReader module
If there are problems encountered with ParaView, then it may be necessary to
compile ParaView from sources. The compilation
is a fairly simple process using the supplied makeParaView script that
has worked in our tests with other packages supplied in the ThirdParty
directory, namely cmake-2.6.4 and gcc-4.3.3. Execute the following:
is a fairly simple process using the makeParaView script
(found in ThirdParty directory), which has worked in our tests with other
packages supplied in the ThirdParty directory, namely cmake-2.6.4 and
gcc-4.3.3. Execute the following:
+ cd $WM_THIRD_PARTY_DIR
+ rm -rf paraview-3.6.1/platforms
+ makeParaView
+ ./makeParaView
The PV3FoamReader module is an OpenFOAM utility that can be compiled in the
usual manner as follows:

View File

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

View File

@ -0,0 +1,104 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Application
fileNameCleanTest
Description
\*---------------------------------------------------------------------------*/
#include "argList.H"
#include "fileName.H"
#include "SubList.H"
#include "IOobject.H"
#include "IOstreams.H"
#include "OSspecific.H"
using namespace Foam;
void printCleaning(fileName& pathName)
{
Info<< "fileName = " << pathName << nl
<< " path() = " << pathName.path() << nl
<< " name() = " << pathName.name() << nl
<< " joined = " << pathName.path()/pathName.name() << nl << nl;
pathName.clean();
Info<< "cleaned = " << pathName << nl
<< " path() = " << pathName.path() << nl
<< " name() = " << pathName.name() << nl
<< " joined = " << pathName.path()/pathName.name() << nl << nl;
IOobject::writeDivider(Info);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:
int main(int argc, char *argv[])
{
argList::noBanner();
argList::noParallel();
argList::validArgs.insert("fileName .. fileNameN");
argList args(argc, argv, false, true);
if (args.additionalArgs().empty())
{
args.printUsage();
}
if (args.optionFound("case"))
{
fileName pathName = args.option("case");
Info<< nl
<< "-case" << nl
<< "path = " << args.path() << nl
<< "root = " << args.rootPath() << nl
<< "case = " << args.caseName() << nl
<< "FOAM_CASE=" << getEnv("FOAM_CASE") << nl
<< "FOAM_CASENAME=" << getEnv("FOAM_CASENAME") << nl
<< endl;
printCleaning(pathName);
}
forAll(args.additionalArgs(), argI)
{
fileName pathName = args.additionalArgs()[argI];
printCleaning(pathName);
}
Info<< "\nEnd" << endl;
return 0;
}
// ************************************************************************* //

View File

@ -27,6 +27,7 @@ Application
Description
Print the OpenFOAM version strings.
Simultaneously the smallest possible program to use a minimal bit of
the OpenFOAM library
@ -37,9 +38,9 @@ Description
int main()
{
std::cerr
<< "build " << Foam::FOAMbuild << "\n"
<< "version " << Foam::FOAMversion << "\n";
std::cout
<< "version " << Foam::FOAMversion << "\n"
<< "build " << Foam::FOAMbuild << "\n";
return 0;
}

View File

@ -5,9 +5,8 @@
cd ${0%/*} || exit 1 # run from this directory
set -x
# build libccmio and create lnInclude directory
( cd $WM_THIRD_PARTY_DIR && ./AllwmakeLibccmio )
$WM_THIRD_PARTY_DIR/AllwmakeLibccmio
# if the library built properly, the headers should exist too
if [ -e $FOAM_LIBBIN/libccmio.so ]

View File

@ -31,17 +31,29 @@
#
#------------------------------------------------------------------------------
if [ $# -ne 0 ]; then
echo "Usage : ${0##*/}"
echo ""
echo "Build the tags files for all the .C and .H files"
echo ""
exit 1
if [ $# -ne 0 ]
then
echo "Usage : ${0##*/}"
echo ""
echo "Build the tags files for all the .C and .H files"
echo ""
exit 1
fi
cd $WM_PROJECT_DIR
for cmd in etags ectags
do
type $cmd >/dev/null 2>&1 || {
echo "${0##*/} cannot build tag files: '$cmd' command not found"
exit
}
done
cd $WM_PROJECT_DIR || exit
mkdir .tags 2>/dev/null
etagsCmd="etags --declarations -l c++ -o .tags/etags -"
#etagsDefCmd="etags -l c++ -o .tags/etagsDef -"
#etagsDecCmd="etags --declarations -l c++ -o .tags/etagsDec -"

View File

@ -1,398 +0,0 @@
#!/usr/bin/perl -w
use strict;
use File::Spec;
use Getopt::Long;
#############################################################################
# SETTINGS
#
my %config = (
thirdParty => "$ENV{WM_PROJECT_INST_DIR}/ThirdParty",
project => ( $ENV{WM_PROJECT} || '' ) . "-"
. ( $ENV{WM_PROJECT_VERSION} || '' ),
);
my %packages = (
cmake => {
-opt => 1,
url => "http://www.cmake.org/files/v2.6/cmake-2.6.0.tar.gz",
},
lam => {
-opt => 1,
url => "http://www.lam-mpi.org/download/files/lam-7.1.4.tar.bz2",
},
libccmio => {
-opt => 1,
url =>
"https://wci.llnl.gov/codes/visit/3rd_party/libccmio-2.6.1.tar.gz",
},
openmpi => {
url =>
"http://www.open-mpi.org/software/ompi/v1.2/downloads/openmpi-1.2.6.tar.bz2",
},
metis => {
url =>
"http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/metis-5.0pre2.tar.gz"
},
mico => {
-opt => 1,
url => "http://www.mico.org/mico-2.3.12.tar.gz",
},
mpich => {
-opt => 1,
url => "ftp://ftp.mcs.anl.gov/pub/mpi/old/mpich-1.2.4.tar.gz",
},
ParMetis => {
url =>
"http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis/ParMetis-3.1.tar.gz",
},
ParMGridGen => {
url =>
"http://www-users.cs.umn.edu/~moulitsa/download/ParMGridGen-1.0.tar.gz",
},
zlib => { url => "http://www.zlib.net/zlib-1.2.3.tar.gz", },
hoard => {
-opt => 1,
url =>
"http://www.cs.umass.edu/%7Eemery/hoard/hoard-3.7.1/hoard-371.tar.gz"
},
## # this really doesn't work well, but code needs minor patching anyhow:
## fbsdmalloc => {
## url =>
## "http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/lib/libc/stdlib/malloc.c?rev=1.171",
##
## },
);
#
# END OF SETTINGS
############################################################################
( my $Script = $0 ) =~ s{^.*/}{};
# --------------------------------------------------------------------------
sub usage {
my ( @req, @opt );
for ( sort keys %packages ) {
if ( $packages{$_}{-opt} ) {
push @opt, $_;
}
else {
push @req, $_;
}
}
$! = 0; # clean exit
warn "@_\n" if @_;
die <<"USAGE";
usage:
$Script [OPTION] [package1 .. packageN]
options:
-help usage
-status show status [default]
-list list versions and resource locations
-version list versions only
-dir list unpack directory
-reldir list unpack directory relative to cwd
-get get packages as required (uses curl)
-unpack unpack packages where required and possible
Simple management of 3rd party software for '$config{project}'
using the directory
$config{thirdParty}
Packages: @req
Optional: @opt
Return codes:
-status -get -unpack number of missing packages or errors
USAGE
}
# --------------------------------------------------------------------------
my %opt;
# default action is -status
@ARGV or $opt{status}++;
GetOptions(
\%opt, ##
"help", "status", "list", "version", "dir",
"reldir", "get", "unpack",
)
or usage;
$opt{help} and usage;
-d $config{thirdParty} or usage "ERROR: no '$config{thirdParty}' dir";
#
# complete the config
#
if ( not exists $config{sources} ) {
$config{sources} = "$config{thirdParty}/sources";
-d $config{sources} or mkdir $config{sources};
}
#
# cleanup the packages table
#
for my $name ( keys %packages ) {
my $href = $packages{$name};
if ( not $href->{url} ) {
warn "$name without url\n";
delete $packages{$name};
next;
}
if ( not exists $href->{file} ) {
( $href->{file} = $href->{url} ) =~ s{^.*/|\?.*$}{}g;
}
if ( not exists $href->{dir} ) {
( $href->{dir} = $href->{file} ) =~ s{\.(zip|tar(\.(gz|bz2))?)$}{};
}
}
#
# check for names in the packages
#
sub selectNames {
my @names;
my $req;
while ( @_ and $_[0] =~ /^-/ ) {
my $opt = shift;
if ( $opt =~ /^-req/ ) {
$req++;
}
}
if (@_) {
my ( %seen, @reject );
for my $name (@_) {
next if $seen{$name}++;
if ( exists $packages{$name} ) {
push @names, $name;
}
else {
push @reject, $name;
}
}
usage "unknown package(s): @reject" if @reject;
}
else {
@names =
grep { not $req or not $packages{$_}{-opt} } sort keys %packages;
}
@names or usage "no packages";
return @names;
}
#
# list the current status
#
if ( $opt{status} ) {
my @names = selectNames @ARGV;
my $nMissing = 0;
for my $name (@names) {
my $href = $packages{$name};
my ( $dir, $file, $url ) = @$href{qw( dir file url )};
my @status;
if ( -e "$config{sources}/$file" ) {
push @status, " packed: $config{sources}/$file";
}
if ( -d "$config{thirdParty}/$dir" ) {
push @status, "unpacked: $config{thirdParty}/$dir";
}
unless (@status) {
$nMissing++;
@status = "missing";
}
for (@status) {
printf "%-16s %-16s %s", $name, $dir, $_;
if ( $href->{-opt} ) {
print " [optional]";
}
print "\n";
}
}
exit $nMissing;
}
#
# show an overview of the versions and the resource locations
#
if ( $opt{list} ) {
my @names = selectNames @ARGV;
for my $name (@names) {
my $href = $packages{$name};
my ( $dir, $file, $url ) = @$href{qw( dir file url )};
printf "%-16s %-16s %s", $name, $dir, $url;
if ( $href->{-opt} ) {
print " [optional]";
}
print "\n";
}
exit 0;
}
#
# show the version (directory name) only
#
if ( $opt{version} ) {
my @names = selectNames @ARGV;
for my $name (@names) {
my $href = $packages{$name};
my ( $dir, $file, $url ) = @$href{qw( dir file url )};
print $dir, "\n";
}
exit 0;
}
#
# show the unpack directory name
#
if ( $opt{dir} or $opt{reldir} ) {
my @names = selectNames @ARGV;
my $base = $config{thirdParty};
if ( $opt{reldir} ) {
$base = File::Spec->abs2rel($base);
length $base or $base = '.';
}
for my $name (@names) {
my $href = $packages{$name};
my ( $dir, $file, $url ) = @$href{qw( dir file url )};
print File::Spec->catfile( $base, $dir ), "\n";
}
exit 0;
}
#
# get and/or unpack packages as required and possible
# avoid getting/unpacking optional packages
#
if ( $opt{get} or $opt{unpack} ) {
my @names = selectNames -required => @ARGV;
my $nError = 0;
for my $name (@names) {
my $href = $packages{$name};
my ( $dir, $file, $url ) = @$href{qw( dir file url )};
my $flags = "";
if ( $href->{-opt} ) {
$flags .= "[optional]";
}
warn '-' x 70, "\n", "$name ($dir) $flags\n";
if ( -d "$config{thirdParty}/$dir" ) {
warn "unpacked: $config{thirdParty}/$dir\n";
next;
}
if ( $opt{get} ) {
if ( -e "$config{sources}/$file" ) {
warn " packed: $config{sources}/$file\n";
}
else {
my $fetch = "curl -k -o $file";
# curl seems to hang on anonymous ftp?
if ( $url =~ /^ftp:/ ) {
$fetch = "wget -v";
}
system "set -x; cd $config{sources} && $fetch $url";
if ( not -e "$config{sources}/$file" ) {
$nError++;
warn " download failed!?\n";
next;
}
}
}
if ( $opt{unpack} ) {
if ( -e "$config{sources}/$file" ) {
my $unpack;
if ( $file =~ m{\.zip$} ) {
$unpack = "unzip";
}
elsif ( $file =~ m{\.tar$} ) {
$unpack = "tar -xf";
}
elsif ( $file =~ m{\.tar\.bz2$} ) {
$unpack = "tar -xjf";
}
elsif ( $file =~ m{\.(tgz|tar\.gz)$} ) {
$unpack = "tar -xzf";
}
else {
$nError++;
warn " no unpack defined for $file\n";
next;
}
system
"set -x; cd $config{thirdParty} && $unpack $config{sources}/$file";
# catch isolated cases where it unpacks without a version number
if ( -d "$config{thirdParty}/$name"
and not -d "$config{thirdParty}/$dir" )
{
rename "$config{thirdParty}/$name",
"$config{thirdParty}/$dir";
}
unless ( -d "$config{thirdParty}/$dir" ) {
$nError++;
warn "unpack failed!?\n";
next;
}
}
}
}
warn '-' x 70, "\n\n";
exit $nError;
}
# --------------------------------------------------------------------------

View File

@ -1,78 +0,0 @@
#---------------------------------*- sh -*-------------------------------------
# ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration |
# \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# Script
# thirdPartyGetFunctions
#
# Description
# Functions for managing the third-party packages
#
#------------------------------------------------------------------------------
#
# get, unpack and change to third party directory
# - call from within a sub-shell, since it uses 'cd'
#
getUnpack() {
[ "$#" -eq 1 ] || {
echo "getUnpack called with incorrect arguments $@"
return 1
}
d=$(foamThirdParty -dir $1 2>/dev/null) || {
echo "nothing know about '$1'"
return 1
}
foamThirdParty -get -unpack $1 && [ -d "$d" ] || return 1
[ -d "$d" ] && chmod -R ugo+rX $d 2>/dev/null
echo $d
}
#
# copy Make/{files,options} from wmakeFiles/PACKAGE
#
cpMakeFiles() {
[ "$#" -eq 2 ] || {
echo "cpMakeFiles called with incorrect arguments $@"
return 1
}
pkg=$1
dst=$2
for i in $(cd wmakeFiles/$pkg && find . -type f)
do
d=$(dirname $i)
b=$(basename $i)
mkdir -p $dst/$d/Make 2>/dev/null
[ -e $dst/$d/Make/$b ] || cp wmakeFiles/$pkg/$i $dst/$d/Make/$b
done
}
# ----------------------------------------------------------------- end-of-file

View File

@ -32,17 +32,17 @@
if [ "$#" -ne 0 ]
then
echo "Usage: ${0##*/}"
echo " touch FOAM_APPBIN"
exit 1
echo "Usage: ${0##*/}"
echo " touch FOAM_APPBIN"
exit 1
fi
if [ -d "$FOAM_APPBIN" ]
then
echo "touching FOAM_APPBIN: $FOAM_APPBIN"
touch $FOAM_APPBIN/*
echo "touching FOAM_APPBIN: $FOAM_APPBIN"
touch $FOAM_APPBIN/*
else
echo "no FOAM_APPBIN: $FOAM_APPBIN"
echo "no FOAM_APPBIN: $FOAM_APPBIN"
fi
#------------------------------------------------------------------------------

View File

@ -66,14 +66,14 @@ bool Foam::argList::regroupArgv(int& argc, char**& argv)
// note: we also re-write directly into args_
// and use a second pass to sort out args/options
for (int argi=0; argi < argc; argi++)
for (int argI = 0; argI < argc; argI++)
{
if (strcmp(argv[argi], "(") == 0)
if (strcmp(argv[argI], "(") == 0)
{
level++;
tmpString += "(";
}
else if (strcmp(argv[argi], ")") == 0)
else if (strcmp(argv[argI], ")") == 0)
{
if (level >= 1)
{
@ -87,19 +87,19 @@ bool Foam::argList::regroupArgv(int& argc, char**& argv)
}
else
{
args_[nArgs++] = argv[argi];
args_[nArgs++] = argv[argI];
}
}
else if (level)
{
// quote each string element
tmpString += "\"";
tmpString += argv[argi];
tmpString += argv[argI];
tmpString += "\"";
}
else
{
args_[nArgs++] = argv[argi];
args_[nArgs++] = argv[argI];
}
}
@ -129,12 +129,18 @@ void Foam::argList::getRootCase()
casePath = iter();
casePath.clean();
// handle degenerate form and '-case .' like no -case specified
if (casePath.empty() || casePath == ".")
{
// handle degenerate form and '-case .' like no -case specified
casePath = cwd();
options_.erase("case");
}
else if (casePath[0] != '/' && casePath.name() == "..")
{
// avoid relative cases ending in '..' - makes for very ugly names
casePath = cwd()/casePath;
casePath.clean();
}
}
else
{
@ -169,11 +175,11 @@ Foam::argList::argList
{
// Check if this run is a parallel run by searching for any parallel option
// If found call runPar (might filter argv)
for (int argi=0; argi<argc; argi++)
for (int argI = 0; argI < argc; argI++)
{
if (argv[argi][0] == '-')
if (argv[argI][0] == '-')
{
const char *optionName = &argv[argi][1];
const char *optionName = &argv[argI][1];
if (validParOptions.found(optionName))
{
@ -195,14 +201,14 @@ Foam::argList::argList
int nArgs = 1;
string argListString = args_[0];
for (int argi = 1; argi < args_.size(); argi++)
for (int argI = 1; argI < args_.size(); argI++)
{
argListString += ' ';
argListString += args_[argi];
argListString += args_[argI];
if (args_[argi][0] == '-')
if (args_[argI][0] == '-')
{
const char *optionName = &args_[argi][1];
const char *optionName = &args_[argI][1];
if
(
@ -216,8 +222,8 @@ Foam::argList::argList
)
)
{
argi++;
if (argi >= args_.size())
argI++;
if (argI >= args_.size())
{
FatalError
<< "option " << "'-" << optionName << '\''
@ -226,8 +232,8 @@ Foam::argList::argList
}
argListString += ' ';
argListString += args_[argi];
options_.insert(optionName, args_[argi]);
argListString += args_[argI];
options_.insert(optionName, args_[argI]);
}
else
{
@ -236,9 +242,9 @@ Foam::argList::argList
}
else
{
if (nArgs != argi)
if (nArgs != argI)
{
args_[nArgs] = args_[argi];
args_[nArgs] = args_[argI];
}
nArgs++;
}
@ -529,21 +535,19 @@ Foam::argList::argList
// Set the case and case-name as an environment variable
if (rootPath_[0] == '/')
{
// absolute path
// absolute path - use as-is
setEnv("FOAM_CASE", rootPath_/globalCase_, true);
}
else if (rootPath_ == ".")
{
// relative to the current working directory
setEnv("FOAM_CASE", cwd()/globalCase_, true);
setEnv("FOAM_CASENAME", globalCase_, true);
}
else
{
// qualify relative path
setEnv("FOAM_CASE", cwd()/rootPath_/globalCase_, true);
}
setEnv("FOAM_CASENAME", globalCase_, true);
fileName casePath = cwd()/rootPath_/globalCase_;
casePath.clean();
setEnv("FOAM_CASE", casePath, true);
setEnv("FOAM_CASENAME", casePath.name(), true);
}
// Switch on signal trapping. We have to wait until after Pstream::init
// since this sets up its own ones.

View File

@ -55,18 +55,115 @@ Foam::fileName::Type Foam::fileName::type() const
}
//
// * remove repeated slashes
// /abc////def --> /abc/def
//
// * remove '/./'
// /abc/def/./ghi/. --> /abc/def/./ghi
// abc/def/./ --> abc/def
//
// * remove '/../'
// /abc/def/../ghi/jkl/nmo/.. --> /abc/ghi/jkl
// abc/../def/ghi/../jkl --> abc/../def/jkl
//
// * remove trailing '/'
//
bool Foam::fileName::clean()
{
bool changed = false;
// the top slash - we are never allowed to go above it
register string::size_type top = this->find('/');
changed = this->removeRepeated('/') || changed;
changed = this->removeTrailing('/') || changed;
// no slashes - nothing to do
if (top == string::npos)
{
return false;
}
return changed;
// start with the '/' found:
register char prev = '/';
register string::size_type nChar = top+1;
register string::size_type maxLen = this->size();
for
(
register string::size_type src = nChar;
src < maxLen;
/*nil*/
)
{
register char c = operator[](src++);
if (prev == '/')
{
// repeated '/' - skip it
if (c == '/')
{
continue;
}
// could be '/./' or '/../'
if (c == '.')
{
// found trailing '/.' - skip it
if (src >= maxLen)
{
continue;
}
// peek at the next character
register char c1 = operator[](src);
// found '/./' - skip it
if (c1 == '/')
{
src++;
continue;
}
// it is '/..' or '/../'
if (c1 == '.' && (src+1 >= maxLen || operator[](src+1) == '/'))
{
string::size_type parent;
// backtrack to find the parent directory
// minimum of 3 characters: '/x/../'
// strip it, provided it is above the top point
if
(
nChar > 2
&& (parent = this->rfind('/', nChar-2)) != string::npos
&& parent >= top
)
{
nChar = parent + 1; // retain '/' from the parent
src += 2;
continue;
}
// bad resolution, eg 'abc/../../'
// retain the sequence, but move the top to avoid it being
// considered a valid parent later
top = nChar + 2;
}
}
}
operator[](nChar++) = prev = c;
}
// remove trailing slash
if (nChar > 1 && operator[](nChar-1) == '/')
{
nChar--;
}
this->resize(nChar);
return (nChar != maxLen);
}
// Return string with repeated characters removed
Foam::fileName Foam::fileName::clean() const
{
fileName fName(*this);