diff options
Diffstat (limited to 'bbot/variable.cxx')
-rw-r--r-- | bbot/variable.cxx | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/bbot/variable.cxx b/bbot/variable.cxx new file mode 100644 index 0000000..a25b007 --- /dev/null +++ b/bbot/variable.cxx @@ -0,0 +1,94 @@ +// file : bbot/variable.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include <bbot/variable> + +#include <utility> // move() + +using namespace std; + +namespace bbot +{ + variable:: + variable (string v): string (move (v)) + { + // Scan the string untill the end to check that the quoting is terminated. + // We will also make sure that the name doesn't contain spaces and the + // value is provided. + // + char quoting ('\0'); // Current quoting mode, can be used as bool. + bool name (true); // True while we are parsing the variable name. + + auto b (cbegin ()); + auto i (b); + + auto bad_variable = [&b, &i] (const string& d) + { + throw invalid_variable (i - b, d); + }; + + for (auto e (cend ()); i != e; ++i) + { + char c (*i); + + if (!quoting) + { + if (c == '"' || c == '\'') // Begin of quoted string, + { + quoting = c; + continue; + } + } + else if (c == quoting) // End of quoted string, + { + quoting = '\0'; + continue; + } + + if (name) + { + if (c == ' ' || c == '\t') + bad_variable ("expected variable assignment"); + else if (c == '=') + name = false; + } + } + + if (quoting) + bad_variable ("unterminated quoted string"); + + if (name) + bad_variable ("no variable value"); + } + + string variable:: + unquoted () const + { + string r; + char quoting ('\0'); // Current quoting mode, can be used as bool. + + for (auto i (cbegin ()), e (cend ()); i != e; ++i) + { + char c (*i); + + if (!quoting) + { + if (c == '"' || c == '\'') // Begin of quoted string. + { + quoting = c; + continue; + } + } + else if (c == quoting) // End of quoted string. + { + quoting = '\0'; + continue; + } + + r += c; + } + + return r; + } +} |