From 75b695664a8acce3a48f369c67c8302181aeb160 Mon Sep 17 00:00:00 2001 From: James Turner Date: Wed, 26 Oct 2011 19:57:57 +0100 Subject: [PATCH] Change (revert!) behaviour of SGPath::base, which broke TerraGear, when used with multiple file suffixes (hgt.zip, for example). Test cases updated to match TG-required behaviour. --- simgear/misc/path_test.cxx | 4 ++-- simgear/misc/sg_path.cxx | 38 +++++++++++++++++++------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/simgear/misc/path_test.cxx b/simgear/misc/path_test.cxx index 4d976e01..cda48859 100644 --- a/simgear/misc/path_test.cxx +++ b/simgear/misc/path_test.cxx @@ -82,7 +82,7 @@ int main(int argc, char* argv[]) SGPath pj("/Foo/zot.dot/thing.tar.gz"); COMPARE(pj.dir(), std::string("/Foo/zot.dot")); COMPARE(pj.file(), std::string("thing.tar.gz")); - COMPARE(pj.base(), std::string("/Foo/zot.dot/thing")); + COMPARE(pj.base(), std::string("/Foo/zot.dot/thing.tar")); COMPARE(pj.file_base(), std::string("thing")); COMPARE(pj.extension(), std::string("gz")); COMPARE(pj.complete_lower_extension(), std::string("tar.gz")); @@ -124,7 +124,7 @@ int main(int argc, char* argv[]) SGPath extB("BAH/FOO.HTML.GZ"); COMPARE(extB.extension(), "GZ"); - COMPARE(extB.base(), "BAH/FOO"); + COMPARE(extB.base(), "BAH/FOO.HTML"); COMPARE(extB.lower_extension(), "gz"); COMPARE(extB.complete_lower_extension(), "html.gz"); #ifdef _WIN32 diff --git a/simgear/misc/sg_path.cxx b/simgear/misc/sg_path.cxx index bff1a61c..2a98b34e 100644 --- a/simgear/misc/sg_path.cxx +++ b/simgear/misc/sg_path.cxx @@ -189,40 +189,40 @@ string SGPath::file() const { string SGPath::dir() const { int index = path.rfind(sgDirPathSep); if (index >= 0) { - return path.substr(0, index); + return path.substr(0, index); } else { - return ""; + return ""; } } // get the base part of the path (everything but the extension.) -string SGPath::base() const { - unsigned int index = path.rfind(sgDirPathSep); - if (index == string::npos) { - index = 0; // no separator in the name - } else { - ++index; // skip past the separator - } - -// find the first dot after the final separator - unsigned int firstDot = path.find(".", index); - if (firstDot == string::npos) { - return path; // no extension, return whole path +string SGPath::base() const +{ + string::size_type index = path.rfind("."); + string::size_type lastSep = path.rfind(sgDirPathSep); + +// tolerate dots inside directory names + if ((lastSep != string::npos) && (index < lastSep)) { + return path; } - return path.substr(0, firstDot); + if (index >= 0) { + return path.substr(0, index); + } else { + return path; + } } string SGPath::file_base() const { - unsigned int index = path.rfind(sgDirPathSep); + string::size_type index = path.rfind(sgDirPathSep); if (index == string::npos) { index = 0; // no separator in the name } else { ++index; // skip past the separator } - unsigned int firstDot = path.find(".", index); + string::size_type firstDot = path.find(".", index); if (firstDot == string::npos) { return path.substr(index); // no extensions } @@ -248,14 +248,14 @@ string SGPath::lower_extension() const { string SGPath::complete_lower_extension() const { - unsigned int index = path.rfind(sgDirPathSep); + string::size_type index = path.rfind(sgDirPathSep); if (index == string::npos) { index = 0; // no separator in the name } else { ++index; // skip past the separator } - int firstDot = path.find(".", index); + string::size_type firstDot = path.find(".", index); if ((firstDot >= 0) && (path.find(sgDirPathSep, firstDot) == string::npos)) { return boost::to_lower_copy(path.substr(firstDot + 1)); } else { -- 2.39.5