summaryrefslogtreecommitdiffstats
path: root/Source/cmGlob.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmGlob.cxx')
-rw-r--r--Source/cmGlob.cxx39
1 files changed, 38 insertions, 1 deletions
diff --git a/Source/cmGlob.cxx b/Source/cmGlob.cxx
index bb4d421..2ac32c7 100644
--- a/Source/cmGlob.cxx
+++ b/Source/cmGlob.cxx
@@ -32,6 +32,7 @@ public:
cmGlob::cmGlob()
{
m_Internals = new cmGlobInternal;
+ m_Recurse = false;
}
cmGlob::~cmGlob()
@@ -137,9 +138,46 @@ std::string cmGlob::ConvertExpression(const std::string& expr)
return res + "$";
}
+void cmGlob::RecurseDirectory(const std::string& dir, bool dir_only)
+{
+ cmsys::Directory d;
+ if ( !d.Load(dir.c_str()) )
+ {
+ return;
+ }
+ unsigned long cc;
+ std::string fullname;
+ for ( cc = 0; cc < d.GetNumberOfFiles(); cc ++ )
+ {
+ if ( strcmp(d.GetFile(cc), ".") == 0 ||
+ strcmp(d.GetFile(cc), "..") == 0 )
+ {
+ continue;
+ }
+ fullname = dir + "/" + d.GetFile(cc);
+ if ( !dir_only || !cmsys::SystemTools::FileIsDirectory(fullname.c_str()) )
+ {
+ if ( m_Internals->Expressions[m_Internals->Expressions.size()-1].find(d.GetFile(cc)) )
+ {
+ m_Internals->Files.push_back(fullname);
+ }
+ }
+ if ( cmsys::SystemTools::FileIsDirectory(fullname.c_str()) )
+ {
+ this->RecurseDirectory(fullname, dir_only);
+ }
+ }
+}
+
void cmGlob::ProcessDirectory(std::string::size_type start,
const std::string& dir, bool dir_only)
{
+ bool last = ( start == m_Internals->Expressions.size()-1 );
+ if ( last && m_Recurse )
+ {
+ this->RecurseDirectory(dir, dir_only);
+ return;
+ }
cmsys::Directory d;
if ( !d.Load(dir.c_str()) )
{
@@ -147,7 +185,6 @@ void cmGlob::ProcessDirectory(std::string::size_type start,
}
unsigned long cc;
std::string fullname;
- bool last = ( start == m_Internals->Expressions.size()-1 );
for ( cc = 0; cc < d.GetNumberOfFiles(); cc ++ )
{
if ( strcmp(d.GetFile(cc), ".") == 0 ||