From 6254448640530240dc9199bed60cd5568cbaf601 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Tue, 1 Aug 2017 16:42:22 +0300 Subject: Add manifest_parser::split_comment() and manifest_serializer::merge_comment() --- libbutl/manifest-parser.cxx | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'libbutl/manifest-parser.cxx') diff --git a/libbutl/manifest-parser.cxx b/libbutl/manifest-parser.cxx index ae92d79..304815a 100644 --- a/libbutl/manifest-parser.cxx +++ b/libbutl/manifest-parser.cxx @@ -125,6 +125,48 @@ namespace butl return r; } + pair manifest_parser:: + split_comment (const string& v) + { + using iterator = string::const_iterator; + + auto space = [] (char c) -> bool {return c == ' ' || c == '\t';}; + + iterator i (v.begin ()); + iterator e (v.end ()); + + string r; + size_t n (0); + for (char c; i != e && (c = *i) != ';'; ++i) + { + // Unescape ';' character. + // + if (c == '\\' && i + 1 != e && *(i + 1) == ';') + c = *++i; + + r += c; + + if (!space (c)) + n = r.size (); + } + + // Strip the value trailing spaces. + // + if (r.size () != n) + r.resize (n); + + // Find beginning of a comment (i). + // + if (i != e) + { + // Skip spaces. + // + for (++i; i != e && space (*i); ++i); + } + + return make_pair (move (r), string (i, e)); + } + void manifest_parser:: parse_name (name_value& r) { -- cgit v1.1