// file : bbot/variable.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2017 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include #include // 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; } }