|
|
@@ -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;
|
|
|
}
|