aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-01-18 13:54:24 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-01-20 15:43:46 +0200
commited217daec5d498b79c9503269d3529c9948378b4 (patch)
tree21b4eedb5c1f45f8745c0ad8943249989e0cc008
parent004cdc23349e5dec87e766043082dd4048d577bb (diff)
Escape equal sign in plugin option values
-rw-r--r--odb/odb.cxx8
-rw-r--r--odb/plugin.cxx16
2 files changed, 20 insertions, 4 deletions
diff --git a/odb/odb.cxx b/odb/odb.cxx
index e55328d..c3b8e58 100644
--- a/odb/odb.cxx
+++ b/odb/odb.cxx
@@ -800,6 +800,14 @@ encode_plugin_option (string const& k, string const& cv)
if (!v.empty ())
{
o += '=';
+
+ // A value cannot contain '='. Encode it as the backspace
+ // character.
+ //
+ for (size_t i (0); i < v.size (); ++i)
+ if (v[i] == '=')
+ v[i] = '\b';
+
o += v;
}
diff --git a/odb/plugin.cxx b/odb/plugin.cxx
index dd813d8..a93fd14 100644
--- a/odb/plugin.cxx
+++ b/odb/plugin.cxx
@@ -194,17 +194,25 @@ plugin_init (plugin_name_args* plugin_info, plugin_gcc_version*)
{
plugin_argument& a (plugin_info->argv[i]);
+ // A value cannot contain '=' so it is passed as the backspace
+ // character.
+ //
+ string v (a.value != 0 ? a.value : "");
+ for (size_t i (0); i < v.size (); ++i)
+ if (v[i] == '\b')
+ v[i] = '=';
+
// Handle service options.
//
if (strcmp (a.key, "svc-path") == 0)
{
- profile_paths_.push_back (path (a.value));
+ profile_paths_.push_back (path (v));
continue;
}
if (strcmp (a.key, "svc-file") == 0)
{
- file_ = path (a.value);
+ file_ = path (v);
continue;
}
@@ -214,9 +222,9 @@ plugin_init (plugin_name_args* plugin_info, plugin_gcc_version*)
argv_str.push_back (opt);
argv.push_back (const_cast<char*> (argv_str.back ().c_str ()));
- if (a.value != 0)
+ if (!v.empty ())
{
- argv_str.push_back (a.value);
+ argv_str.push_back (v);
argv.push_back (const_cast<char*> (argv_str.back ().c_str ()));
}
}