From 3d617b48aafbef2cbfa078a52fa8ffbceae14286 Mon Sep 17 00:00:00 2001
From: Bill Hoffman <bill.hoffman@kitware.com>
Date: Thu, 23 Feb 2006 11:36:36 -0500
Subject: ENH: fix for bug 2908 crash for empty source group name

---
 Source/cmSourceGroupCommand.cxx | 36 ++++++++++++++----------------------
 1 file changed, 14 insertions(+), 22 deletions(-)

diff --git a/Source/cmSourceGroupCommand.cxx b/Source/cmSourceGroupCommand.cxx
index 01b969f..32b652f 100644
--- a/Source/cmSourceGroupCommand.cxx
+++ b/Source/cmSourceGroupCommand.cxx
@@ -21,27 +21,17 @@ inline std::vector<std::string> tokenize(const std::string& str,
                                          bool skipEmptyTokens)
 {
   std::vector<std::string> tokens;
-  std::string::size_type tokstart,tokend;
-
-  if (skipEmptyTokens) 
+  if(str.size() == 0)
     {
-    tokend=0;
+    tokens.push_back("");
+    return tokens;
     }
-  else 
-    {
-    tokend=std::string::npos;
-    }
-        
+  std::string::size_type tokstart,tokend;
+
+  tokend=0;
   do
     {
-    if (skipEmptyTokens)
-      {
-      tokstart=str.find_first_not_of(sep,tokend);
-      }
-    else 
-      {
-      tokstart=tokend+1;
-      }
+    tokstart=str.find_first_not_of(sep,tokend);
     if (tokstart==std::string::npos) 
       {
       break;    // no more tokens
@@ -56,7 +46,6 @@ inline std::vector<std::string> tokenize(const std::string& str,
       tokens.push_back(str.substr(tokstart,tokend-tokstart));
       }
     } while (tokend!=std::string::npos);
-        
   return tokens;
 }
 
@@ -70,16 +59,15 @@ bool cmSourceGroupCommand::InitialPass(std::vector<std::string> const& args)
     }  
 
   std::string delimiter = "\\";
-
   if(m_Makefile->GetDefinition("SOURCE_GROUP_DELIMITER"))
+    {
     delimiter = m_Makefile->GetDefinition("SOURCE_GROUP_DELIMITER");
+    }
 
   std::vector<std::string> folders = tokenize(args[0], delimiter, true);
  
   const char *parent = NULL;
- 
   cmSourceGroup* sg = NULL;
-        
   for(unsigned int i=0;i<folders.size();++i)
     {
     sg = m_Makefile->GetSourceGroup(folders[i].c_str());
@@ -90,7 +78,11 @@ bool cmSourceGroupCommand::InitialPass(std::vector<std::string> const& args)
     sg = m_Makefile->GetSourceGroup(folders[i].c_str());
     parent = folders[i].c_str();
     }
-
+  if(!sg)
+    {
+    this->SetError("Could not create or find source group");
+    return false;
+    }
   // If only two arguments are given, the pre-1.8 version of the
   // command is being invoked.
   if(args.size() == 2  && args[1] != "FILES")
-- 
cgit v0.12