Fixed when we emit the doc start (only if there already is a document in the stream, and we're about to emit a new node)

This commit is contained in:
Jesse Beder
2012-05-22 12:37:00 -05:00
parent 0814813302
commit eef692d7b2
4 changed files with 17 additions and 8 deletions

View File

@@ -7,7 +7,7 @@
namespace YAML namespace YAML
{ {
struct EmitterNodeType { enum value { None, Scalar, FlowSeq, BlockSeq, FlowMap, BlockMap }; }; struct EmitterNodeType { enum value { None, Property, Scalar, FlowSeq, BlockSeq, FlowMap, BlockMap }; };
} }
#endif // EMITTERDEF_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // EMITTERDEF_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -280,6 +280,7 @@ namespace YAML
case EmitterNodeType::BlockMap: case EmitterNodeType::BlockMap:
BlockMapPrepareNode(child); BlockMapPrepareNode(child);
break; break;
case EmitterNodeType::Property:
case EmitterNodeType::Scalar: case EmitterNodeType::Scalar:
assert(false); assert(false);
break; break;
@@ -288,12 +289,14 @@ namespace YAML
void Emitter::PrepareTopNode(EmitterNodeType::value child) void Emitter::PrepareTopNode(EmitterNodeType::value child)
{ {
if(!m_pState->HasBegunNode() && m_stream.pos() > 0) { if(m_pState->CurGroupChildCount() > 0 && m_stream.pos() > 0) {
EmitBeginDoc(); if(child != EmitterNodeType::None)
EmitBeginDoc();
} }
switch(child) { switch(child) {
case EmitterNodeType::None: case EmitterNodeType::None:
case EmitterNodeType::Property:
case EmitterNodeType::Scalar: case EmitterNodeType::Scalar:
case EmitterNodeType::FlowSeq: case EmitterNodeType::FlowSeq:
case EmitterNodeType::FlowMap: case EmitterNodeType::FlowMap:
@@ -329,6 +332,7 @@ namespace YAML
switch(child) { switch(child) {
case EmitterNodeType::None: case EmitterNodeType::None:
case EmitterNodeType::Property:
case EmitterNodeType::Scalar: case EmitterNodeType::Scalar:
case EmitterNodeType::FlowSeq: case EmitterNodeType::FlowSeq:
case EmitterNodeType::FlowMap: case EmitterNodeType::FlowMap:
@@ -378,6 +382,7 @@ namespace YAML
// key // key
switch(child) { switch(child) {
case EmitterNodeType::None: case EmitterNodeType::None:
case EmitterNodeType::Property:
case EmitterNodeType::Scalar: case EmitterNodeType::Scalar:
case EmitterNodeType::FlowSeq: case EmitterNodeType::FlowSeq:
case EmitterNodeType::FlowMap: case EmitterNodeType::FlowMap:
@@ -394,6 +399,7 @@ namespace YAML
// value // value
switch(child) { switch(child) {
case EmitterNodeType::None: case EmitterNodeType::None:
case EmitterNodeType::Property:
case EmitterNodeType::Scalar: case EmitterNodeType::Scalar:
case EmitterNodeType::FlowSeq: case EmitterNodeType::FlowSeq:
case EmitterNodeType::FlowMap: case EmitterNodeType::FlowMap:
@@ -537,7 +543,7 @@ namespace YAML
return *this; return *this;
} }
PrepareNode(EmitterNodeType::None); PrepareNode(EmitterNodeType::Property);
if(!Utils::WriteAnchor(m_stream, anchor.content)) { if(!Utils::WriteAnchor(m_stream, anchor.content)) {
m_pState->SetError(ErrorMsg::INVALID_ANCHOR); m_pState->SetError(ErrorMsg::INVALID_ANCHOR);
@@ -559,7 +565,7 @@ namespace YAML
return *this; return *this;
} }
PrepareNode(EmitterNodeType::None); PrepareNode(EmitterNodeType::Property);
bool success = false; bool success = false;
if(tag.type == _Tag::Type::Verbatim) if(tag.type == _Tag::Type::Verbatim)

View File

@@ -4,7 +4,7 @@
namespace YAML namespace YAML
{ {
EmitterState::EmitterState(): m_isGood(true), m_curIndent(0), m_hasAnchor(false), m_hasTag(false), m_hasNonContent(false) EmitterState::EmitterState(): m_isGood(true), m_curIndent(0), m_hasAnchor(false), m_hasTag(false), m_hasNonContent(false), m_docCount(0)
{ {
// set default global manipulators // set default global manipulators
m_charset.set(EmitNonAscii); m_charset.set(EmitNonAscii);
@@ -60,7 +60,9 @@ namespace YAML
void EmitterState::StartedNode() void EmitterState::StartedNode()
{ {
if(!m_groups.empty()) if(m_groups.empty())
m_docCount++;
else
m_groups.top().childCount++; m_groups.top().childCount++;
m_hasAnchor = false; m_hasAnchor = false;
@@ -161,7 +163,7 @@ namespace YAML
std::size_t EmitterState::CurGroupChildCount() const std::size_t EmitterState::CurGroupChildCount() const
{ {
return m_groups.empty() ? 0 : m_groups.top().childCount; return m_groups.empty() ? m_docCount : m_groups.top().childCount;
} }
void EmitterState::ClearModifiedSettings() void EmitterState::ClearModifiedSettings()

View File

@@ -160,6 +160,7 @@ namespace YAML
bool m_hasAnchor; bool m_hasAnchor;
bool m_hasTag; bool m_hasTag;
bool m_hasNonContent; bool m_hasNonContent;
std::size_t m_docCount;
}; };
template <typename T> template <typename T>