diff --git a/third_party/lua-yaml/emitter.c b/third_party/lua-yaml/emitter.c index 965df3e87e2d3e4313197c9b3d16ee2a3d931ca7..ce257d1847b4fd987990c8aa831fc5fdd95a41c3 100644 --- a/third_party/lua-yaml/emitter.c +++ b/third_party/lua-yaml/emitter.c @@ -236,6 +236,10 @@ static int yaml_emitter_write_tag_content(yaml_emitter_t *emitter, yaml_char_t *value, size_t length, int need_whitespace); +static int +yaml_emitter_write_verbatim_scalar(yaml_emitter_t *emitter, + yaml_char_t *value, size_t length, int allow_breaks); + static int yaml_emitter_write_plain_scalar(yaml_emitter_t *emitter, yaml_char_t *value, size_t length, int allow_breaks); @@ -1177,6 +1181,9 @@ static int yaml_emitter_select_scalar_style(yaml_emitter_t *emitter, yaml_event_t *event) { yaml_scalar_style_t style = event->data.scalar.style; + if (style == YAML_VERBATIM_SCALAR_STYLE) + goto done; + int no_tag = (!emitter->tag_data.handle && !emitter->tag_data.suffix); if (no_tag && !event->data.scalar.plain_implicit @@ -1226,8 +1233,8 @@ yaml_emitter_select_scalar_style(yaml_emitter_t *emitter, yaml_event_t *event) emitter->tag_data.handle_length = 1; } +done: emitter->scalar_data.style = style; - return 1; } @@ -1293,6 +1300,11 @@ yaml_emitter_process_scalar(yaml_emitter_t *emitter) { switch (emitter->scalar_data.style) { + case YAML_VERBATIM_SCALAR_STYLE: + return yaml_emitter_write_verbatim_scalar(emitter, + emitter->scalar_data.value, emitter->scalar_data.length, + !emitter->simple_key_context); + case YAML_PLAIN_SCALAR_STYLE: return yaml_emitter_write_plain_scalar(emitter, emitter->scalar_data.value, emitter->scalar_data.length, @@ -1469,6 +1481,20 @@ yaml_emitter_analyze_tag(yaml_emitter_t *emitter, return 1; } +static int +yaml_emitter_analyze_scalar_verbatim(yaml_emitter_t *emitter, + yaml_char_t *value, size_t length) +{ + emitter->scalar_data.value = value; + emitter->scalar_data.length = length; + emitter->scalar_data.multiline = 0; + emitter->scalar_data.flow_plain_allowed = 0; + emitter->scalar_data.block_plain_allowed = 1; + emitter->scalar_data.single_quoted_allowed = 1; + emitter->scalar_data.block_allowed = 0; + return 1; +} + /* * Check if a scalar is valid. */ @@ -1501,6 +1527,12 @@ yaml_emitter_analyze_scalar(yaml_emitter_t *emitter, emitter->scalar_data.value = value; emitter->scalar_data.length = length; + emitter->scalar_data.multiline = 0; + emitter->scalar_data.flow_plain_allowed = 0; + emitter->scalar_data.block_plain_allowed = 1; + emitter->scalar_data.single_quoted_allowed = 1; + emitter->scalar_data.block_allowed = 0; + if (string.start == string.end) { emitter->scalar_data.multiline = 0; @@ -1706,6 +1738,10 @@ yaml_emitter_analyze_event(yaml_emitter_t *emitter, if (!yaml_emitter_analyze_tag(emitter, event->data.scalar.tag)) return 0; } + if (event->data.scalar.style == YAML_VERBATIM_SCALAR_STYLE) { + yaml_emitter_analyze_scalar_verbatim(emitter, + event->data.scalar.value, event->data.scalar.length); + } else if (!yaml_emitter_analyze_scalar(emitter, event->data.scalar.value, event->data.scalar.length)) return 0; @@ -1892,6 +1928,19 @@ yaml_emitter_write_tag_content(yaml_emitter_t *emitter, return 1; } +static int +yaml_emitter_write_verbatim_scalar(yaml_emitter_t *emitter, + yaml_char_t *value, size_t length, int allow_breaks) +{ + (void)allow_breaks; + yaml_string_t string; + STRING_ASSIGN(string, value, length); + while (string.pointer != string.end) { + if (!WRITE(emitter, string)) return 0; + } + return 1; +} + static int yaml_emitter_write_plain_scalar(yaml_emitter_t *emitter, yaml_char_t *value, size_t length, int allow_breaks) diff --git a/third_party/lua-yaml/lyaml.c b/third_party/lua-yaml/lyaml.c index 3614c5d2ff2074b980a37f6e6697b8c8fe9d24ee..5cc084206ae35559cf54bcb3542441c0354e9e62 100644 --- a/third_party/lua-yaml/lyaml.c +++ b/third_party/lua-yaml/lyaml.c @@ -439,7 +439,7 @@ static int dump_scalar(struct lua_yaml_dumper *dumper) { } else if (type == LUA_TUSERDATA) { str = dump_tostring(dumper->L, -1); len = strlen(str); - style = YAML_DOUBLE_QUOTED_SCALAR_STYLE; + style = YAML_VERBATIM_SCALAR_STYLE; } else if (type == LUA_TFUNCTION) { str = dump_tostring(dumper->L, -1); len = strlen(str); diff --git a/third_party/lua-yaml/yaml.h b/third_party/lua-yaml/yaml.h index 400cae1ead5953521529d9c90b6dce5d704cb5dd..9990682535c0ddb01e6133add32f10d2877efad9 100644 --- a/third_party/lua-yaml/yaml.h +++ b/third_party/lua-yaml/yaml.h @@ -165,6 +165,9 @@ typedef enum yaml_scalar_style_e { /** Let the emitter choose the style. */ YAML_ANY_SCALAR_STYLE, + /** The verbatim scalar style. */ + YAML_VERBATIM_SCALAR_STYLE, + /** The plain scalar style. */ YAML_PLAIN_SCALAR_STYLE,