From 3d3181dfb5dc525b959f388a3962a7beb55c9402 Mon Sep 17 00:00:00 2001 From: PMheart <17109513+PMheart@users.noreply.github.com> Date: Thu, 8 Oct 2020 15:16:39 +0800 Subject: [PATCH] OcXmlLib: Add support for comments (#133) closes cidanthera/bugtracker#1053 --- Library/OcXmlLib/OcXmlLib.c | 62 ++++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 5 deletions(-) mode change 100755 => 100644 Library/OcXmlLib/OcXmlLib.c diff --git a/Library/OcXmlLib/OcXmlLib.c b/Library/OcXmlLib/OcXmlLib.c old mode 100755 new mode 100644 index eb95d809..b64655ee --- a/Library/OcXmlLib/OcXmlLib.c +++ b/Library/OcXmlLib/OcXmlLib.c @@ -651,7 +651,9 @@ XmlParseTagOpen ( CONST CHAR8 **Attributes ) { - CHAR8 Current; + CHAR8 Current; + CHAR8 Next; + BOOLEAN IsComment; XML_PARSER_INFO (Parser, "tag_open"); @@ -682,15 +684,65 @@ XmlParseTagOpen ( if (Current != '?' && Current != '!') { break; } + + // + // A crazy XML comment may look like this: + // + // + // '<' has already been consumed a bit earlier, now continue to check '!', + // and then the two '-'. + // + IsComment = FALSE; + if (Current == '!') { + // + // Consume one more byte to check the two '-'. + // Now "" for comments and break if matched. + // + if (XmlParserPeek (Parser, CURRENT_CHARACTER) == '-' + && XmlParserPeek (Parser, NEXT_CHARACTER) == '-' + && XmlParserPeek (Parser, 2) == '>') { + // + // "-->" should all be consumed, which takes 3 bytes. + // + XmlParserConsume (Parser, 3); + break; + } + } else { + // + // For non-comments, simply match '>'. + // + if (XmlParserPeek (Parser, CURRENT_CHARACTER) == '>') { + XmlParserConsume (Parser, 1); + break; + } + } + // + // Consume each byte normally. + // + XmlParserConsume (Parser, 1); + } } while (Parser->Position < Parser->Length); // -- GitLab