From 7c4a8dad85a13f6fcb62daa22bd23d9266d448e6 Mon Sep 17 00:00:00 2001 From: jbeder Date: Thu, 29 Oct 2009 22:01:01 +0000 Subject: [PATCH] Added case for parsing a compact key: value pair in a flow sequence with a null key --- src/map.cpp | 15 +++++++++++++++ src/map.h | 1 + src/node.cpp | 7 +++++++ 3 files changed, 23 insertions(+) diff --git a/src/map.cpp b/src/map.cpp index 7159d42..b30d3f7 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -66,6 +66,7 @@ namespace YAML case Token::BLOCK_MAP_START: ParseBlock(pScanner, state); break; case Token::FLOW_MAP_START: ParseFlow(pScanner, state); break; case Token::FLOW_MAP_COMPACT: ParseCompact(pScanner, state); break; + case Token::VALUE: ParseCompactWithNoKey(pScanner, state); break; default: break; } } @@ -178,6 +179,20 @@ namespace YAML m_data[pKey.release()] = pValue.release(); } + // ParseCompactWithNoKey + // . Single key: value pair in a flow sequence + void Map::ParseCompactWithNoKey(Scanner *pScanner, const ParserState& state) + { + std::auto_ptr pKey(new Node), pValue(new Node); + + // grab value + pScanner->pop(); + pValue->Parse(pScanner, state); + + // assign the map with the actual pointers + m_data[pKey.release()] = pValue.release(); + } + void Map::Write(Emitter& out) const { out << BeginMap; diff --git a/src/map.h b/src/map.h index c92b05f..d411010 100644 --- a/src/map.h +++ b/src/map.h @@ -42,6 +42,7 @@ namespace YAML void ParseBlock(Scanner *pScanner, const ParserState& state); void ParseFlow(Scanner *pScanner, const ParserState& state); void ParseCompact(Scanner *pScanner, const ParserState& state); + void ParseCompactWithNoKey(Scanner *pScanner, const ParserState& state); private: node_map m_data; diff --git a/src/node.cpp b/src/node.cpp index f2fa118..0b547a3 100644 --- a/src/node.cpp +++ b/src/node.cpp @@ -64,6 +64,13 @@ namespace YAML // save location m_mark = pScanner->peek().mark; + + // special case: a value node by itself must be a map, with no header + if(pScanner->peek().type == Token::VALUE) { + m_pContent = new Map; + m_pContent->Parse(pScanner, state); + return; + } ParseHeader(pScanner, state);