summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTina Müller <cpan2@tinita.de>2020-04-15 19:56:42 +0200
committerTina Müller (tinita) <cpan2@tinita.de>2020-04-19 12:47:41 +0200
commit3694a4af7d2afe86b45e5bfd66ddf1fcba92ec50 (patch)
tree8e64eb990b1681de2ae454e9bab6a93b90cadcef
parent4e5cea6419cc7dc2f7816c239f1e989a9239b4fb (diff)
downloadlibyaml-git-3694a4af7d2afe86b45e5bfd66ddf1fcba92ec50.tar.gz
Fix logic for document end before directive
open_ended can have three states now: 0: The previous document was ended explicitly with '...' 1: The previous document wasn't ended with '...' 2: The last scalar event was a block scalar with trailing empty lines |+, and last document wasn't ended with '...'. Important at stream end. This was broken in the past, and fixed in fa1293a. With my last PR #162 I added the faulty behaviour again. The problematic behaviour showed only when all of the following conditions were true: * writing YAML directives * writing unquoted top level scalars * writing more than one document ================== BROKEN ============================== The first example shows that the document end marker is not emitted before the next document. This would be valid in YAML 1.1 if the scalar was quoted, but not if it is plain. This commit fixes this. echo '--- foo --- bar ' | ./tests/run-parser-test-suite | ./tests/run-emitter-test-suite --directive 1.1 %YAML 1.1 --- foo %YAML 1.1 --- bar ================== FIXED ============================== echo '--- foo --- bar ' | ./tests/run-parser-test-suite | ./tests/run-emitter-test-suite --directive 1.1 %YAML 1.1 --- foo ... %YAML 1.1 --- bar ======================================================= Other examples which should look like this (and were correct already before this fix): Open ended scalars like |+ need '...' at the end of the stream: echo '--- |+ a --- |+ a ' | ./tests/run-parser-test-suite | ./tests/run-emitter-test-suite --- |+ a --- |+ a ... ======================================================= If a document is ended with an explicit '...', the code should not print '...' twice: echo '--- foo ... --- bar ' | ./tests/run-parser-test-suite | ./tests/run-emitter-test-suite --directive 1.1 %YAML 1.1 --- foo ... %YAML 1.1 --- bar ==========================================================
-rw-r--r--src/emitter.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/emitter.c b/src/emitter.c
index 2c2e42a..7dd8331 100644
--- a/src/emitter.c
+++ b/src/emitter.c
@@ -495,6 +495,7 @@ static int
yaml_emitter_emit_stream_start(yaml_emitter_t *emitter,
yaml_event_t *event)
{
+ emitter->open_ended = 0;
if (event->type == YAML_STREAM_START_EVENT)
{
if (!emitter->encoding) {
@@ -594,10 +595,10 @@ yaml_emitter_emit_document_start(yaml_emitter_t *emitter,
{
if (!yaml_emitter_write_indicator(emitter, "...", 1, 0, 0))
return 0;
- emitter->open_ended = 0;
if (!yaml_emitter_write_indent(emitter))
return 0;
}
+ emitter->open_ended = 0;
if (event->data.document_start.version_directive) {
implicit = 0;
@@ -662,7 +663,7 @@ yaml_emitter_emit_document_start(yaml_emitter_t *emitter,
* This can happen if a block scalar with trailing empty lines
* is at the end of the stream
*/
- if (emitter->open_ended)
+ if (emitter->open_ended == 2)
{
if (!yaml_emitter_write_indicator(emitter, "...", 1, 0, 0))
return 0;
@@ -715,6 +716,8 @@ yaml_emitter_emit_document_end(yaml_emitter_t *emitter,
if (!yaml_emitter_write_indent(emitter))
return 0;
}
+ else if (!emitter->open_ended)
+ emitter->open_ended = 1;
if (!yaml_emitter_flush(emitter))
return 0;
@@ -2222,7 +2225,7 @@ yaml_emitter_write_block_scalar_hints(yaml_emitter_t *emitter,
else if (string.start == string.pointer)
{
chomp_hint = "+";
- emitter->open_ended = 1;
+ emitter->open_ended = 2;
}
else
{
@@ -2232,7 +2235,7 @@ yaml_emitter_write_block_scalar_hints(yaml_emitter_t *emitter,
if (IS_BREAK(string))
{
chomp_hint = "+";
- emitter->open_ended = 1;
+ emitter->open_ended = 2;
}
}
}