{
if (valType == varprop::VT_STRING)
{
- String strVal = value.GetString();
+ String strVal = EscapeValue(value.GetString());
LPCWSTR text = strVal.c_str();
WritePrivateProfileString(lpAppName, name.c_str(), text, GetFilePath());
}
break;
++v;
size_t vlen = _tcslen(v);
- m_iniFileKeyValues.insert_or_assign(String{ p, v - 1 }, String{v, v + vlen});
+ String value{ v, v + vlen };
+ m_iniFileKeyValues.insert_or_assign(String{ p, v - 1 }, UnescapeValue(value));
p = v + vlen + 1;
}
}
}
else if (value.GetType() == varprop::VT_STRING)
{
- strVal = value.GetString();
+ strVal = EscapeValue(value.GetString());
}
bool bRet = !!WritePrivateProfileString(_T("WinMerge"), name.c_str(),
{
TCHAR strVal[MAX_PATH_FULL] = {0};
GetPrivateProfileString(_T("WinMerge"), pKey, _T(""), strVal, MAX_PATH_FULL, filename.c_str());
- value.SetString(strVal);
- SaveOption(pKey, strVal);
+ String sVal = UnescapeValue(strVal);
+ value.SetString(sVal);
+ SaveOption(pKey, sVal);
}
Set(pKey, value);
}
return retVal;
}
+
+String COptionsMgr::EscapeValue(const String& text)
+{
+ String text2;
+ for (int i = 0; i < text.length(); ++i)
+ {
+ TCHAR ch = text[i];
+ if (ch == '\0' || ch == '\x1b' || ch == '\r' || ch == '\n')
+ {
+ text2 += '\x1b';
+ text2 += ch + '@';
+ }
+ else
+ text2 += ch;
+ }
+ return text2;
+}
+
+String COptionsMgr::UnescapeValue(const String& text)
+{
+ if (text.find('\x1b') == String::npos)
+ return text;
+ String text2;
+ for (int i = 0; i < text.length(); ++i)
+ {
+ if (text[i] == '\x1b' && i < text.length() - 1)
+ {
+ ++i;
+ text2 += text[i] - '@';
+ }
+ else
+ text2 += text[i];
+ }
+ return text2;
+}
+
virtual void SetSerializing(bool serializing=true) = 0;
protected:
+ static String EscapeValue(const String& text);
+ static String UnescapeValue(const String& text);
+
OptionsMap m_optionsMap; /**< Map where options are stored. */
private: