summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/cmLocalUnixMakefileGenerator2.cxx70
-rw-r--r--Source/cmLocalUnixMakefileGenerator2.h1
-rw-r--r--Source/kwsys/SystemTools.cxx60
-rw-r--r--Source/kwsys/SystemTools.hxx.in17
4 files changed, 82 insertions, 66 deletions
diff --git a/Source/cmLocalUnixMakefileGenerator2.cxx b/Source/cmLocalUnixMakefileGenerator2.cxx
index 1c7e973..8640182 100644
--- a/Source/cmLocalUnixMakefileGenerator2.cxx
+++ b/Source/cmLocalUnixMakefileGenerator2.cxx
@@ -2306,7 +2306,7 @@ cmLocalUnixMakefileGenerator2::ConvertToRelativePath(const char* p)
// Identify the longest shared path component between the given path
// and the current output directory.
std::vector<std::string> path;
- this->SplitFullPath(p, path);
+ cmSystemTools::SplitPath(p, path);
unsigned int common=0;
while(common < path.size() &&
common < m_CurrentOutputDirectoryComponents.size() &&
@@ -2397,8 +2397,8 @@ cmLocalUnixMakefileGenerator2::ConfigureOutputPaths()
// directory and the build directory.
std::vector<std::string> source;
std::vector<std::string> binary;
- this->SplitFullPath(m_HomeDirectory.c_str(), source);
- this->SplitFullPath(m_HomeOutputDirectory.c_str(), binary);
+ cmSystemTools::SplitPath(m_HomeDirectory.c_str(), source);
+ cmSystemTools::SplitPath(m_HomeOutputDirectory.c_str(), binary);
unsigned int common=0;
while(common < source.size() && common < binary.size() &&
this->ComparePath(source[common].c_str(), binary[common].c_str()))
@@ -2427,68 +2427,8 @@ cmLocalUnixMakefileGenerator2::ConfigureOutputPaths()
// Split the current output directory now to save time when
// converting paths.
- this->SplitFullPath(m_CurrentOutputDirectory.c_str(),
- m_CurrentOutputDirectoryComponents);
- }
-}
-
-//----------------------------------------------------------------------------
-void
-cmLocalUnixMakefileGenerator2
-::SplitFullPath(const char* p, std::vector<std::string>& components)
-{
- // The path is split into its basic components. This starts with a
- // root ("/" for UNIX, "c:/" for Windows, "//" for Network) and is
- // followed by the directory names. If there is a trailing slash
- // then the last component is the empty string. The components can
- // be recombined as "c[0]c[1]/c[2]/.../c[n]".
- assert(cmSystemTools::FileIsFullPath(p));
-
- // Identify the root component.
- const char* c = p;
- if(c[0] == '/' && c[1] == '/')
- {
- // Network path.
- components.push_back("//");
- c += 2;
- }
- else if(c[0] == '/')
- {
- // Unix path.
- components.push_back("/");
- c += 1;
- }
- else if(c[0] && c[1] == ':' && c[2] == '/')
- {
- // Windows path.
- std::string root = "_:/";
- root[0] = c[0];
- components.push_back(root);
- c += 3;
- }
- else
- {
- // Already a relative path.
- cmSystemTools::Error("SplitFullPath called with path ", p);
- return;
- }
-
- // Parse the remaining components.
- const char* first = c;
- const char* last = first;
- for(;*last; ++last)
- {
- if(*last == '/')
- {
- // End of a component. Save it.
- components.push_back(std::string(first, last-first));
- first = last+1;
- }
- }
- // Save the last component unless there were no components.
- if(last != c)
- {
- components.push_back(std::string(first, last-first));
+ cmSystemTools::SplitPath(m_CurrentOutputDirectory.c_str(),
+ m_CurrentOutputDirectoryComponents);
}
}
diff --git a/Source/cmLocalUnixMakefileGenerator2.h b/Source/cmLocalUnixMakefileGenerator2.h
index 0da8998..9127910 100644
--- a/Source/cmLocalUnixMakefileGenerator2.h
+++ b/Source/cmLocalUnixMakefileGenerator2.h
@@ -166,7 +166,6 @@ protected:
std::string ConvertToRelativePath(const char* p);
std::string ConvertToRelativeOutputPath(const char* p);
virtual void ConfigureOutputPaths();
- void SplitFullPath(const char* p, std::vector<std::string>& components);
bool ComparePath(const char* c1, const char* c2);
void AppendTargetDepends(std::vector<std::string>& depends,
diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx
index b3b1e7a..84f207a 100644
--- a/Source/kwsys/SystemTools.cxx
+++ b/Source/kwsys/SystemTools.cxx
@@ -1614,6 +1614,66 @@ kwsys_stl::string SystemTools::CollapseFullPath(const char* in_relative,
return newPath;
}
+//----------------------------------------------------------------------------
+void SystemTools::SplitPath(const char* p,
+ kwsys_stl::vector<kwsys_stl::string>& components)
+{
+ // Identify the root component.
+ const char* c = p;
+ if(c[0] == '/' && c[1] == '/')
+ {
+ // Network path.
+ components.push_back("//");
+ c += 2;
+ }
+ else if(c[0] == '/')
+ {
+ // Unix path.
+ components.push_back("/");
+ c += 1;
+ }
+ else if(c[0] && c[1] == ':' && c[2] == '/')
+ {
+ // Windows path.
+ std::string root = "_:/";
+ root[0] = c[0];
+ components.push_back(root);
+ c += 3;
+ }
+ else if(c[0] && c[1] == ':')
+ {
+ // Path relative to a windows drive working directory.
+ std::string root = "_:";
+ root[0] = c[0];
+ components.push_back(root);
+ c += 2;
+ }
+ else
+ {
+ // Relative path.
+ components.push_back("");
+ }
+
+ // Parse the remaining components.
+ const char* first = c;
+ const char* last = first;
+ for(;*last; ++last)
+ {
+ if(*last == '/')
+ {
+ // End of a component. Save it.
+ components.push_back(std::string(first, last-first));
+ first = last+1;
+ }
+ }
+
+ // Save the last component unless there were no components.
+ if(last != c)
+ {
+ components.push_back(std::string(first, last-first));
+ }
+}
+
bool SystemTools::Split(const char* str, kwsys_stl::vector<kwsys_stl::string>& lines)
{
kwsys_stl::string data(str);
diff --git a/Source/kwsys/SystemTools.hxx.in b/Source/kwsys/SystemTools.hxx.in
index e2fee45..e65ee05 100644
--- a/Source/kwsys/SystemTools.hxx.in
+++ b/Source/kwsys/SystemTools.hxx.in
@@ -237,6 +237,23 @@ public:
static kwsys_stl::string CollapseFullPath(const char* in_relative);
static kwsys_stl::string CollapseFullPath(const char* in_relative,
const char* in_base);
+
+ /**
+ * Split a path name into its basic components. The first component
+ * is one of the following roots:
+ * "/" = UNIX
+ * "c:/" = Windows full path (can be any drive letter)
+ * "c:" = Windows drive-letter relative path (can be any drive letter)
+ * "//" = Network path
+ * "" = Relative path
+ * The remaining components form the path. If there is a trailing
+ * slash then the last component is the empty string. The
+ * components can be recombined as "c[0]c[1]/c[2]/.../c[n]" to
+ * produce the original path. The input is assumed to be formatted
+ * with forward slashes.
+ */
+ static void SplitPath(const char* p,
+ kwsys_stl::vector<kwsys_stl::string>& components);
///! return path of a full filename (no trailing slashes).
static kwsys_stl::string GetFilenamePath(const kwsys_stl::string&);