From 08aa252611843b93c4f98959fe89c81b872224ae Mon Sep 17 00:00:00 2001 From: Chen Date: Mon, 29 Jun 2020 12:31:53 +0800 Subject: [PATCH] Support kinds of emitter format-setting for YAML::Null. (#906) * Support kinds of emitter format-setting for YAML::Null. * update the code and test cases * add the comment //fallthrough --- include/yaml-cpp/emitter.h | 2 ++ include/yaml-cpp/emittermanip.h | 6 +++++ src/.emitterstate.h.swp | Bin 0 -> 16384 bytes src/emitter.cpp | 21 +++++++++++++++- src/emitterstate.cpp | 15 ++++++++++++ src/emitterstate.h | 4 +++ test/integration/emitter_test.cpp | 39 ++++++++++++++++++++++++++++++ 7 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/.emitterstate.h.swp diff --git a/include/yaml-cpp/emitter.h b/include/yaml-cpp/emitter.h index 2add9ee..675a2ae 100644 --- a/include/yaml-cpp/emitter.h +++ b/include/yaml-cpp/emitter.h @@ -50,6 +50,7 @@ class YAML_CPP_API Emitter { bool SetOutputCharset(EMITTER_MANIP value); bool SetStringFormat(EMITTER_MANIP value); bool SetBoolFormat(EMITTER_MANIP value); + bool SetNullFormat(EMITTER_MANIP value); bool SetIntBase(EMITTER_MANIP value); bool SetSeqFormat(EMITTER_MANIP value); bool SetMapFormat(EMITTER_MANIP value); @@ -123,6 +124,7 @@ class YAML_CPP_API Emitter { void SpaceOrIndentTo(bool requireSpace, std::size_t indent); const char* ComputeFullBoolName(bool b) const; + const char* ComputeNullName() const; bool CanEmitNewline() const; private: diff --git a/include/yaml-cpp/emittermanip.h b/include/yaml-cpp/emittermanip.h index 22691bc..010d860 100644 --- a/include/yaml-cpp/emittermanip.h +++ b/include/yaml-cpp/emittermanip.h @@ -26,6 +26,12 @@ enum EMITTER_MANIP { DoubleQuoted, Literal, + // null manipulators + LowerNull, + UpperNull, + CamelNull, + TildeNull, + // bool manipulators YesNoBool, // yes, no TrueFalseBool, // true, false diff --git a/src/.emitterstate.h.swp b/src/.emitterstate.h.swp new file mode 100644 index 0000000000000000000000000000000000000000..c60f60a59f49d031e4b86da7f0b3afd6a5453c91 GIT binary patch literal 16384 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 A!vFvP literal 0 HcmV?d00001 diff --git a/src/emitter.cpp b/src/emitter.cpp index 56ef403..7defd43 100644 --- a/src/emitter.cpp +++ b/src/emitter.cpp @@ -49,6 +49,10 @@ bool Emitter::SetBoolFormat(EMITTER_MANIP value) { return ok; } +bool Emitter::SetNullFormat(EMITTER_MANIP value) { + return m_pState->SetNullFormat(value, FmtScope::Global); +} + bool Emitter::SetIntBase(EMITTER_MANIP value) { return m_pState->SetIntFormat(value, FmtScope::Global); } @@ -770,6 +774,21 @@ const char* Emitter::ComputeFullBoolName(bool b) const { // these answers } +const char* Emitter::ComputeNullName() const { + switch (m_pState->GetNullFormat()) { + case LowerNull: + return "null"; + case UpperNull: + return "NULL"; + case CamelNull: + return "Null"; + case TildeNull: + // fallthrough + default: + return "~"; + } +} + Emitter& Emitter::Write(bool b) { if (!good()) return *this; @@ -893,7 +912,7 @@ Emitter& Emitter::Write(const _Null& /*null*/) { PrepareNode(EmitterNodeType::Scalar); - m_stream << "~"; + m_stream << ComputeNullName(); StartedScalar(); diff --git a/src/emitterstate.cpp b/src/emitterstate.cpp index d50106c..59b3752 100644 --- a/src/emitterstate.cpp +++ b/src/emitterstate.cpp @@ -13,6 +13,7 @@ EmitterState::EmitterState() m_boolFmt(TrueFalseBool), m_boolLengthFmt(LongBool), m_boolCaseFmt(LowerCase), + m_nullFmt(TildeNull), m_intFmt(Dec), m_indent(2), m_preCommentIndent(2), @@ -43,6 +44,7 @@ void EmitterState::SetLocalValue(EMITTER_MANIP value) { SetBoolFormat(value, FmtScope::Local); SetBoolCaseFormat(value, FmtScope::Local); SetBoolLengthFormat(value, FmtScope::Local); + SetNullFormat(value, FmtScope::Local); SetIntFormat(value, FmtScope::Local); SetFlowType(GroupType::Seq, value, FmtScope::Local); SetFlowType(GroupType::Map, value, FmtScope::Local); @@ -279,6 +281,19 @@ bool EmitterState::SetBoolCaseFormat(EMITTER_MANIP value, } } +bool EmitterState::SetNullFormat(EMITTER_MANIP value, FmtScope::value scope) { + switch (value) { + case LowerNull: + case UpperNull: + case CamelNull: + case TildeNull: + _Set(m_nullFmt, value, scope); + return true; + default: + return false; + } +} + bool EmitterState::SetIntFormat(EMITTER_MANIP value, FmtScope::value scope) { switch (value) { case Dec: diff --git a/src/emitterstate.h b/src/emitterstate.h index 75e2166..52c09ce 100644 --- a/src/emitterstate.h +++ b/src/emitterstate.h @@ -91,6 +91,9 @@ class EmitterState { bool SetBoolCaseFormat(EMITTER_MANIP value, FmtScope::value scope); EMITTER_MANIP GetBoolCaseFormat() const { return m_boolCaseFmt.get(); } + bool SetNullFormat(EMITTER_MANIP value, FmtScope::value scope); + EMITTER_MANIP GetNullFormat() const { return m_nullFmt.get(); } + bool SetIntFormat(EMITTER_MANIP value, FmtScope::value scope); EMITTER_MANIP GetIntFormat() const { return m_intFmt.get(); } @@ -131,6 +134,7 @@ class EmitterState { Setting m_boolFmt; Setting m_boolLengthFmt; Setting m_boolCaseFmt; + Setting m_nullFmt; Setting m_intFmt; Setting m_indent; Setting m_preCommentIndent, m_postCommentIndent; diff --git a/test/integration/emitter_test.cpp b/test/integration/emitter_test.cpp index 8e1ee29..04adadf 100644 --- a/test/integration/emitter_test.cpp +++ b/test/integration/emitter_test.cpp @@ -1047,6 +1047,45 @@ TEST_F(EmitterTest, BoolFormatting) { "- Y\n- Y\n- y\n- N\n- N\n- n"); } +TEST_F(EmitterTest, GlobalNullFormatting) { + out << Flow << BeginSeq; + out.SetNullFormat(LowerNull); + out << Null; + out.SetNullFormat(UpperNull); + out << Null; + out.SetNullFormat(CamelNull); + out << Null; + out.SetNullFormat(TildeNull); + out << Null; + out << EndSeq; + ExpectEmit("[null, NULL, Null, ~]"); +} + +TEST_F(EmitterTest, NullFormatting) { + out << Flow << BeginSeq; + out << LowerNull << Null; + out << UpperNull << Null; + out << CamelNull << Null; + out << TildeNull << Null; + out << EndSeq; + ExpectEmit("[null, NULL, Null, ~]"); +} + +TEST_F(EmitterTest, NullFormattingOnNode) { + Node n(Load("null")); + out << Flow << BeginSeq; + out.SetNullFormat(LowerNull); + out << n; + out.SetNullFormat(UpperNull); + out << n; + out.SetNullFormat(CamelNull); + out << n; + out.SetNullFormat(TildeNull); + out << n; + out << EndSeq; + ExpectEmit("[null, NULL, Null, ~]"); +} + // TODO: Fix this test. // TEST_F(EmitterTest, DocStartAndEnd) { // out << BeginDoc;