219 Commits

Author SHA1 Message Date
Tina Müller
840b65c406 Fix closing flow sequence after explicit key
The fix in #295 was not correct.

    # cat a.yaml
    ---
    [?]

    # Before
    % ./tests/run-parser-test-suite --flow keep < a.yaml
    +STR
    +DOC ---
    +SEQ []
    +MAP {}
    -SEQ
    -DOC
    -STR

    % ./tests/run-loader a.yaml
    [1] Loading 'a.yaml': run-loader: loader.c:470: yaml_parser_load_sequence_end: Assertion `parser->document->nodes.start[index-1].type == YAML_SEQUENCE_NODE' failed.
    [1]    21446 IOT instruction (core dumped)  ./tests/run-loader a.yaml

    # After
    % ./tests/run-parser-test-suite --flow keep < a.yaml
    +STR
    +DOC ---
    +SEQ []
    +MAP {}
    =VAL :
    =VAL :
    -MAP
    -SEQ
    -DOC
    -STR

    % ./tests/run-loader a.yaml
    [1] Loading 'a.yaml': SUCCESS (1 documents)
2024-05-20 04:21:56 +02:00
Tina Müller
588eabff23 Handle closing flow sequence after explicit key
Currently after an explicit flow key '?' in a flow sequence, an immediately
following closing ] is ignored by the parser:

    % echo '[ ? ]' | ./tests/run-parser-test-suite --flow keep
    +STR
    +DOC
    +SEQ []
    +MAP {}
    =VAL :
    =VAL :
    -MAP
    Parse error: did not find expected ',' or ']'
    Line: 2 Column: 1
    % echo '[ ? ] ]' | ./tests/run-parser-test-suite --flow keep
    +STR
    +DOC
    +SEQ []
    +MAP {}
    =VAL :
    =VAL :
    -MAP
    -SEQ
    -DOC
    -STR

It is read correctly by the scanner as a YAML_FLOW_SEQUENCE_END_TOKEN, and
the flow_level is decreased. Then it is passed to the parser where it gets
ignored.
This leads to invalid YAML being accepted, and valid YAML resulting in an
error.

Also the flow_level is incorrectly decreased, so you can nest sequences
like that without running in to the MAX_NESTING_LEVEL.
2024-05-06 19:19:08 +02:00
Tina Müller
abd744ec2f ci: Install libtool on macOS
configure.ac:56: error: possibly undefined macro: AC_PROG_LIBTOOL
2024-04-28 17:59:32 +02:00
Ryuta Kamizono
1e66c1e13a Fix some typos 2024-04-08 18:33:30 +02:00
Tina Müller
51843fe482 Limit depth of nesting by default
Each nesting level increases the stack and the number of previous
starting events that the parser has to check.

The default maximum is 1000 and can be set via yaml_set_max_nest_level()

I also added new options to run-parser and run-parser-test-suite:
* --max-level: you can now try out this feature on the command line
* --show-error: By default, run-parser doesn't show errors. The new option
  helps with debugging
2024-04-08 18:12:59 +02:00
Tina Müller
fb57d89c04 Update Github actions 2024-04-02 00:57:46 +02:00
Tina Müller (tinita)
f8f760f738
ci: Fix build on macOS (#230)
add-path was deprecated, see
https://github.blog/changelog/2020-10-01-github-actions-deprecating-set-env-and-add-path-commands/
2021-11-10 18:03:02 +01:00
Tina Müller
acd6f6f014 Add workflow for creating release tarballs
Also minor cleanup of .github/workflows/main.yml
2020-06-22 10:21:14 -07:00
Tina Müller
2c891fc7a7 Changes for v0.2.5 release 0.2.5 2020-06-01 23:19:50 +02:00
Ingy döt Net
d12ce2aa88 Allow test suite runner to come from a different repo 2020-06-01 21:52:12 +02:00
Ingy döt Net
00780e83d2
A couple patches to improve test suite support (#191)
* Need newer bash and make for Macos testing

* Allow override of the run-test-suite branch
2020-06-01 21:33:39 +02:00
Tina Müller (tinita)
1008696708
Allow question marks in plain scalars in flow collections (#105)
See http://yaml.org/spec/1.1/#id907281

The question mark isn't mentioned as something special here, only
,[]{}

This commit will allow

[foo?bar]
[foo ? bar]

The PR does only change the behaviour when the question mark is in the middle or
at the end of the string, not at the beginning, e.g. [?foo] is handled by
a different part of the code.
2020-06-01 21:28:43 +02:00
Tina Müller (tinita)
7eb01976a0
Emitter: Don't output trailing space for empty scalar nodes (#186)
See issue #46

Passing emitter tests:
* 2XXW: Spec Example 2.25. Unordered Sets
* 5WE3: Spec Example 8.17. Explicit Block Mapping Entries
* 6KGN: Anchor for empty node
* 6XDY: Two document start markers
* 7W2P: Block Mapping with Missing Values
* 8KB6: Multiline plain flow mapping key without value
* 9BXH: Multiline doublequoted flow mapping key without value
* C2DT: Spec Example 7.18. Flow Mapping Adjacent Values
* JTV5: Block Mapping with Multiline Scalars
* KK5P: Various combinations of explicit block mappings
* LE5A: Spec Example 7.24. Flow Nodes
* UT92: Spec Example 9.4. Explicit Documents
* W42U: Spec Example 8.15. Block Sequence Entry Types
* W4TN: Spec Example 9.5. Directives Documents
* ZWK4: Key with anchor after missing explicit mapping value
2020-06-01 16:41:23 +02:00
Tina Müller (tinita)
6e2fa9786a
Emitter: Output space after an alias mapping key (#185)
Before:
    a: &b x
    *b: c

Now:
    a: &b x
    *b : c

Passing tests:
* 26DV: Whitespace around colon in mappings
* E76Z: Aliases in Implicit Block Mapping
* X38W: Aliases in Flow Objects

Test manually because `make test-suite` will overwrite changes in the skiplist:

    ./tests/run-parser-test-suite tests/run-test-suite/data/26DV/in.yaml | ./tests/run-emitter-test-suite
    ./tests/run-parser-test-suite tests/run-test-suite/data/E76Z/in.yaml | ./tests/run-emitter-test-suite
    ./tests/run-parser-test-suite tests/run-test-suite/data/X38W/in.yaml | ./tests/run-emitter-test-suite

Or edit tests/run-test-suite/test/blacklist/libyaml-emitter and do:

    (cd tests/run-test-suite; prove -lv test)

Also I added some newlines to yaml.h to help identifying states by number.
2020-06-01 11:55:55 +02:00
Tina Müller (tinita)
f41d3600d6 Flow indicators can not be part of local or shorthand tags (#179)
Spec: https://yaml.org/spec/1.2/spec.html#ns-tag-char
Test: https://github.com/yaml/yaml-test-suite/blob/master/test/WZ62.tml
2020-06-01 00:50:31 +02:00
Tina Müller (tinita)
cf53b3b5f9
Add -h and --flow (on|off|keep) to run-*-test-suite (#187)
With `--flow (keep|on)` run-parser-test-suite will output:

    +MAP {}
    +SEQ []

run-emitter-test-suite will then emit flow style collections if requested:

    echo 'foo: [bar, {x: y}]' | ./tests/run-parser-test-suite | ./tests/run-emitter-test-suite
    echo 'foo: [bar, {x: y}]' | ./tests/run-parser-test-suite \
        --flow keep | ./tests/run-emitter-test-suite --flow keep

Also: add that yaml_private.h include again that I had thrown out. Needed
for printing directives.
Wonder if there is a way to create a directive without using the private api.
2020-06-01 00:47:25 +02:00
Tina Müller (tinita)
9deee01508
Use GitHub Actions (#184) 2020-05-29 21:39:56 +02:00
Tina Müller
0032321756 Remove unnecessary include and malloc 2020-05-21 18:10:59 +02:00
Tina Müller
ce8357938c Add specific files back to .gitignore
Seems this was an oversight in d050fe3f3006b55edf33a2ef91019a67d6c3fb10.
We don't want to ignore all those file, but only the compiled executables.

Also added '/' to several files.
2020-05-21 18:04:15 +02:00
Tina Müller
fec20d3fe6 Output error position in run-parser-test-suite.c 2020-05-21 14:50:20 +02:00
Tina Müller
72e2f75277 Changes for v0.2.4 release 0.2.4 2020-04-19 13:15:10 +02:00
Tina Müller
3694a4af7d 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

==========================================================
2020-04-19 12:47:41 +02:00
Tina Müller
4e5cea6419 Allow emitting 1.2 directive
Before `1.1` was hardcoded in the emitter.

* Also add --directive option to run-emitter-test-suite
  Allows to easily test how output looks like if %YAML directives
  are output.
2020-04-19 12:47:41 +02:00
Tina Müller (tinita)
47bf3f086f
Add packaging/docker-dist to Makefile.am (#143) 2020-04-19 12:36:01 +02:00
Tina Müller
bf52902899 Changes for v0.2.3 release 0.2.3 2020-04-11 19:08:22 +02:00
Mark Sheahan
a1dc7861f8 Change dllexport controlling macro to use _WIN32
(provided by msvc compiler) instead of WIN32 (which is user configurable, and
omitted by default on some x64 builds); this fixes an issue with 64 bit windows
static library builds (#66)

Co-authored-by: Mark Sheahan <mark.sheahan@upguard.com>
2020-04-11 16:10:50 +02:00
Tina Müller (tinita)
3d5b7e65db
Support %YAML 1.2 directives (#172)
This will simply allow `%YAML 1.2` directives additionally to `%YAML 1.1`.
There is no change in behaviour.

See also #20

No changes are needed regarding tag directives.

In YAML 1.2 tag directives are for the following document only.
This is already implemented like that in libyaml.

We would rather have to fix the code if we want to have the correct behaviour
(global directives) in YAML 1.1. This would be a bit more complicated, as we
would have to save the default version and the current version in the parser
object.

New passing parser tests:

* 27NA: Spec Example 5.9. Directive Indicator
* 6ZKB: Spec Example 9.6. Stream
* 9DXL: Spec Example 9.6. Stream [1.3]
* RTP8: Spec Example 9.2. Document Markers

New failing error parser tests (before they were errors for the wrong reason):

* EB22: Missing document-end marker before directive
* RHX7: YAML directive without document end marker
2020-04-10 21:45:15 +02:00
Michael Drake
1b5bac0d3d
Avoid recursion in the document loader. (#127)
The document loading API (yaml_parser_load) was susseptable to a
stack overflow issue when given input data which opened many
mappings and/or sequences without closing them.

This was due to the use of recurion in the implementation.

With this change, we avoid recursion, and maintain our own loader
context stack on the heap.

The loader context contains a stack of document node indexes.
Each time a sequence or mapping start event is encountered,
the node index corrasponding to the event is pushed to the
stack.  Each time a sequence or mapping end event is encountered,
the corrasponding node's index is popped from the stack.

The yaml_parser_load_nodes() function sits on the event stream,
issuing events to the appropriate handlers by type.

When an event handler function constructs a node, it needs to
connect the new node to its parent (unless it's the root node).
This is where the loader context stack is used to find the
parent node.  The way that the new node is added to the tree
depends on whether the parent node is a mapping (with a
yaml_node_pair_t to fill), or a sequence (with a yaml_node_item_t).

Fixes: https://github.com/yaml/libyaml/issues/107
2020-04-10 21:30:28 +02:00
Ashutosh Chauhan
d0cb513b33
Fix missing token in example (#169) 2020-04-10 21:28:01 +02:00
Junde Yhi
e0b9e42d82
include/yaml.h: fix comments (#155)
* include/yaml.h: fix indentation of comments

* include/yaml.h: fix documentation style comment

* include/yaml.h: fix doc command returns

* include/yaml.h: fix typo
2020-03-28 18:17:28 +01:00
Liao Tonglang
9f9e4a29b7
Change cmake target name from libOFF.a to libyaml.a (#157)
option can only be ON or OFF. Use set() instead of option() to set default name of target.
2020-03-28 18:12:22 +01:00
Tina Müller (tinita)
fa1293a11f
Output document end marker after open ended scalars (#162) 2020-03-28 18:06:58 +01:00
Tina Müller
9afa10a8b0 Always output document end before directive (YAML 1.2 compatibility)
In YAML 1.1, the document end marker `...` is optional even if the next document starts with a directive:
https://github.com/yaml/pyyaml/blob/master/tests/data/spec-07-09.canonical
```
%YAML 1.1
---
!!str "foo"
%YAML 1.1
---
!!str "bar"
%YAML 1.1
---
!!str "baz"
```
It is only required if the scalar is "open ended", for example for plain scalars.

In YAML 1.2 the `...` marker is always required before a directive.

My suggestion would be to make the output 1.2 compatible. It will still be 1.1 compatible, so that shouldn't be a problem.

I believe this will also make it easier to fix #123 which was introduced with the last fixes regarding `open_ended`. I think I can make a fix for this soon after this issue is fixed.
Fixing #123 without this would be a bit more complicated.

If we do this, we also need to adjust PyYAML to behave the same.

Related issues/commits:
- https://github.com/yaml/libyaml/issues/60
- https://github.com/yaml/libyaml/pull/122
- 56400d9, 8ee83c0, 56f4b17
2020-03-26 22:28:39 +01:00
Tina Müller (tinita)
21429b031f Add CHANGES file (#159) 2020-03-26 22:24:32 +01:00
Ingy döt Net
42a370d6b0 Move appveyor.yml to .appveyor.yml 2020-03-26 22:20:56 +01:00
Ingy döt Net
94ecadc50e Makefile test-suite rule builds libyaml first 2019-12-21 11:11:26 -08:00
HonkingGoose
53f5b86823 Fix spelling 2019-07-25 11:59:16 +02:00
Michael Drake
aa2e89362f Squash a couple of warnings in example-deconstructor-alt
example-deconstructor-alt.c: In function ‘main’:
example-deconstructor-alt.c:649:51: warning:
  comparison between ‘yaml_sequence_style_t {aka enum yaml_sequence_style_e}’
  and ‘enum yaml_mapping_style_e’ [-Wenum-compare]

example-deconstructor-alt.c:650:36: warning:
  comparison between ‘yaml_sequence_style_t {aka enum yaml_sequence_style_e}’
  and ‘enum yaml_mapping_style_e’ [-Wenum-compare]
2019-06-06 20:20:58 +02:00
criptych
a21fc21697 Use pointer to const for strings that aren't/shouldn't be modified 2019-06-06 19:25:18 +02:00
林博仁(Buo-ren Lin)
b4ca139010 Fix typo in comment
s/intendation/indentation/

Signed-off-by: 林博仁(Buo-ren, Lin) <Buo.Ren.Lin@gmail.com>
2019-06-06 19:11:29 +02:00
SHIBATA Hiroshi
567353cee9 Fixed typo. 2019-06-06 19:08:57 +02:00
Tina Mueller
641adbf244 Fix typo in README 2019-06-06 15:28:02 +02:00
Tina Mueller
fce3597003 Add required packages to README 2019-06-06 14:52:59 +02:00
Ingy döt Net
690a781ef6 Update configure.ac for 0.2.2 0.2.2 2019-03-12 18:04:00 -07:00
Tina Müller
24a020a1a2 Changes for v0.2.2 release 2019-03-12 22:05:30 +01:00
Matt Davis
e7a5f0bc0b
Merge pull request #136 from nitzmahone/win_fixes
allow override of Windows static lib name
0.2.2-pre3
2019-03-04 08:03:10 -08:00
Matt Davis
99e0a150ff allow override of Windows static lib name
* also changed name back to original default of yaml, as the change in #10 to `yaml_static` broke things that relied on that
2019-03-01 17:32:13 -08:00
Tina Müller
78e6ebfb20 Remove stdbool
Might not be available everywhere
0.2.2-pre2
2019-02-28 19:50:04 +01:00
Tina Müller
1560fc82ad Make declarations before other statements 2019-02-28 19:40:53 +01:00
Marty E. Plummer
85d1f168ef appveyor.yml: fix Release build
I suspect this this was a bit of an oversight when first setting up
appveyor for Windows/msvc, but 'release' does not match any target
cmake knows about; 'Release', however, does.

Signed-off-by: Marty E. Plummer <hanetzer@protonmail.com>
2018-07-19 14:53:50 -07:00