summaryrefslogtreecommitdiffstats
path: root/Source/cmXCodeObject.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmXCodeObject.cxx')
-rw-r--r--Source/cmXCodeObject.cxx58
1 files changed, 33 insertions, 25 deletions
diff --git a/Source/cmXCodeObject.cxx b/Source/cmXCodeObject.cxx
index b6c5be2..0a430f5 100644
--- a/Source/cmXCodeObject.cxx
+++ b/Source/cmXCodeObject.cxx
@@ -151,7 +151,9 @@ void cmXCodeObject::Print(std::ostream& out)
if(j->second->TypeValue == STRING)
{
- out << j->first << " = " << j->second->String << ";";
+ out << j->first << " = ";
+ j->second->PrintString(out);
+ out << ";";
}
else if(j->second->TypeValue == OBJECT_LIST)
{
@@ -160,7 +162,8 @@ void cmXCodeObject::Print(std::ostream& out)
{
if(j->second->List[k]->TypeValue == STRING)
{
- out << j->second->List[k]->String << ", ";
+ j->second->List[k]->PrintString(out);
+ out << ", ";
}
else
{
@@ -192,7 +195,9 @@ void cmXCodeObject::Print(std::ostream& out)
}
else if(object->TypeValue == STRING)
{
- out << i->first << " = " << object->String << ";" << separator;
+ out << i->first << " = ";
+ object->PrintString(out);
+ out << ";" << separator;
}
else
{
@@ -230,29 +235,32 @@ void cmXCodeObject::CopyAttributes(cmXCodeObject* copy)
}
//----------------------------------------------------------------------------
-void cmXCodeObject::SetString(const char* s)
+void cmXCodeObject::PrintString(std::ostream& os) const
{
- std::string ss = s;
- if(ss.size() == 0)
- {
- this->String = "\"\"";
- return;
- }
- // escape quotes
- cmSystemTools::ReplaceString(ss, "\"", "\\\"");
- bool needQuote = false;
- this->String = "";
- if(ss.find_first_of(" <>.+-=@") != ss.npos)
- {
- needQuote = true;
- }
- if(needQuote)
- {
- this->String = "\"";
- }
- this->String += ss;
- if(needQuote)
+ // The string needs to be quoted if it contains any characters
+ // considered special by the Xcode project file parser.
+ bool needQuote =
+ (this->String.empty() ||
+ this->String.find_first_of(" <>.+-=@") != this->String.npos);
+ const char* quote = needQuote? "\"" : "";
+
+ // Print the string, quoted and escaped as necessary.
+ os << quote;
+ for(std::string::const_iterator i = this->String.begin();
+ i != this->String.end(); ++i)
{
- this->String += "\"";
+ if(*i == '"')
+ {
+ // Escape double-quotes.
+ os << '\\';
+ }
+ os << *i;
}
+ os << quote;
+}
+
+//----------------------------------------------------------------------------
+void cmXCodeObject::SetString(const char* s)
+{
+ this->String = s;
}