From df80050c13819f8bb605c38a974b578bc2bde704 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 24 Aug 2014 12:53:50 -0400 Subject: [PATCH] Parser - ::findUUIDList now safely removes nodes out of the iterator loop. --- src/Parser.cpp | 106 +++++++++++++++++++++++++++---------------------- 1 file changed, 59 insertions(+), 47 deletions(-) diff --git a/src/Parser.cpp b/src/Parser.cpp index 7c5f580e1..75ae49c7b 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -1432,73 +1432,85 @@ void Parser::findIdSequence () void Parser::findUUIDList () { context.debug ("Parser::findUUIDList"); - bool action = false; + bool action = true; - std::vector nodes; - collect (nodes); - std::vector ::iterator i; - for (i = nodes.begin (); i != nodes.end (); ++i) + do { - std::string raw = (*i)->attribute ("raw"); - Nibbler n (raw); + action = false; - std::vector sequence; - std::string uuid; - if (n.getUUID (uuid) || - n.getPartialUUID (uuid)) + std::vector nodes; + collect (nodes, collectAll); + std::vector ::iterator i; + for (i = nodes.begin (); i != nodes.end (); ++i) { - sequence.push_back (uuid); + std::string raw = (*i)->attribute ("raw"); - while (n.skip (',')) + if (raw == "--") + break; + + if (! (*i)->hasTag ("?")) + continue; + + Nibbler n (raw); + std::vector uuidList; + std::string uuid; + if (n.getUUID (uuid) || + n.getPartialUUID (uuid)) { - if (!n.getUUID (uuid) && - !n.getPartialUUID (uuid)) - throw std::string (STRING_PARSER_UUID_AFTER_COMMA); + uuidList.push_back (uuid); - sequence.push_back (uuid); - } - - if (n.depleted ()) - { - (*i)->unTag ("?"); - (*i)->removeAllBranches (); - (*i)->tag ("UUID"); - - Tree* branch = (*i)->addBranch (new Tree ("argSeq")); - branch->attribute ("raw", "("); - branch->tag ("OP"); - - std::vector ::iterator u; - for (u = sequence.begin (); u != sequence.end (); ++u) + while (n.skip (',')) { - if (u != sequence.begin ()) + if (!n.getUUID (uuid) && + !n.getPartialUUID (uuid)) + throw std::string (STRING_PARSER_UUID_AFTER_COMMA); + + uuidList.push_back (uuid); + } + + if (n.depleted ()) + { + (*i)->unTag ("?"); + (*i)->removeAllBranches (); + (*i)->tag ("UUID"); + + Tree* branch = (*i)->addBranch (new Tree ("argSeq")); + branch->attribute ("raw", "("); + branch->tag ("OP"); + + std::vector ::iterator u; + for (u = uuidList.begin (); u != uuidList.end (); ++u) { + if (u != uuidList.begin ()) + { + branch = (*i)->addBranch (new Tree ("argSeq")); + branch->attribute ("raw", "or"); + branch->tag ("OP"); + } + branch = (*i)->addBranch (new Tree ("argSeq")); - branch->attribute ("raw", "or"); + branch->attribute ("raw", "uuid"); + + branch = (*i)->addBranch (new Tree ("argSeq")); + branch->attribute ("raw", "="); branch->tag ("OP"); + + branch = (*i)->addBranch (new Tree ("argSeq")); + branch->attribute ("raw", "'" + *u + "'"); } branch = (*i)->addBranch (new Tree ("argSeq")); - branch->attribute ("raw", "uuid"); - - branch = (*i)->addBranch (new Tree ("argSeq")); - branch->attribute ("raw", "="); + branch->attribute ("raw", ")"); branch->tag ("OP"); - - branch = (*i)->addBranch (new Tree ("argSeq")); - branch->attribute ("raw", "'" + *u + "'"); + action = true; + break; } - - branch = (*i)->addBranch (new Tree ("argSeq")); - branch->attribute ("raw", ")"); - branch->tag ("OP"); - action = true; } } } + while (action); - if (action) - context.debug (_tree->dump ()); + context.debug (_tree->dump ()); } ////////////////////////////////////////////////////////////////////////////////