From 8aca122bf068e4bfd362856b1e1bc93597ca4da2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Aug 2026 06:38:39 +0000 Subject: [PATCH 1/3] Initial plan From 266554cb948273b33c8100e4c068d0cfadf0a711 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Aug 2026 06:40:32 +0000 Subject: [PATCH 2/3] fix(xml): remove std::generator dependency from xml parser Co-authored-by: clauspruefer <17313789+clauspruefer@users.noreply.github.com> --- lib/xml/xmlparser.cpp | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/lib/xml/xmlparser.cpp b/lib/xml/xmlparser.cpp index bf77afa..5627c2f 100644 --- a/lib/xml/xmlparser.cpp +++ b/lib/xml/xmlparser.cpp @@ -5,7 +5,6 @@ #include #include -#include #include #include #include @@ -69,13 +68,14 @@ std::string getElementText(DOMElement* Element) return trimCopy(Value); } -std::generator iterateElementChildren(DOMElement* Parent) +template +void iterateElementChildren(DOMElement* Parent, Callback&& Handler) { DOMNodeList* Children = Parent->getChildNodes(); for (XMLSize_t Index = 0; Index < Children->getLength(); ++Index) { DOMNode* Child = Children->item(Index); if (Child->getNodeType() == DOMNode::ELEMENT_NODE) { - co_yield static_cast(Child); + Handler(static_cast(Child)); } } } @@ -85,7 +85,8 @@ struct MessageSlice std::string_view Slice; }; -std::generator splitMessages(std::string_view Input, bool& FramingError) +template +void splitMessages(std::string_view Input, bool& FramingError, Callback&& Handler) { std::size_t Cursor = 0; std::size_t LastEnd = std::string_view::npos; @@ -98,7 +99,7 @@ std::generator splitMessages(std::string_view Input, bool& Framing if (LastEnd != std::string_view::npos && Start != LastEnd) { FramingError = true; - co_return; + return; } const std::size_t End = Input.find(NLAP_XML_END_MARKER, Start); @@ -107,7 +108,9 @@ std::generator splitMessages(std::string_view Input, bool& Framing } const std::size_t MessageEnd = End + NLAP_XML_END_MARKER.size(); - co_yield MessageSlice{Input.substr(Start, MessageEnd - Start)}; + if (!Handler(MessageSlice{Input.substr(Start, MessageEnd - Start)})) { + return; + } Cursor = MessageEnd; LastEnd = MessageEnd; @@ -197,12 +200,12 @@ void populateTree(DOMElement* Element, XMLNode& Node, std::string_view RawMessag { bool HasElementChildren = false; - for (DOMElement* Child : iterateElementChildren(Element)) { + iterateElementChildren(Element, [&](DOMElement* Child) { HasElementChildren = true; const std::string ChildName = transcodeXMLCh(Child->getTagName()); XMLNode& ChildNode = Node[ChildName]; populateTree(Child, ChildNode, RawMessage, SearchOffset); - } + }); if (HasElementChildren) { return; @@ -297,11 +300,11 @@ uint16_t parseMessage( XMLNode& RootNode = OutputTree[RootName]; std::size_t SearchOffset = 0; - for (DOMElement* Child : iterateElementChildren(Root)) { + iterateElementChildren(Root, [&](DOMElement* Child) { const std::string ChildName = transcodeXMLCh(Child->getTagName()); XMLNode& ChildNode = RootNode[ChildName]; populateTree(Child, ChildNode, RawMessage, SearchOffset); - } + }); return 0; } @@ -372,17 +375,24 @@ ParseResult_t XMLParser::parse(char* InputBuffer) const } bool FramingError = false; - for (const MessageSlice& Slice : splitMessages(InputBufferSV, FramingError)) { + bool HasMessageError = false; + splitMessages(InputBufferSV, FramingError, [&](const MessageSlice& Slice) { ResultTree_t Tree; const uint16_t MessageError = parseMessage(_GrammarPool, Slice.Slice, Tree); if (MessageError != 0) { Result.ErrorCode = MessageError; Result.Results.clear(); - return Result; + HasMessageError = true; + return false; } Result.Results.push_back(std::move(Tree)); + return true; + }); + + if (HasMessageError) { + return Result; } if (FramingError) { From bcf811c12b12b22bbce749d67e5978bf7c2575e0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Aug 2026 06:43:52 +0000 Subject: [PATCH 3/3] fix(xml): replace generator coroutines with callback iteration Co-authored-by: clauspruefer <17313789+clauspruefer@users.noreply.github.com> --- lib/xml/xmlparser.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/xml/xmlparser.cpp b/lib/xml/xmlparser.cpp index 5627c2f..b6a000e 100644 --- a/lib/xml/xmlparser.cpp +++ b/lib/xml/xmlparser.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -71,6 +72,10 @@ std::string getElementText(DOMElement* Element) template void iterateElementChildren(DOMElement* Parent, Callback&& Handler) { + static_assert( + std::is_void_v>, + "iterateElementChildren callback must return void" + ); DOMNodeList* Children = Parent->getChildNodes(); for (XMLSize_t Index = 0; Index < Children->getLength(); ++Index) { DOMNode* Child = Children->item(Index); @@ -108,6 +113,7 @@ void splitMessages(std::string_view Input, bool& FramingError, Callback&& Handle } const std::size_t MessageEnd = End + NLAP_XML_END_MARKER.size(); + // Handler must return true to continue iterating and false to stop. if (!Handler(MessageSlice{Input.substr(Start, MessageEnd - Start)})) { return; }