summaryrefslogtreecommitdiff
path: root/src/utils.cc
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-10-26 17:17:01 -0400
committerJohn Wiegley <johnw@newartisans.com>2009-10-26 17:17:01 -0400
commitfeff681f4464eb9b538bde613afaf3b03c7c223a (patch)
tree0dbe6b679048f0de05b9bd50d4fed53c68552dce /src/utils.cc
parent92d1bbbe75df71731d458f5b48bcb0f145428920 (diff)
downloadfork-ledger-feff681f4464eb9b538bde613afaf3b03c7c223a.tar.gz
fork-ledger-feff681f4464eb9b538bde613afaf3b03c7c223a.tar.bz2
fork-ledger-feff681f4464eb9b538bde613afaf3b03c7c223a.zip
Improved argument parsing logic used by the REPL
It now handles quoted strings, although it doesn't understand escape sequences yet.
Diffstat (limited to 'src/utils.cc')
-rw-r--r--src/utils.cc53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/utils.cc b/src/utils.cc
index 0afea4c2..85a7aa46 100644
--- a/src/utils.cc
+++ b/src/utils.cc
@@ -442,6 +442,59 @@ string::~string() throw() {
ledger::string empty_string("");
+ledger::strings_list split_arguments(const char * line)
+{
+ using namespace ledger;
+
+ strings_list args;
+
+ char buf[4096];
+ char * q = buf;
+ char in_quoted_string = '\0';
+
+ for (const char * p = line; *p; p++) {
+ if (! in_quoted_string && std::isspace(*p)) {
+ if (q != buf) {
+ *q = '\0';
+ args.push_back(buf);
+ q = buf;
+ }
+ }
+ else if (in_quoted_string != '\'' && *p == '\\') {
+ p++;
+ if (! *p)
+ throw_(std::logic_error, _("Invalid use of backslash"));
+ *q++ = *p;
+ }
+ else if (in_quoted_string != '"' && *p == '\'') {
+ if (in_quoted_string == '\'')
+ in_quoted_string = '\0';
+ else
+ in_quoted_string = '\'';
+ }
+ else if (in_quoted_string != '\'' && *p == '"') {
+ if (in_quoted_string == '"')
+ in_quoted_string = '\0';
+ else
+ in_quoted_string = '"';
+ }
+ else {
+ *q++ = *p;
+ }
+ }
+
+ if (in_quoted_string)
+ throw_(std::logic_error,
+ _("Unterminated string, expected '%1'") << in_quoted_string);
+
+ if (q != buf) {
+ *q = '\0';
+ args.push_back(buf);
+ }
+
+ return args;
+}
+
/**********************************************************************
*
* Logging