summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-06-02 19:00:38 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-06-02 19:00:38 +0200
commit840f2fae3995a3e263801ad07d1285d35ddd9485 (patch)
treeafbc65a206b3b45c25cb2afb3fc18040ba6b02c5 /cli
parent5653d0317e60cea2fb9bb2eed464cb6f024879cb (diff)
Update description of the --options-file option
Diffstat (limited to 'cli')
-rw-r--r--cli/options.cli19
-rw-r--r--cli/options.cxx35
-rw-r--r--cli/options.hxx21
-rw-r--r--cli/options.ixx14
4 files changed, 81 insertions, 8 deletions
diff --git a/cli/options.cli b/cli/options.cli
index dff5443..58f9565 100644
--- a/cli/options.cli
+++ b/cli/options.cli
@@ -213,11 +213,18 @@ class options
"<file>",
"Read additional options from <file> with each option appearing on a
separate line optionally followed by space and an option value. Empty
- lines and lines starting with \cb{#} are ignored. The semantics of
- providing options in a file is equivalent to providing the same set
- of options in the same order on the command line at the point where the
- \cb{--options-file} option is specified except that shell escaping and
- quoting is not required. Repeat this option to specify more than one
- options files."
+ lines and lines starting with \cb{#} are ignored. Option values can
+ be enclosed in double quotes (\cb{\"\"}) to preserve leading and
+ trailing whitespaces as well as to specify empty values. If the value
+ itself contains trailing or leading double quote, enclose it with an
+ extra pair of double quotes, for example \cb{\"\"x\"\"}. Non-leading
+ and non-trailing quotes are interpreted as being part of the option
+ value.
+
+ The semantics of providing options in a file is equivalent to providing
+ the same set of options in the same order on the command line at the
+ point where the \cb{--options-file} option is specified except that
+ the shell escaping and quoting is not required. Repeat this option
+ to specify more than one options files."
};
};
diff --git a/cli/options.cxx b/cli/options.cxx
index a079f9e..3f3c1b9 100644
--- a/cli/options.cxx
+++ b/cli/options.cxx
@@ -125,6 +125,25 @@ namespace cli
return "unable to open file or read failure";
}
+ // unmatched_quote
+ //
+ unmatched_quote::
+ ~unmatched_quote () throw ()
+ {
+ }
+
+ void unmatched_quote::
+ print (std::ostream& os) const
+ {
+ os << "unmatched quote in argument '" << argument () << "'";
+ }
+
+ const char* unmatched_quote::
+ what () const throw ()
+ {
+ return "unmatched quote";
+ }
+
// scanner
//
scanner::
@@ -329,6 +348,18 @@ namespace cli
string s2 (line, p);
+ // If the string is wrapped in quotes, remove them.
+ //
+ n = s2.size ();
+
+ if (s2[0] == '"' || s2[n - 1] == '"')
+ {
+ if (n == 1 || s2[0] != s2[n - 1])
+ throw unmatched_quote (s2);
+
+ s2 = string (s2, 1, n - 2);
+ }
+
if (!skip_ && s1 == option_)
load (s2.c_str ());
else
@@ -468,11 +499,11 @@ namespace cli
}
};
- template <typename X, typename T, T X::*P>
+ template <typename X, typename T, T X::*M>
void
thunk (X& x, scanner& s)
{
- parser<T>::parse (x.*P, s);
+ parser<T>::parse (x.*M, s);
}
}
diff --git a/cli/options.hxx b/cli/options.hxx
index e17a7d3..2c60c83 100644
--- a/cli/options.hxx
+++ b/cli/options.hxx
@@ -166,6 +166,27 @@ namespace cli
std::string file_;
};
+ class unmatched_quote: public exception
+ {
+ public:
+ virtual
+ ~unmatched_quote () throw ();
+
+ unmatched_quote (const std::string& argument);
+
+ const std::string&
+ argument () const;
+
+ virtual void
+ print (std::ostream&) const;
+
+ virtual const char*
+ what () const throw ();
+
+ private:
+ std::string argument_;
+ };
+
class scanner
{
public:
diff --git a/cli/options.ixx b/cli/options.ixx
index df0e39e..4a5b17e 100644
--- a/cli/options.ixx
+++ b/cli/options.ixx
@@ -98,6 +98,20 @@ namespace cli
return file_;
}
+ // unmatched_quote
+ //
+ inline unmatched_quote::
+ unmatched_quote (const std::string& argument)
+ : argument_ (argument)
+ {
+ }
+
+ inline const std::string& unmatched_quote::
+ argument () const
+ {
+ return argument_;
+ }
+
// argv_scanner
//
inline argv_scanner::