annotate vendor/gopkg.in/yaml.v3/scannerc.go @ 82:1b27391363d1 draft

Add posthook examples Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Tue, 26 Mar 2024 02:14:25 +0000
parents d8727551f403
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
74
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2 // Copyright (c) 2011-2019 Canonical Ltd
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3 // Copyright (c) 2006-2010 Kirill Simonov
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
4 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
5 // Permission is hereby granted, free of charge, to any person obtaining a copy of
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
6 // this software and associated documentation files (the "Software"), to deal in
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
7 // the Software without restriction, including without limitation the rights to
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
8 // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
9 // of the Software, and to permit persons to whom the Software is furnished to do
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
10 // so, subject to the following conditions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
11 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
12 // The above copyright notice and this permission notice shall be included in all
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
13 // copies or substantial portions of the Software.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
14 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
21 // SOFTWARE.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
22
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
23 package yaml
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
24
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
25 import (
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
26 "bytes"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
27 "fmt"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
28 )
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
29
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
30 // Introduction
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
31 // ************
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
32 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
33 // The following notes assume that you are familiar with the YAML specification
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
34 // (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
35 // some cases we are less restrictive that it requires.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
36 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
37 // The process of transforming a YAML stream into a sequence of events is
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
38 // divided on two steps: Scanning and Parsing.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
39 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
40 // The Scanner transforms the input stream into a sequence of tokens, while the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
41 // parser transform the sequence of tokens produced by the Scanner into a
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
42 // sequence of parsing events.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
43 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
44 // The Scanner is rather clever and complicated. The Parser, on the contrary,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
45 // is a straightforward implementation of a recursive-descendant parser (or,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
46 // LL(1) parser, as it is usually called).
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
47 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
48 // Actually there are two issues of Scanning that might be called "clever", the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
49 // rest is quite straightforward. The issues are "block collection start" and
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
50 // "simple keys". Both issues are explained below in details.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
51 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
52 // Here the Scanning step is explained and implemented. We start with the list
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
53 // of all the tokens produced by the Scanner together with short descriptions.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
54 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
55 // Now, tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
56 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
57 // STREAM-START(encoding) # The stream start.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
58 // STREAM-END # The stream end.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
59 // VERSION-DIRECTIVE(major,minor) # The '%YAML' directive.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
60 // TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
61 // DOCUMENT-START # '---'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
62 // DOCUMENT-END # '...'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
63 // BLOCK-SEQUENCE-START # Indentation increase denoting a block
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
64 // BLOCK-MAPPING-START # sequence or a block mapping.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
65 // BLOCK-END # Indentation decrease.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
66 // FLOW-SEQUENCE-START # '['
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
67 // FLOW-SEQUENCE-END # ']'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
68 // BLOCK-SEQUENCE-START # '{'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
69 // BLOCK-SEQUENCE-END # '}'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
70 // BLOCK-ENTRY # '-'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
71 // FLOW-ENTRY # ','
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
72 // KEY # '?' or nothing (simple keys).
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
73 // VALUE # ':'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
74 // ALIAS(anchor) # '*anchor'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
75 // ANCHOR(anchor) # '&anchor'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
76 // TAG(handle,suffix) # '!handle!suffix'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
77 // SCALAR(value,style) # A scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
78 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
79 // The following two tokens are "virtual" tokens denoting the beginning and the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
80 // end of the stream:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
81 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
82 // STREAM-START(encoding)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
83 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
84 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
85 // We pass the information about the input stream encoding with the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
86 // STREAM-START token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
87 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
88 // The next two tokens are responsible for tags:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
89 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
90 // VERSION-DIRECTIVE(major,minor)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
91 // TAG-DIRECTIVE(handle,prefix)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
92 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
93 // Example:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
94 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
95 // %YAML 1.1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
96 // %TAG ! !foo
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
97 // %TAG !yaml! tag:yaml.org,2002:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
98 // ---
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
99 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
100 // The correspoding sequence of tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
101 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
102 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
103 // VERSION-DIRECTIVE(1,1)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
104 // TAG-DIRECTIVE("!","!foo")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
105 // TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
106 // DOCUMENT-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
107 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
108 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
109 // Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
110 // line.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
111 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
112 // The document start and end indicators are represented by:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
113 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
114 // DOCUMENT-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
115 // DOCUMENT-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
116 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
117 // Note that if a YAML stream contains an implicit document (without '---'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
118 // and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
119 // produced.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
120 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
121 // In the following examples, we present whole documents together with the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
122 // produced tokens.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
123 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
124 // 1. An implicit document:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
125 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
126 // 'a scalar'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
127 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
128 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
129 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
130 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
131 // SCALAR("a scalar",single-quoted)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
132 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
133 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
134 // 2. An explicit document:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
135 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
136 // ---
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
137 // 'a scalar'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
138 // ...
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
139 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
140 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
141 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
142 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
143 // DOCUMENT-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
144 // SCALAR("a scalar",single-quoted)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
145 // DOCUMENT-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
146 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
147 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
148 // 3. Several documents in a stream:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
149 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
150 // 'a scalar'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
151 // ---
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
152 // 'another scalar'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
153 // ---
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
154 // 'yet another scalar'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
155 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
156 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
157 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
158 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
159 // SCALAR("a scalar",single-quoted)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
160 // DOCUMENT-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
161 // SCALAR("another scalar",single-quoted)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
162 // DOCUMENT-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
163 // SCALAR("yet another scalar",single-quoted)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
164 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
165 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
166 // We have already introduced the SCALAR token above. The following tokens are
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
167 // used to describe aliases, anchors, tag, and scalars:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
168 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
169 // ALIAS(anchor)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
170 // ANCHOR(anchor)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
171 // TAG(handle,suffix)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
172 // SCALAR(value,style)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
173 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
174 // The following series of examples illustrate the usage of these tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
175 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
176 // 1. A recursive sequence:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
177 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
178 // &A [ *A ]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
179 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
180 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
181 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
182 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
183 // ANCHOR("A")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
184 // FLOW-SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
185 // ALIAS("A")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
186 // FLOW-SEQUENCE-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
187 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
188 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
189 // 2. A tagged scalar:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
190 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
191 // !!float "3.14" # A good approximation.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
192 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
193 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
194 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
195 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
196 // TAG("!!","float")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
197 // SCALAR("3.14",double-quoted)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
198 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
199 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
200 // 3. Various scalar styles:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
201 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
202 // --- # Implicit empty plain scalars do not produce tokens.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
203 // --- a plain scalar
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
204 // --- 'a single-quoted scalar'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
205 // --- "a double-quoted scalar"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
206 // --- |-
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
207 // a literal scalar
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
208 // --- >-
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
209 // a folded
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
210 // scalar
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
211 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
212 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
213 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
214 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
215 // DOCUMENT-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
216 // DOCUMENT-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
217 // SCALAR("a plain scalar",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
218 // DOCUMENT-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
219 // SCALAR("a single-quoted scalar",single-quoted)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
220 // DOCUMENT-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
221 // SCALAR("a double-quoted scalar",double-quoted)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
222 // DOCUMENT-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
223 // SCALAR("a literal scalar",literal)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
224 // DOCUMENT-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
225 // SCALAR("a folded scalar",folded)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
226 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
227 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
228 // Now it's time to review collection-related tokens. We will start with
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
229 // flow collections:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
230 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
231 // FLOW-SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
232 // FLOW-SEQUENCE-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
233 // FLOW-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
234 // FLOW-MAPPING-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
235 // FLOW-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
236 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
237 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
238 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
239 // The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
240 // FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
241 // correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
242 // indicators '?' and ':', which are used for denoting mapping keys and values,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
243 // are represented by the KEY and VALUE tokens.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
244 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
245 // The following examples show flow collections:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
246 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
247 // 1. A flow sequence:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
248 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
249 // [item 1, item 2, item 3]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
250 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
251 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
252 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
253 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
254 // FLOW-SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
255 // SCALAR("item 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
256 // FLOW-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
257 // SCALAR("item 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
258 // FLOW-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
259 // SCALAR("item 3",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
260 // FLOW-SEQUENCE-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
261 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
262 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
263 // 2. A flow mapping:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
264 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
265 // {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
266 // a simple key: a value, # Note that the KEY token is produced.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
267 // ? a complex key: another value,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
268 // }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
269 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
270 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
271 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
272 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
273 // FLOW-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
274 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
275 // SCALAR("a simple key",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
276 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
277 // SCALAR("a value",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
278 // FLOW-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
279 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
280 // SCALAR("a complex key",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
281 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
282 // SCALAR("another value",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
283 // FLOW-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
284 // FLOW-MAPPING-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
285 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
286 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
287 // A simple key is a key which is not denoted by the '?' indicator. Note that
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
288 // the Scanner still produce the KEY token whenever it encounters a simple key.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
289 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
290 // For scanning block collections, the following tokens are used (note that we
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
291 // repeat KEY and VALUE here):
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
292 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
293 // BLOCK-SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
294 // BLOCK-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
295 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
296 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
297 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
298 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
299 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
300 // The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
301 // increase that precedes a block collection (cf. the INDENT token in Python).
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
302 // The token BLOCK-END denote indentation decrease that ends a block collection
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
303 // (cf. the DEDENT token in Python). However YAML has some syntax pecularities
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
304 // that makes detections of these tokens more complex.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
305 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
306 // The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
307 // '-', '?', and ':' correspondingly.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
308 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
309 // The following examples show how the tokens BLOCK-SEQUENCE-START,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
310 // BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
311 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
312 // 1. Block sequences:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
313 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
314 // - item 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
315 // - item 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
316 // -
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
317 // - item 3.1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
318 // - item 3.2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
319 // -
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
320 // key 1: value 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
321 // key 2: value 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
322 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
323 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
324 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
325 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
326 // BLOCK-SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
327 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
328 // SCALAR("item 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
329 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
330 // SCALAR("item 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
331 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
332 // BLOCK-SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
333 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
334 // SCALAR("item 3.1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
335 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
336 // SCALAR("item 3.2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
337 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
338 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
339 // BLOCK-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
340 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
341 // SCALAR("key 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
342 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
343 // SCALAR("value 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
344 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
345 // SCALAR("key 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
346 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
347 // SCALAR("value 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
348 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
349 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
350 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
351 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
352 // 2. Block mappings:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
353 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
354 // a simple key: a value # The KEY token is produced here.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
355 // ? a complex key
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
356 // : another value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
357 // a mapping:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
358 // key 1: value 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
359 // key 2: value 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
360 // a sequence:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
361 // - item 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
362 // - item 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
363 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
364 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
365 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
366 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
367 // BLOCK-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
368 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
369 // SCALAR("a simple key",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
370 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
371 // SCALAR("a value",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
372 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
373 // SCALAR("a complex key",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
374 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
375 // SCALAR("another value",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
376 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
377 // SCALAR("a mapping",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
378 // BLOCK-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
379 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
380 // SCALAR("key 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
381 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
382 // SCALAR("value 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
383 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
384 // SCALAR("key 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
385 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
386 // SCALAR("value 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
387 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
388 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
389 // SCALAR("a sequence",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
390 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
391 // BLOCK-SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
392 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
393 // SCALAR("item 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
394 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
395 // SCALAR("item 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
396 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
397 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
398 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
399 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
400 // YAML does not always require to start a new block collection from a new
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
401 // line. If the current line contains only '-', '?', and ':' indicators, a new
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
402 // block collection may start at the current line. The following examples
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
403 // illustrate this case:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
404 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
405 // 1. Collections in a sequence:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
406 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
407 // - - item 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
408 // - item 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
409 // - key 1: value 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
410 // key 2: value 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
411 // - ? complex key
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
412 // : complex value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
413 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
414 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
415 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
416 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
417 // BLOCK-SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
418 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
419 // BLOCK-SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
420 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
421 // SCALAR("item 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
422 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
423 // SCALAR("item 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
424 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
425 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
426 // BLOCK-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
427 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
428 // SCALAR("key 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
429 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
430 // SCALAR("value 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
431 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
432 // SCALAR("key 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
433 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
434 // SCALAR("value 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
435 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
436 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
437 // BLOCK-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
438 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
439 // SCALAR("complex key")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
440 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
441 // SCALAR("complex value")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
442 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
443 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
444 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
445 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
446 // 2. Collections in a mapping:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
447 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
448 // ? a sequence
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
449 // : - item 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
450 // - item 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
451 // ? a mapping
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
452 // : key 1: value 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
453 // key 2: value 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
454 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
455 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
456 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
457 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
458 // BLOCK-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
459 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
460 // SCALAR("a sequence",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
461 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
462 // BLOCK-SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
463 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
464 // SCALAR("item 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
465 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
466 // SCALAR("item 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
467 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
468 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
469 // SCALAR("a mapping",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
470 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
471 // BLOCK-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
472 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
473 // SCALAR("key 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
474 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
475 // SCALAR("value 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
476 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
477 // SCALAR("key 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
478 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
479 // SCALAR("value 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
480 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
481 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
482 // STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
483 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
484 // YAML also permits non-indented sequences if they are included into a block
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
485 // mapping. In this case, the token BLOCK-SEQUENCE-START is not produced:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
486 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
487 // key:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
488 // - item 1 # BLOCK-SEQUENCE-START is NOT produced here.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
489 // - item 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
490 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
491 // Tokens:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
492 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
493 // STREAM-START(utf-8)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
494 // BLOCK-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
495 // KEY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
496 // SCALAR("key",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
497 // VALUE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
498 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
499 // SCALAR("item 1",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
500 // BLOCK-ENTRY
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
501 // SCALAR("item 2",plain)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
502 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
503 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
504
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
505 // Ensure that the buffer contains the required number of characters.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
506 // Return true on success, false on failure (reader error or memory error).
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
507 func cache(parser *yaml_parser_t, length int) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
508 // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
509 return parser.unread >= length || yaml_parser_update_buffer(parser, length)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
510 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
511
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
512 // Advance the buffer pointer.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
513 func skip(parser *yaml_parser_t) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
514 if !is_blank(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
515 parser.newlines = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
516 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
517 parser.mark.index++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
518 parser.mark.column++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
519 parser.unread--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
520 parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
521 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
522
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
523 func skip_line(parser *yaml_parser_t) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
524 if is_crlf(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
525 parser.mark.index += 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
526 parser.mark.column = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
527 parser.mark.line++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
528 parser.unread -= 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
529 parser.buffer_pos += 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
530 parser.newlines++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
531 } else if is_break(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
532 parser.mark.index++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
533 parser.mark.column = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
534 parser.mark.line++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
535 parser.unread--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
536 parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
537 parser.newlines++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
538 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
539 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
540
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
541 // Copy a character to a string buffer and advance pointers.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
542 func read(parser *yaml_parser_t, s []byte) []byte {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
543 if !is_blank(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
544 parser.newlines = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
545 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
546 w := width(parser.buffer[parser.buffer_pos])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
547 if w == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
548 panic("invalid character sequence")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
549 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
550 if len(s) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
551 s = make([]byte, 0, 32)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
552 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
553 if w == 1 && len(s)+w <= cap(s) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
554 s = s[:len(s)+1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
555 s[len(s)-1] = parser.buffer[parser.buffer_pos]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
556 parser.buffer_pos++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
557 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
558 s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
559 parser.buffer_pos += w
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
560 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
561 parser.mark.index++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
562 parser.mark.column++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
563 parser.unread--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
564 return s
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
565 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
566
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
567 // Copy a line break character to a string buffer and advance pointers.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
568 func read_line(parser *yaml_parser_t, s []byte) []byte {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
569 buf := parser.buffer
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
570 pos := parser.buffer_pos
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
571 switch {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
572 case buf[pos] == '\r' && buf[pos+1] == '\n':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
573 // CR LF . LF
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
574 s = append(s, '\n')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
575 parser.buffer_pos += 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
576 parser.mark.index++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
577 parser.unread--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
578 case buf[pos] == '\r' || buf[pos] == '\n':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
579 // CR|LF . LF
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
580 s = append(s, '\n')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
581 parser.buffer_pos += 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
582 case buf[pos] == '\xC2' && buf[pos+1] == '\x85':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
583 // NEL . LF
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
584 s = append(s, '\n')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
585 parser.buffer_pos += 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
586 case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'):
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
587 // LS|PS . LS|PS
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
588 s = append(s, buf[parser.buffer_pos:pos+3]...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
589 parser.buffer_pos += 3
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
590 default:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
591 return s
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
592 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
593 parser.mark.index++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
594 parser.mark.column = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
595 parser.mark.line++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
596 parser.unread--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
597 parser.newlines++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
598 return s
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
599 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
600
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
601 // Get the next token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
602 func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
603 // Erase the token object.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
604 *token = yaml_token_t{} // [Go] Is this necessary?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
605
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
606 // No tokens after STREAM-END or error.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
607 if parser.stream_end_produced || parser.error != yaml_NO_ERROR {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
608 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
609 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
610
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
611 // Ensure that the tokens queue contains enough tokens.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
612 if !parser.token_available {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
613 if !yaml_parser_fetch_more_tokens(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
614 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
615 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
616 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
617
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
618 // Fetch the next token from the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
619 *token = parser.tokens[parser.tokens_head]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
620 parser.tokens_head++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
621 parser.tokens_parsed++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
622 parser.token_available = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
623
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
624 if token.typ == yaml_STREAM_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
625 parser.stream_end_produced = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
626 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
627 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
628 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
629
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
630 // Set the scanner error and return false.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
631 func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
632 parser.error = yaml_SCANNER_ERROR
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
633 parser.context = context
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
634 parser.context_mark = context_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
635 parser.problem = problem
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
636 parser.problem_mark = parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
637 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
638 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
639
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
640 func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
641 context := "while parsing a tag"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
642 if directive {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
643 context = "while parsing a %TAG directive"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
644 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
645 return yaml_parser_set_scanner_error(parser, context, context_mark, problem)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
646 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
647
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
648 func trace(args ...interface{}) func() {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
649 pargs := append([]interface{}{"+++"}, args...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
650 fmt.Println(pargs...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
651 pargs = append([]interface{}{"---"}, args...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
652 return func() { fmt.Println(pargs...) }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
653 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
654
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
655 // Ensure that the tokens queue contains at least one token which can be
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
656 // returned to the Parser.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
657 func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
658 // While we need more tokens to fetch, do it.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
659 for {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
660 // [Go] The comment parsing logic requires a lookahead of two tokens
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
661 // so that foot comments may be parsed in time of associating them
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
662 // with the tokens that are parsed before them, and also for line
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
663 // comments to be transformed into head comments in some edge cases.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
664 if parser.tokens_head < len(parser.tokens)-2 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
665 // If a potential simple key is at the head position, we need to fetch
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
666 // the next token to disambiguate it.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
667 head_tok_idx, ok := parser.simple_keys_by_tok[parser.tokens_parsed]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
668 if !ok {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
669 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
670 } else if valid, ok := yaml_simple_key_is_valid(parser, &parser.simple_keys[head_tok_idx]); !ok {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
671 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
672 } else if !valid {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
673 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
674 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
675 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
676 // Fetch the next token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
677 if !yaml_parser_fetch_next_token(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
678 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
679 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
680 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
681
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
682 parser.token_available = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
683 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
684 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
685
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
686 // The dispatcher for token fetchers.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
687 func yaml_parser_fetch_next_token(parser *yaml_parser_t) (ok bool) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
688 // Ensure that the buffer is initialized.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
689 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
690 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
691 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
692
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
693 // Check if we just started scanning. Fetch STREAM-START then.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
694 if !parser.stream_start_produced {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
695 return yaml_parser_fetch_stream_start(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
696 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
697
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
698 scan_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
699
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
700 // Eat whitespaces and comments until we reach the next token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
701 if !yaml_parser_scan_to_next_token(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
702 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
703 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
704
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
705 // [Go] While unrolling indents, transform the head comments of prior
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
706 // indentation levels observed after scan_start into foot comments at
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
707 // the respective indexes.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
708
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
709 // Check the indentation level against the current column.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
710 if !yaml_parser_unroll_indent(parser, parser.mark.column, scan_mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
711 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
712 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
713
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
714 // Ensure that the buffer contains at least 4 characters. 4 is the length
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
715 // of the longest indicators ('--- ' and '... ').
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
716 if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
717 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
718 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
719
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
720 // Is it the end of the stream?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
721 if is_z(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
722 return yaml_parser_fetch_stream_end(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
723 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
724
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
725 // Is it a directive?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
726 if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
727 return yaml_parser_fetch_directive(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
728 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
729
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
730 buf := parser.buffer
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
731 pos := parser.buffer_pos
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
732
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
733 // Is it the document start indicator?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
734 if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
735 return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
736 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
737
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
738 // Is it the document end indicator?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
739 if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
740 return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
741 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
742
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
743 comment_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
744 if len(parser.tokens) > 0 && (parser.flow_level == 0 && buf[pos] == ':' || parser.flow_level > 0 && buf[pos] == ',') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
745 // Associate any following comments with the prior token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
746 comment_mark = parser.tokens[len(parser.tokens)-1].start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
747 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
748 defer func() {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
749 if !ok {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
750 return
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
751 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
752 if len(parser.tokens) > 0 && parser.tokens[len(parser.tokens)-1].typ == yaml_BLOCK_ENTRY_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
753 // Sequence indicators alone have no line comments. It becomes
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
754 // a head comment for whatever follows.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
755 return
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
756 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
757 if !yaml_parser_scan_line_comment(parser, comment_mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
758 ok = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
759 return
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
760 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
761 }()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
762
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
763 // Is it the flow sequence start indicator?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
764 if buf[pos] == '[' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
765 return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
766 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
767
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
768 // Is it the flow mapping start indicator?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
769 if parser.buffer[parser.buffer_pos] == '{' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
770 return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
771 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
772
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
773 // Is it the flow sequence end indicator?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
774 if parser.buffer[parser.buffer_pos] == ']' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
775 return yaml_parser_fetch_flow_collection_end(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
776 yaml_FLOW_SEQUENCE_END_TOKEN)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
777 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
778
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
779 // Is it the flow mapping end indicator?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
780 if parser.buffer[parser.buffer_pos] == '}' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
781 return yaml_parser_fetch_flow_collection_end(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
782 yaml_FLOW_MAPPING_END_TOKEN)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
783 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
784
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
785 // Is it the flow entry indicator?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
786 if parser.buffer[parser.buffer_pos] == ',' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
787 return yaml_parser_fetch_flow_entry(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
788 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
789
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
790 // Is it the block entry indicator?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
791 if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
792 return yaml_parser_fetch_block_entry(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
793 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
794
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
795 // Is it the key indicator?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
796 if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
797 return yaml_parser_fetch_key(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
798 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
799
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
800 // Is it the value indicator?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
801 if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
802 return yaml_parser_fetch_value(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
803 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
804
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
805 // Is it an alias?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
806 if parser.buffer[parser.buffer_pos] == '*' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
807 return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
808 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
809
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
810 // Is it an anchor?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
811 if parser.buffer[parser.buffer_pos] == '&' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
812 return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
813 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
814
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
815 // Is it a tag?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
816 if parser.buffer[parser.buffer_pos] == '!' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
817 return yaml_parser_fetch_tag(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
818 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
819
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
820 // Is it a literal scalar?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
821 if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
822 return yaml_parser_fetch_block_scalar(parser, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
823 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
824
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
825 // Is it a folded scalar?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
826 if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
827 return yaml_parser_fetch_block_scalar(parser, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
828 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
829
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
830 // Is it a single-quoted scalar?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
831 if parser.buffer[parser.buffer_pos] == '\'' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
832 return yaml_parser_fetch_flow_scalar(parser, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
833 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
834
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
835 // Is it a double-quoted scalar?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
836 if parser.buffer[parser.buffer_pos] == '"' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
837 return yaml_parser_fetch_flow_scalar(parser, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
838 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
839
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
840 // Is it a plain scalar?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
841 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
842 // A plain scalar may start with any non-blank characters except
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
843 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
844 // '-', '?', ':', ',', '[', ']', '{', '}',
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
845 // '#', '&', '*', '!', '|', '>', '\'', '\"',
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
846 // '%', '@', '`'.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
847 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
848 // In the block context (and, for the '-' indicator, in the flow context
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
849 // too), it may also start with the characters
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
850 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
851 // '-', '?', ':'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
852 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
853 // if it is followed by a non-space character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
854 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
855 // The last rule is more restrictive than the specification requires.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
856 // [Go] TODO Make this logic more reasonable.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
857 //switch parser.buffer[parser.buffer_pos] {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
858 //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
859 //}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
860 if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
861 parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
862 parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
863 parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
864 parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
865 parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
866 parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
867 parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
868 parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
869 parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
870 (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
871 (parser.flow_level == 0 &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
872 (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
873 !is_blankz(parser.buffer, parser.buffer_pos+1)) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
874 return yaml_parser_fetch_plain_scalar(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
875 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
876
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
877 // If we don't determine the token type so far, it is an error.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
878 return yaml_parser_set_scanner_error(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
879 "while scanning for the next token", parser.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
880 "found character that cannot start any token")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
881 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
882
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
883 func yaml_simple_key_is_valid(parser *yaml_parser_t, simple_key *yaml_simple_key_t) (valid, ok bool) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
884 if !simple_key.possible {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
885 return false, true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
886 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
887
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
888 // The 1.2 specification says:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
889 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
890 // "If the ? indicator is omitted, parsing needs to see past the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
891 // implicit key to recognize it as such. To limit the amount of
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
892 // lookahead required, the “:” indicator must appear at most 1024
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
893 // Unicode characters beyond the start of the key. In addition, the key
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
894 // is restricted to a single line."
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
895 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
896 if simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
897 // Check if the potential simple key to be removed is required.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
898 if simple_key.required {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
899 return false, yaml_parser_set_scanner_error(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
900 "while scanning a simple key", simple_key.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
901 "could not find expected ':'")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
902 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
903 simple_key.possible = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
904 return false, true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
905 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
906 return true, true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
907 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
908
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
909 // Check if a simple key may start at the current position and add it if
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
910 // needed.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
911 func yaml_parser_save_simple_key(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
912 // A simple key is required at the current position if the scanner is in
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
913 // the block context and the current column coincides with the indentation
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
914 // level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
915
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
916 required := parser.flow_level == 0 && parser.indent == parser.mark.column
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
917
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
918 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
919 // If the current position may start a simple key, save it.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
920 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
921 if parser.simple_key_allowed {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
922 simple_key := yaml_simple_key_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
923 possible: true,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
924 required: required,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
925 token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
926 mark: parser.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
927 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
928
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
929 if !yaml_parser_remove_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
930 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
931 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
932 parser.simple_keys[len(parser.simple_keys)-1] = simple_key
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
933 parser.simple_keys_by_tok[simple_key.token_number] = len(parser.simple_keys) - 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
934 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
935 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
936 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
937
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
938 // Remove a potential simple key at the current flow level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
939 func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
940 i := len(parser.simple_keys) - 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
941 if parser.simple_keys[i].possible {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
942 // If the key is required, it is an error.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
943 if parser.simple_keys[i].required {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
944 return yaml_parser_set_scanner_error(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
945 "while scanning a simple key", parser.simple_keys[i].mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
946 "could not find expected ':'")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
947 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
948 // Remove the key from the stack.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
949 parser.simple_keys[i].possible = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
950 delete(parser.simple_keys_by_tok, parser.simple_keys[i].token_number)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
951 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
952 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
953 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
954
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
955 // max_flow_level limits the flow_level
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
956 const max_flow_level = 10000
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
957
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
958 // Increase the flow level and resize the simple key list if needed.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
959 func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
960 // Reset the simple key on the next level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
961 parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
962 possible: false,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
963 required: false,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
964 token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
965 mark: parser.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
966 })
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
967
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
968 // Increase the flow level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
969 parser.flow_level++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
970 if parser.flow_level > max_flow_level {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
971 return yaml_parser_set_scanner_error(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
972 "while increasing flow level", parser.simple_keys[len(parser.simple_keys)-1].mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
973 fmt.Sprintf("exceeded max depth of %d", max_flow_level))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
974 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
975 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
976 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
977
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
978 // Decrease the flow level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
979 func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
980 if parser.flow_level > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
981 parser.flow_level--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
982 last := len(parser.simple_keys) - 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
983 delete(parser.simple_keys_by_tok, parser.simple_keys[last].token_number)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
984 parser.simple_keys = parser.simple_keys[:last]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
985 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
986 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
987 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
988
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
989 // max_indents limits the indents stack size
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
990 const max_indents = 10000
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
991
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
992 // Push the current indentation level to the stack and set the new level
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
993 // the current column is greater than the indentation level. In this case,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
994 // append or insert the specified token into the token queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
995 func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
996 // In the flow context, do nothing.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
997 if parser.flow_level > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
998 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
999 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1000
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1001 if parser.indent < column {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1002 // Push the current indentation level to the stack and set the new
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1003 // indentation level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1004 parser.indents = append(parser.indents, parser.indent)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1005 parser.indent = column
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1006 if len(parser.indents) > max_indents {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1007 return yaml_parser_set_scanner_error(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1008 "while increasing indent level", parser.simple_keys[len(parser.simple_keys)-1].mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1009 fmt.Sprintf("exceeded max depth of %d", max_indents))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1010 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1011
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1012 // Create a token and insert it into the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1013 token := yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1014 typ: typ,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1015 start_mark: mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1016 end_mark: mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1017 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1018 if number > -1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1019 number -= parser.tokens_parsed
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1020 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1021 yaml_insert_token(parser, number, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1022 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1023 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1024 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1025
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1026 // Pop indentation levels from the indents stack until the current level
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1027 // becomes less or equal to the column. For each indentation level, append
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1028 // the BLOCK-END token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1029 func yaml_parser_unroll_indent(parser *yaml_parser_t, column int, scan_mark yaml_mark_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1030 // In the flow context, do nothing.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1031 if parser.flow_level > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1032 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1033 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1034
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1035 block_mark := scan_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1036 block_mark.index--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1037
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1038 // Loop through the indentation levels in the stack.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1039 for parser.indent > column {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1040
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1041 // [Go] Reposition the end token before potential following
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1042 // foot comments of parent blocks. For that, search
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1043 // backwards for recent comments that were at the same
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1044 // indent as the block that is ending now.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1045 stop_index := block_mark.index
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1046 for i := len(parser.comments) - 1; i >= 0; i-- {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1047 comment := &parser.comments[i]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1048
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1049 if comment.end_mark.index < stop_index {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1050 // Don't go back beyond the start of the comment/whitespace scan, unless column < 0.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1051 // If requested indent column is < 0, then the document is over and everything else
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1052 // is a foot anyway.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1053 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1054 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1055 if comment.start_mark.column == parser.indent+1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1056 // This is a good match. But maybe there's a former comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1057 // at that same indent level, so keep searching.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1058 block_mark = comment.start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1059 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1060
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1061 // While the end of the former comment matches with
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1062 // the start of the following one, we know there's
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1063 // nothing in between and scanning is still safe.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1064 stop_index = comment.scan_mark.index
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1065 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1066
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1067 // Create a token and append it to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1068 token := yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1069 typ: yaml_BLOCK_END_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1070 start_mark: block_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1071 end_mark: block_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1072 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1073 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1074
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1075 // Pop the indentation level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1076 parser.indent = parser.indents[len(parser.indents)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1077 parser.indents = parser.indents[:len(parser.indents)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1078 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1079 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1080 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1081
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1082 // Initialize the scanner and produce the STREAM-START token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1083 func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1084
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1085 // Set the initial indentation.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1086 parser.indent = -1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1087
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1088 // Initialize the simple key stack.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1089 parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1090
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1091 parser.simple_keys_by_tok = make(map[int]int)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1092
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1093 // A simple key is allowed at the beginning of the stream.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1094 parser.simple_key_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1095
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1096 // We have started.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1097 parser.stream_start_produced = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1098
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1099 // Create the STREAM-START token and append it to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1100 token := yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1101 typ: yaml_STREAM_START_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1102 start_mark: parser.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1103 end_mark: parser.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1104 encoding: parser.encoding,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1105 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1106 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1107 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1108 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1109
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1110 // Produce the STREAM-END token and shut down the scanner.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1111 func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1112
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1113 // Force new line.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1114 if parser.mark.column != 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1115 parser.mark.column = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1116 parser.mark.line++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1117 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1118
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1119 // Reset the indentation level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1120 if !yaml_parser_unroll_indent(parser, -1, parser.mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1121 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1122 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1123
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1124 // Reset simple keys.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1125 if !yaml_parser_remove_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1126 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1127 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1128
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1129 parser.simple_key_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1130
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1131 // Create the STREAM-END token and append it to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1132 token := yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1133 typ: yaml_STREAM_END_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1134 start_mark: parser.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1135 end_mark: parser.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1136 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1137 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1138 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1139 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1140
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1141 // Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1142 func yaml_parser_fetch_directive(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1143 // Reset the indentation level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1144 if !yaml_parser_unroll_indent(parser, -1, parser.mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1145 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1146 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1147
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1148 // Reset simple keys.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1149 if !yaml_parser_remove_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1150 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1151 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1152
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1153 parser.simple_key_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1154
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1155 // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1156 token := yaml_token_t{}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1157 if !yaml_parser_scan_directive(parser, &token) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1158 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1159 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1160 // Append the token to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1161 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1162 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1163 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1164
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1165 // Produce the DOCUMENT-START or DOCUMENT-END token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1166 func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1167 // Reset the indentation level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1168 if !yaml_parser_unroll_indent(parser, -1, parser.mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1169 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1170 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1171
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1172 // Reset simple keys.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1173 if !yaml_parser_remove_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1174 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1175 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1176
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1177 parser.simple_key_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1178
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1179 // Consume the token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1180 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1181
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1182 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1183 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1184 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1185
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1186 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1187
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1188 // Create the DOCUMENT-START or DOCUMENT-END token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1189 token := yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1190 typ: typ,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1191 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1192 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1193 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1194 // Append the token to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1195 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1196 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1197 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1198
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1199 // Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1200 func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1201
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1202 // The indicators '[' and '{' may start a simple key.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1203 if !yaml_parser_save_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1204 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1205 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1206
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1207 // Increase the flow level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1208 if !yaml_parser_increase_flow_level(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1209 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1210 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1211
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1212 // A simple key may follow the indicators '[' and '{'.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1213 parser.simple_key_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1214
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1215 // Consume the token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1216 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1217 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1218 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1219
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1220 // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1221 token := yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1222 typ: typ,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1223 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1224 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1225 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1226 // Append the token to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1227 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1228 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1229 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1230
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1231 // Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1232 func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1233 // Reset any potential simple key on the current flow level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1234 if !yaml_parser_remove_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1235 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1236 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1237
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1238 // Decrease the flow level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1239 if !yaml_parser_decrease_flow_level(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1240 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1241 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1242
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1243 // No simple keys after the indicators ']' and '}'.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1244 parser.simple_key_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1245
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1246 // Consume the token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1247
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1248 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1249 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1250 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1251
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1252 // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1253 token := yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1254 typ: typ,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1255 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1256 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1257 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1258 // Append the token to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1259 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1260 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1261 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1262
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1263 // Produce the FLOW-ENTRY token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1264 func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1265 // Reset any potential simple keys on the current flow level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1266 if !yaml_parser_remove_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1267 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1268 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1269
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1270 // Simple keys are allowed after ','.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1271 parser.simple_key_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1272
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1273 // Consume the token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1274 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1275 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1276 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1277
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1278 // Create the FLOW-ENTRY token and append it to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1279 token := yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1280 typ: yaml_FLOW_ENTRY_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1281 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1282 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1283 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1284 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1285 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1286 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1287
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1288 // Produce the BLOCK-ENTRY token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1289 func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1290 // Check if the scanner is in the block context.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1291 if parser.flow_level == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1292 // Check if we are allowed to start a new entry.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1293 if !parser.simple_key_allowed {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1294 return yaml_parser_set_scanner_error(parser, "", parser.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1295 "block sequence entries are not allowed in this context")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1296 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1297 // Add the BLOCK-SEQUENCE-START token if needed.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1298 if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1299 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1300 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1301 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1302 // It is an error for the '-' indicator to occur in the flow context,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1303 // but we let the Parser detect and report about it because the Parser
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1304 // is able to point to the context.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1305 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1306
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1307 // Reset any potential simple keys on the current flow level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1308 if !yaml_parser_remove_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1309 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1310 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1311
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1312 // Simple keys are allowed after '-'.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1313 parser.simple_key_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1314
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1315 // Consume the token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1316 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1317 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1318 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1319
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1320 // Create the BLOCK-ENTRY token and append it to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1321 token := yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1322 typ: yaml_BLOCK_ENTRY_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1323 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1324 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1325 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1326 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1327 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1328 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1329
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1330 // Produce the KEY token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1331 func yaml_parser_fetch_key(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1332
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1333 // In the block context, additional checks are required.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1334 if parser.flow_level == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1335 // Check if we are allowed to start a new key (not nessesary simple).
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1336 if !parser.simple_key_allowed {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1337 return yaml_parser_set_scanner_error(parser, "", parser.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1338 "mapping keys are not allowed in this context")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1339 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1340 // Add the BLOCK-MAPPING-START token if needed.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1341 if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1342 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1343 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1344 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1345
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1346 // Reset any potential simple keys on the current flow level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1347 if !yaml_parser_remove_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1348 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1349 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1350
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1351 // Simple keys are allowed after '?' in the block context.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1352 parser.simple_key_allowed = parser.flow_level == 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1353
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1354 // Consume the token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1355 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1356 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1357 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1358
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1359 // Create the KEY token and append it to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1360 token := yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1361 typ: yaml_KEY_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1362 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1363 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1364 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1365 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1366 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1367 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1368
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1369 // Produce the VALUE token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1370 func yaml_parser_fetch_value(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1371
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1372 simple_key := &parser.simple_keys[len(parser.simple_keys)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1373
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1374 // Have we found a simple key?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1375 if valid, ok := yaml_simple_key_is_valid(parser, simple_key); !ok {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1376 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1377
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1378 } else if valid {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1379
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1380 // Create the KEY token and insert it into the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1381 token := yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1382 typ: yaml_KEY_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1383 start_mark: simple_key.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1384 end_mark: simple_key.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1385 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1386 yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1387
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1388 // In the block context, we may need to add the BLOCK-MAPPING-START token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1389 if !yaml_parser_roll_indent(parser, simple_key.mark.column,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1390 simple_key.token_number,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1391 yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1392 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1393 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1394
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1395 // Remove the simple key.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1396 simple_key.possible = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1397 delete(parser.simple_keys_by_tok, simple_key.token_number)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1398
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1399 // A simple key cannot follow another simple key.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1400 parser.simple_key_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1401
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1402 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1403 // The ':' indicator follows a complex key.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1404
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1405 // In the block context, extra checks are required.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1406 if parser.flow_level == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1407
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1408 // Check if we are allowed to start a complex value.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1409 if !parser.simple_key_allowed {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1410 return yaml_parser_set_scanner_error(parser, "", parser.mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1411 "mapping values are not allowed in this context")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1412 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1413
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1414 // Add the BLOCK-MAPPING-START token if needed.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1415 if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1416 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1417 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1418 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1419
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1420 // Simple keys after ':' are allowed in the block context.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1421 parser.simple_key_allowed = parser.flow_level == 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1422 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1423
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1424 // Consume the token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1425 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1426 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1427 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1428
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1429 // Create the VALUE token and append it to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1430 token := yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1431 typ: yaml_VALUE_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1432 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1433 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1434 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1435 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1436 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1437 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1438
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1439 // Produce the ALIAS or ANCHOR token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1440 func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1441 // An anchor or an alias could be a simple key.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1442 if !yaml_parser_save_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1443 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1444 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1445
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1446 // A simple key cannot follow an anchor or an alias.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1447 parser.simple_key_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1448
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1449 // Create the ALIAS or ANCHOR token and append it to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1450 var token yaml_token_t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1451 if !yaml_parser_scan_anchor(parser, &token, typ) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1452 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1453 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1454 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1455 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1456 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1457
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1458 // Produce the TAG token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1459 func yaml_parser_fetch_tag(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1460 // A tag could be a simple key.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1461 if !yaml_parser_save_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1462 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1463 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1464
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1465 // A simple key cannot follow a tag.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1466 parser.simple_key_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1467
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1468 // Create the TAG token and append it to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1469 var token yaml_token_t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1470 if !yaml_parser_scan_tag(parser, &token) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1471 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1472 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1473 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1474 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1475 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1476
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1477 // Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1478 func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1479 // Remove any potential simple keys.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1480 if !yaml_parser_remove_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1481 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1482 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1483
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1484 // A simple key may follow a block scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1485 parser.simple_key_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1486
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1487 // Create the SCALAR token and append it to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1488 var token yaml_token_t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1489 if !yaml_parser_scan_block_scalar(parser, &token, literal) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1490 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1491 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1492 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1493 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1494 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1495
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1496 // Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1497 func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1498 // A plain scalar could be a simple key.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1499 if !yaml_parser_save_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1500 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1501 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1502
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1503 // A simple key cannot follow a flow scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1504 parser.simple_key_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1505
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1506 // Create the SCALAR token and append it to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1507 var token yaml_token_t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1508 if !yaml_parser_scan_flow_scalar(parser, &token, single) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1509 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1510 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1511 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1512 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1513 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1514
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1515 // Produce the SCALAR(...,plain) token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1516 func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1517 // A plain scalar could be a simple key.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1518 if !yaml_parser_save_simple_key(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1519 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1520 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1521
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1522 // A simple key cannot follow a flow scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1523 parser.simple_key_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1524
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1525 // Create the SCALAR token and append it to the queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1526 var token yaml_token_t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1527 if !yaml_parser_scan_plain_scalar(parser, &token) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1528 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1529 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1530 yaml_insert_token(parser, -1, &token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1531 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1532 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1533
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1534 // Eat whitespaces and comments until the next token is found.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1535 func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1536
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1537 scan_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1538
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1539 // Until the next token is not found.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1540 for {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1541 // Allow the BOM mark to start a line.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1542 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1543 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1544 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1545 if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1546 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1547 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1548
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1549 // Eat whitespaces.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1550 // Tabs are allowed:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1551 // - in the flow context
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1552 // - in the block context, but not at the beginning of the line or
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1553 // after '-', '?', or ':' (complex value).
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1554 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1555 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1556 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1557
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1558 for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1559 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1560 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1561 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1562 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1563 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1564
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1565 // Check if we just had a line comment under a sequence entry that
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1566 // looks more like a header to the following content. Similar to this:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1567 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1568 // - # The comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1569 // - Some data
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1570 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1571 // If so, transform the line comment to a head comment and reposition.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1572 if len(parser.comments) > 0 && len(parser.tokens) > 1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1573 tokenA := parser.tokens[len(parser.tokens)-2]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1574 tokenB := parser.tokens[len(parser.tokens)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1575 comment := &parser.comments[len(parser.comments)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1576 if tokenA.typ == yaml_BLOCK_SEQUENCE_START_TOKEN && tokenB.typ == yaml_BLOCK_ENTRY_TOKEN && len(comment.line) > 0 && !is_break(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1577 // If it was in the prior line, reposition so it becomes a
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1578 // header of the follow up token. Otherwise, keep it in place
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1579 // so it becomes a header of the former.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1580 comment.head = comment.line
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1581 comment.line = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1582 if comment.start_mark.line == parser.mark.line-1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1583 comment.token_mark = parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1584 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1585 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1586 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1587
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1588 // Eat a comment until a line break.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1589 if parser.buffer[parser.buffer_pos] == '#' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1590 if !yaml_parser_scan_comments(parser, scan_mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1591 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1592 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1593 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1594
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1595 // If it is a line break, eat it.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1596 if is_break(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1597 if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1598 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1599 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1600 skip_line(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1601
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1602 // In the block context, a new line may start a simple key.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1603 if parser.flow_level == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1604 parser.simple_key_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1605 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1606 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1607 break // We have found a token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1608 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1609 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1610
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1611 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1612 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1613
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1614 // Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1615 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1616 // Scope:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1617 // %YAML 1.1 # a comment \n
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1618 // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1619 // %TAG !yaml! tag:yaml.org,2002: \n
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1620 // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1621 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1622 func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1623 // Eat '%'.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1624 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1625 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1626
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1627 // Scan the directive name.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1628 var name []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1629 if !yaml_parser_scan_directive_name(parser, start_mark, &name) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1630 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1631 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1632
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1633 // Is it a YAML directive?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1634 if bytes.Equal(name, []byte("YAML")) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1635 // Scan the VERSION directive value.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1636 var major, minor int8
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1637 if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1638 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1639 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1640 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1641
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1642 // Create a VERSION-DIRECTIVE token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1643 *token = yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1644 typ: yaml_VERSION_DIRECTIVE_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1645 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1646 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1647 major: major,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1648 minor: minor,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1649 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1650
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1651 // Is it a TAG directive?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1652 } else if bytes.Equal(name, []byte("TAG")) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1653 // Scan the TAG directive value.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1654 var handle, prefix []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1655 if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1656 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1657 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1658 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1659
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1660 // Create a TAG-DIRECTIVE token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1661 *token = yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1662 typ: yaml_TAG_DIRECTIVE_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1663 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1664 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1665 value: handle,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1666 prefix: prefix,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1667 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1668
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1669 // Unknown directive.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1670 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1671 yaml_parser_set_scanner_error(parser, "while scanning a directive",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1672 start_mark, "found unknown directive name")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1673 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1674 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1675
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1676 // Eat the rest of the line including any comments.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1677 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1678 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1679 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1680
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1681 for is_blank(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1682 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1683 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1684 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1685 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1686 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1687
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1688 if parser.buffer[parser.buffer_pos] == '#' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1689 // [Go] Discard this inline comment for the time being.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1690 //if !yaml_parser_scan_line_comment(parser, start_mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1691 // return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1692 //}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1693 for !is_breakz(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1694 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1695 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1696 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1697 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1698 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1699 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1700
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1701 // Check if we are at the end of the line.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1702 if !is_breakz(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1703 yaml_parser_set_scanner_error(parser, "while scanning a directive",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1704 start_mark, "did not find expected comment or line break")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1705 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1706 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1707
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1708 // Eat a line break.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1709 if is_break(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1710 if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1711 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1712 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1713 skip_line(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1714 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1715
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1716 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1717 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1718
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1719 // Scan the directive name.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1720 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1721 // Scope:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1722 // %YAML 1.1 # a comment \n
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1723 // ^^^^
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1724 // %TAG !yaml! tag:yaml.org,2002: \n
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1725 // ^^^
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1726 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1727 func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1728 // Consume the directive name.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1729 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1730 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1731 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1732
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1733 var s []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1734 for is_alpha(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1735 s = read(parser, s)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1736 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1737 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1738 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1739 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1740
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1741 // Check if the name is empty.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1742 if len(s) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1743 yaml_parser_set_scanner_error(parser, "while scanning a directive",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1744 start_mark, "could not find expected directive name")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1745 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1746 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1747
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1748 // Check for an blank character after the name.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1749 if !is_blankz(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1750 yaml_parser_set_scanner_error(parser, "while scanning a directive",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1751 start_mark, "found unexpected non-alphabetical character")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1752 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1753 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1754 *name = s
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1755 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1756 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1757
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1758 // Scan the value of VERSION-DIRECTIVE.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1759 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1760 // Scope:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1761 // %YAML 1.1 # a comment \n
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1762 // ^^^^^^
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1763 func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1764 // Eat whitespaces.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1765 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1766 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1767 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1768 for is_blank(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1769 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1770 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1771 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1772 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1773 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1774
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1775 // Consume the major version number.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1776 if !yaml_parser_scan_version_directive_number(parser, start_mark, major) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1777 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1778 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1779
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1780 // Eat '.'.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1781 if parser.buffer[parser.buffer_pos] != '.' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1782 return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1783 start_mark, "did not find expected digit or '.' character")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1784 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1785
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1786 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1787
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1788 // Consume the minor version number.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1789 if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1790 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1791 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1792 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1793 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1794
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1795 const max_number_length = 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1796
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1797 // Scan the version number of VERSION-DIRECTIVE.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1798 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1799 // Scope:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1800 // %YAML 1.1 # a comment \n
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1801 // ^
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1802 // %YAML 1.1 # a comment \n
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1803 // ^
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1804 func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1805
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1806 // Repeat while the next character is digit.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1807 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1808 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1809 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1810 var value, length int8
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1811 for is_digit(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1812 // Check if the number is too long.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1813 length++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1814 if length > max_number_length {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1815 return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1816 start_mark, "found extremely long version number")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1817 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1818 value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1819 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1820 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1821 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1822 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1823 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1824
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1825 // Check if the number was present.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1826 if length == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1827 return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1828 start_mark, "did not find expected version number")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1829 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1830 *number = value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1831 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1832 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1833
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1834 // Scan the value of a TAG-DIRECTIVE token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1835 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1836 // Scope:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1837 // %TAG !yaml! tag:yaml.org,2002: \n
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1838 // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1839 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1840 func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1841 var handle_value, prefix_value []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1842
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1843 // Eat whitespaces.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1844 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1845 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1846 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1847
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1848 for is_blank(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1849 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1850 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1851 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1852 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1853 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1854
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1855 // Scan a handle.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1856 if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1857 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1858 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1859
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1860 // Expect a whitespace.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1861 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1862 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1863 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1864 if !is_blank(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1865 yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1866 start_mark, "did not find expected whitespace")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1867 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1868 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1869
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1870 // Eat whitespaces.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1871 for is_blank(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1872 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1873 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1874 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1875 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1876 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1877
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1878 // Scan a prefix.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1879 if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1880 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1881 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1882
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1883 // Expect a whitespace or line break.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1884 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1885 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1886 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1887 if !is_blankz(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1888 yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1889 start_mark, "did not find expected whitespace or line break")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1890 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1891 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1892
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1893 *handle = handle_value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1894 *prefix = prefix_value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1895 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1896 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1897
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1898 func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1899 var s []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1900
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1901 // Eat the indicator character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1902 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1903 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1904
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1905 // Consume the value.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1906 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1907 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1908 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1909
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1910 for is_alpha(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1911 s = read(parser, s)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1912 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1913 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1914 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1915 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1916
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1917 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1918
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1919 /*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1920 * Check if length of the anchor is greater than 0 and it is followed by
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1921 * a whitespace character or one of the indicators:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1922 *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1923 * '?', ':', ',', ']', '}', '%', '@', '`'.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1924 */
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1925
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1926 if len(s) == 0 ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1927 !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1928 parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1929 parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1930 parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1931 parser.buffer[parser.buffer_pos] == '`') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1932 context := "while scanning an alias"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1933 if typ == yaml_ANCHOR_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1934 context = "while scanning an anchor"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1935 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1936 yaml_parser_set_scanner_error(parser, context, start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1937 "did not find expected alphabetic or numeric character")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1938 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1939 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1940
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1941 // Create a token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1942 *token = yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1943 typ: typ,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1944 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1945 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1946 value: s,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1947 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1948
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1949 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1950 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1951
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1952 /*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1953 * Scan a TAG token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1954 */
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1955
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1956 func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1957 var handle, suffix []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1958
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1959 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1960
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1961 // Check if the tag is in the canonical form.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1962 if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1963 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1964 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1965
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1966 if parser.buffer[parser.buffer_pos+1] == '<' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1967 // Keep the handle as ''
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1968
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1969 // Eat '!<'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1970 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1971 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1972
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1973 // Consume the tag value.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1974 if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1975 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1976 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1977
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1978 // Check for '>' and eat it.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1979 if parser.buffer[parser.buffer_pos] != '>' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1980 yaml_parser_set_scanner_error(parser, "while scanning a tag",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1981 start_mark, "did not find the expected '>'")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1982 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1983 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1984
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1985 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1986 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1987 // The tag has either the '!suffix' or the '!handle!suffix' form.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1988
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1989 // First, try to scan a handle.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1990 if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1991 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1992 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1993
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1994 // Check if it is, indeed, handle.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1995 if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1996 // Scan the suffix now.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1997 if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1998 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1999 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2000 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2001 // It wasn't a handle after all. Scan the rest of the tag.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2002 if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2003 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2004 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2005
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2006 // Set the handle to '!'.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2007 handle = []byte{'!'}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2008
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2009 // A special case: the '!' tag. Set the handle to '' and the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2010 // suffix to '!'.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2011 if len(suffix) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2012 handle, suffix = suffix, handle
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2013 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2014 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2015 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2016
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2017 // Check the character which ends the tag.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2018 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2019 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2020 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2021 if !is_blankz(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2022 yaml_parser_set_scanner_error(parser, "while scanning a tag",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2023 start_mark, "did not find expected whitespace or line break")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2024 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2025 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2026
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2027 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2028
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2029 // Create a token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2030 *token = yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2031 typ: yaml_TAG_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2032 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2033 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2034 value: handle,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2035 suffix: suffix,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2036 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2037 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2038 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2039
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2040 // Scan a tag handle.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2041 func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2042 // Check the initial '!' character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2043 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2044 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2045 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2046 if parser.buffer[parser.buffer_pos] != '!' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2047 yaml_parser_set_scanner_tag_error(parser, directive,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2048 start_mark, "did not find expected '!'")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2049 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2050 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2051
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2052 var s []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2053
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2054 // Copy the '!' character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2055 s = read(parser, s)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2056
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2057 // Copy all subsequent alphabetical and numerical characters.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2058 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2059 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2060 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2061 for is_alpha(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2062 s = read(parser, s)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2063 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2064 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2065 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2066 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2067
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2068 // Check if the trailing character is '!' and copy it.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2069 if parser.buffer[parser.buffer_pos] == '!' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2070 s = read(parser, s)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2071 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2072 // It's either the '!' tag or not really a tag handle. If it's a %TAG
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2073 // directive, it's an error. If it's a tag token, it must be a part of URI.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2074 if directive && string(s) != "!" {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2075 yaml_parser_set_scanner_tag_error(parser, directive,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2076 start_mark, "did not find expected '!'")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2077 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2078 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2079 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2080
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2081 *handle = s
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2082 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2083 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2084
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2085 // Scan a tag.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2086 func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2087 //size_t length = head ? strlen((char *)head) : 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2088 var s []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2089 hasTag := len(head) > 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2090
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2091 // Copy the head if needed.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2092 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2093 // Note that we don't copy the leading '!' character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2094 if len(head) > 1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2095 s = append(s, head[1:]...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2096 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2097
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2098 // Scan the tag.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2099 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2100 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2101 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2102
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2103 // The set of characters that may appear in URI is as follows:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2104 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2105 // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&',
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2106 // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']',
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2107 // '%'.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2108 // [Go] TODO Convert this into more reasonable logic.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2109 for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2110 parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2111 parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2112 parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2113 parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2114 parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2115 parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2116 parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2117 parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2118 parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2119 parser.buffer[parser.buffer_pos] == '%' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2120 // Check if it is a URI-escape sequence.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2121 if parser.buffer[parser.buffer_pos] == '%' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2122 if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2123 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2124 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2125 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2126 s = read(parser, s)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2127 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2128 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2129 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2130 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2131 hasTag = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2132 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2133
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2134 if !hasTag {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2135 yaml_parser_set_scanner_tag_error(parser, directive,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2136 start_mark, "did not find expected tag URI")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2137 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2138 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2139 *uri = s
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2140 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2141 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2142
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2143 // Decode an URI-escape sequence corresponding to a single UTF-8 character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2144 func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2145
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2146 // Decode the required number of characters.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2147 w := 1024
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2148 for w > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2149 // Check for a URI-escaped octet.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2150 if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2151 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2152 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2153
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2154 if !(parser.buffer[parser.buffer_pos] == '%' &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2155 is_hex(parser.buffer, parser.buffer_pos+1) &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2156 is_hex(parser.buffer, parser.buffer_pos+2)) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2157 return yaml_parser_set_scanner_tag_error(parser, directive,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2158 start_mark, "did not find URI escaped octet")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2159 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2160
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2161 // Get the octet.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2162 octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2163
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2164 // If it is the leading octet, determine the length of the UTF-8 sequence.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2165 if w == 1024 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2166 w = width(octet)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2167 if w == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2168 return yaml_parser_set_scanner_tag_error(parser, directive,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2169 start_mark, "found an incorrect leading UTF-8 octet")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2170 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2171 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2172 // Check if the trailing octet is correct.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2173 if octet&0xC0 != 0x80 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2174 return yaml_parser_set_scanner_tag_error(parser, directive,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2175 start_mark, "found an incorrect trailing UTF-8 octet")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2176 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2177 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2178
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2179 // Copy the octet and move the pointers.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2180 *s = append(*s, octet)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2181 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2182 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2183 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2184 w--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2185 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2186 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2187 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2188
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2189 // Scan a block scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2190 func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2191 // Eat the indicator '|' or '>'.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2192 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2193 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2194
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2195 // Scan the additional block scalar indicators.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2196 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2197 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2198 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2199
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2200 // Check for a chomping indicator.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2201 var chomping, increment int
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2202 if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2203 // Set the chomping method and eat the indicator.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2204 if parser.buffer[parser.buffer_pos] == '+' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2205 chomping = +1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2206 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2207 chomping = -1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2208 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2209 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2210
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2211 // Check for an indentation indicator.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2212 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2213 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2214 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2215 if is_digit(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2216 // Check that the indentation is greater than 0.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2217 if parser.buffer[parser.buffer_pos] == '0' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2218 yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2219 start_mark, "found an indentation indicator equal to 0")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2220 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2221 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2222
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2223 // Get the indentation level and eat the indicator.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2224 increment = as_digit(parser.buffer, parser.buffer_pos)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2225 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2226 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2227
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2228 } else if is_digit(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2229 // Do the same as above, but in the opposite order.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2230
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2231 if parser.buffer[parser.buffer_pos] == '0' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2232 yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2233 start_mark, "found an indentation indicator equal to 0")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2234 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2235 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2236 increment = as_digit(parser.buffer, parser.buffer_pos)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2237 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2238
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2239 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2240 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2241 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2242 if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2243 if parser.buffer[parser.buffer_pos] == '+' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2244 chomping = +1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2245 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2246 chomping = -1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2247 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2248 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2249 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2250 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2251
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2252 // Eat whitespaces and comments to the end of the line.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2253 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2254 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2255 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2256 for is_blank(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2257 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2258 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2259 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2260 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2261 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2262 if parser.buffer[parser.buffer_pos] == '#' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2263 if !yaml_parser_scan_line_comment(parser, start_mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2264 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2265 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2266 for !is_breakz(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2267 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2268 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2269 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2270 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2271 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2272 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2273
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2274 // Check if we are at the end of the line.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2275 if !is_breakz(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2276 yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2277 start_mark, "did not find expected comment or line break")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2278 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2279 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2280
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2281 // Eat a line break.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2282 if is_break(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2283 if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2284 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2285 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2286 skip_line(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2287 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2288
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2289 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2290
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2291 // Set the indentation level if it was specified.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2292 var indent int
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2293 if increment > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2294 if parser.indent >= 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2295 indent = parser.indent + increment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2296 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2297 indent = increment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2298 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2299 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2300
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2301 // Scan the leading line breaks and determine the indentation level if needed.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2302 var s, leading_break, trailing_breaks []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2303 if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2304 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2305 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2306
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2307 // Scan the block scalar content.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2308 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2309 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2310 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2311 var leading_blank, trailing_blank bool
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2312 for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2313 // We are at the beginning of a non-empty line.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2314
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2315 // Is it a trailing whitespace?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2316 trailing_blank = is_blank(parser.buffer, parser.buffer_pos)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2317
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2318 // Check if we need to fold the leading line break.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2319 if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2320 // Do we need to join the lines by space?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2321 if len(trailing_breaks) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2322 s = append(s, ' ')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2323 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2324 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2325 s = append(s, leading_break...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2326 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2327 leading_break = leading_break[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2328
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2329 // Append the remaining line breaks.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2330 s = append(s, trailing_breaks...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2331 trailing_breaks = trailing_breaks[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2332
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2333 // Is it a leading whitespace?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2334 leading_blank = is_blank(parser.buffer, parser.buffer_pos)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2335
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2336 // Consume the current line.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2337 for !is_breakz(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2338 s = read(parser, s)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2339 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2340 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2341 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2342 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2343
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2344 // Consume the line break.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2345 if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2346 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2347 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2348
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2349 leading_break = read_line(parser, leading_break)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2350
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2351 // Eat the following indentation spaces and line breaks.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2352 if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2353 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2354 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2355 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2356
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2357 // Chomp the tail.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2358 if chomping != -1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2359 s = append(s, leading_break...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2360 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2361 if chomping == 1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2362 s = append(s, trailing_breaks...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2363 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2364
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2365 // Create a token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2366 *token = yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2367 typ: yaml_SCALAR_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2368 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2369 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2370 value: s,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2371 style: yaml_LITERAL_SCALAR_STYLE,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2372 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2373 if !literal {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2374 token.style = yaml_FOLDED_SCALAR_STYLE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2375 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2376 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2377 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2378
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2379 // Scan indentation spaces and line breaks for a block scalar. Determine the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2380 // indentation level if needed.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2381 func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2382 *end_mark = parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2383
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2384 // Eat the indentation spaces and line breaks.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2385 max_indent := 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2386 for {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2387 // Eat the indentation spaces.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2388 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2389 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2390 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2391 for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2392 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2393 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2394 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2395 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2396 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2397 if parser.mark.column > max_indent {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2398 max_indent = parser.mark.column
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2399 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2400
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2401 // Check for a tab character messing the indentation.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2402 if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2403 return yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2404 start_mark, "found a tab character where an indentation space is expected")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2405 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2406
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2407 // Have we found a non-empty line?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2408 if !is_break(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2409 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2410 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2411
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2412 // Consume the line break.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2413 if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2414 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2415 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2416 // [Go] Should really be returning breaks instead.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2417 *breaks = read_line(parser, *breaks)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2418 *end_mark = parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2419 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2420
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2421 // Determine the indentation level if needed.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2422 if *indent == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2423 *indent = max_indent
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2424 if *indent < parser.indent+1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2425 *indent = parser.indent + 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2426 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2427 if *indent < 1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2428 *indent = 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2429 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2430 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2431 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2432 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2433
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2434 // Scan a quoted scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2435 func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2436 // Eat the left quote.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2437 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2438 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2439
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2440 // Consume the content of the quoted scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2441 var s, leading_break, trailing_breaks, whitespaces []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2442 for {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2443 // Check that there are no document indicators at the beginning of the line.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2444 if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2445 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2446 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2447
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2448 if parser.mark.column == 0 &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2449 ((parser.buffer[parser.buffer_pos+0] == '-' &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2450 parser.buffer[parser.buffer_pos+1] == '-' &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2451 parser.buffer[parser.buffer_pos+2] == '-') ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2452 (parser.buffer[parser.buffer_pos+0] == '.' &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2453 parser.buffer[parser.buffer_pos+1] == '.' &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2454 parser.buffer[parser.buffer_pos+2] == '.')) &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2455 is_blankz(parser.buffer, parser.buffer_pos+3) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2456 yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2457 start_mark, "found unexpected document indicator")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2458 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2459 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2460
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2461 // Check for EOF.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2462 if is_z(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2463 yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2464 start_mark, "found unexpected end of stream")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2465 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2466 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2467
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2468 // Consume non-blank characters.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2469 leading_blanks := false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2470 for !is_blankz(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2471 if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2472 // Is is an escaped single quote.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2473 s = append(s, '\'')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2474 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2475 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2476
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2477 } else if single && parser.buffer[parser.buffer_pos] == '\'' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2478 // It is a right single quote.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2479 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2480 } else if !single && parser.buffer[parser.buffer_pos] == '"' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2481 // It is a right double quote.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2482 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2483
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2484 } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2485 // It is an escaped line break.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2486 if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2487 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2488 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2489 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2490 skip_line(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2491 leading_blanks = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2492 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2493
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2494 } else if !single && parser.buffer[parser.buffer_pos] == '\\' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2495 // It is an escape sequence.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2496 code_length := 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2497
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2498 // Check the escape character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2499 switch parser.buffer[parser.buffer_pos+1] {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2500 case '0':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2501 s = append(s, 0)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2502 case 'a':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2503 s = append(s, '\x07')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2504 case 'b':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2505 s = append(s, '\x08')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2506 case 't', '\t':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2507 s = append(s, '\x09')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2508 case 'n':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2509 s = append(s, '\x0A')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2510 case 'v':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2511 s = append(s, '\x0B')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2512 case 'f':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2513 s = append(s, '\x0C')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2514 case 'r':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2515 s = append(s, '\x0D')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2516 case 'e':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2517 s = append(s, '\x1B')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2518 case ' ':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2519 s = append(s, '\x20')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2520 case '"':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2521 s = append(s, '"')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2522 case '\'':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2523 s = append(s, '\'')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2524 case '\\':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2525 s = append(s, '\\')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2526 case 'N': // NEL (#x85)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2527 s = append(s, '\xC2')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2528 s = append(s, '\x85')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2529 case '_': // #xA0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2530 s = append(s, '\xC2')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2531 s = append(s, '\xA0')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2532 case 'L': // LS (#x2028)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2533 s = append(s, '\xE2')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2534 s = append(s, '\x80')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2535 s = append(s, '\xA8')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2536 case 'P': // PS (#x2029)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2537 s = append(s, '\xE2')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2538 s = append(s, '\x80')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2539 s = append(s, '\xA9')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2540 case 'x':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2541 code_length = 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2542 case 'u':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2543 code_length = 4
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2544 case 'U':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2545 code_length = 8
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2546 default:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2547 yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2548 start_mark, "found unknown escape character")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2549 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2550 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2551
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2552 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2553 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2554
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2555 // Consume an arbitrary escape code.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2556 if code_length > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2557 var value int
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2558
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2559 // Scan the character value.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2560 if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2561 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2562 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2563 for k := 0; k < code_length; k++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2564 if !is_hex(parser.buffer, parser.buffer_pos+k) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2565 yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2566 start_mark, "did not find expected hexdecimal number")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2567 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2568 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2569 value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2570 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2571
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2572 // Check the value and write the character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2573 if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2574 yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2575 start_mark, "found invalid Unicode character escape code")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2576 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2577 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2578 if value <= 0x7F {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2579 s = append(s, byte(value))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2580 } else if value <= 0x7FF {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2581 s = append(s, byte(0xC0+(value>>6)))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2582 s = append(s, byte(0x80+(value&0x3F)))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2583 } else if value <= 0xFFFF {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2584 s = append(s, byte(0xE0+(value>>12)))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2585 s = append(s, byte(0x80+((value>>6)&0x3F)))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2586 s = append(s, byte(0x80+(value&0x3F)))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2587 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2588 s = append(s, byte(0xF0+(value>>18)))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2589 s = append(s, byte(0x80+((value>>12)&0x3F)))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2590 s = append(s, byte(0x80+((value>>6)&0x3F)))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2591 s = append(s, byte(0x80+(value&0x3F)))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2592 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2593
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2594 // Advance the pointer.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2595 for k := 0; k < code_length; k++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2596 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2597 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2598 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2599 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2600 // It is a non-escaped non-blank character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2601 s = read(parser, s)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2602 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2603 if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2604 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2605 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2606 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2607
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2608 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2609 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2610 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2611
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2612 // Check if we are at the end of the scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2613 if single {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2614 if parser.buffer[parser.buffer_pos] == '\'' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2615 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2616 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2617 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2618 if parser.buffer[parser.buffer_pos] == '"' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2619 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2620 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2621 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2622
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2623 // Consume blank characters.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2624 for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2625 if is_blank(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2626 // Consume a space or a tab character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2627 if !leading_blanks {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2628 whitespaces = read(parser, whitespaces)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2629 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2630 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2631 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2632 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2633 if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2634 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2635 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2636
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2637 // Check if it is a first line break.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2638 if !leading_blanks {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2639 whitespaces = whitespaces[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2640 leading_break = read_line(parser, leading_break)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2641 leading_blanks = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2642 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2643 trailing_breaks = read_line(parser, trailing_breaks)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2644 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2645 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2646 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2647 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2648 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2649 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2650
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2651 // Join the whitespaces or fold line breaks.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2652 if leading_blanks {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2653 // Do we need to fold line breaks?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2654 if len(leading_break) > 0 && leading_break[0] == '\n' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2655 if len(trailing_breaks) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2656 s = append(s, ' ')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2657 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2658 s = append(s, trailing_breaks...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2659 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2660 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2661 s = append(s, leading_break...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2662 s = append(s, trailing_breaks...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2663 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2664 trailing_breaks = trailing_breaks[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2665 leading_break = leading_break[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2666 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2667 s = append(s, whitespaces...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2668 whitespaces = whitespaces[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2669 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2670 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2671
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2672 // Eat the right quote.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2673 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2674 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2675
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2676 // Create a token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2677 *token = yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2678 typ: yaml_SCALAR_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2679 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2680 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2681 value: s,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2682 style: yaml_SINGLE_QUOTED_SCALAR_STYLE,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2683 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2684 if !single {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2685 token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2686 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2687 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2688 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2689
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2690 // Scan a plain scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2691 func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2692
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2693 var s, leading_break, trailing_breaks, whitespaces []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2694 var leading_blanks bool
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2695 var indent = parser.indent + 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2696
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2697 start_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2698 end_mark := parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2699
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2700 // Consume the content of the plain scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2701 for {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2702 // Check for a document indicator.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2703 if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2704 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2705 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2706 if parser.mark.column == 0 &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2707 ((parser.buffer[parser.buffer_pos+0] == '-' &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2708 parser.buffer[parser.buffer_pos+1] == '-' &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2709 parser.buffer[parser.buffer_pos+2] == '-') ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2710 (parser.buffer[parser.buffer_pos+0] == '.' &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2711 parser.buffer[parser.buffer_pos+1] == '.' &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2712 parser.buffer[parser.buffer_pos+2] == '.')) &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2713 is_blankz(parser.buffer, parser.buffer_pos+3) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2714 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2715 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2716
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2717 // Check for a comment.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2718 if parser.buffer[parser.buffer_pos] == '#' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2719 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2720 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2721
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2722 // Consume non-blank characters.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2723 for !is_blankz(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2724
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2725 // Check for indicators that may end a plain scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2726 if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2727 (parser.flow_level > 0 &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2728 (parser.buffer[parser.buffer_pos] == ',' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2729 parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2730 parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2731 parser.buffer[parser.buffer_pos] == '}')) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2732 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2733 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2734
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2735 // Check if we need to join whitespaces and breaks.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2736 if leading_blanks || len(whitespaces) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2737 if leading_blanks {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2738 // Do we need to fold line breaks?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2739 if leading_break[0] == '\n' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2740 if len(trailing_breaks) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2741 s = append(s, ' ')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2742 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2743 s = append(s, trailing_breaks...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2744 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2745 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2746 s = append(s, leading_break...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2747 s = append(s, trailing_breaks...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2748 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2749 trailing_breaks = trailing_breaks[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2750 leading_break = leading_break[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2751 leading_blanks = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2752 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2753 s = append(s, whitespaces...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2754 whitespaces = whitespaces[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2755 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2756 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2757
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2758 // Copy the character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2759 s = read(parser, s)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2760
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2761 end_mark = parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2762 if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2763 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2764 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2765 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2766
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2767 // Is it the end?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2768 if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2769 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2770 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2771
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2772 // Consume blank characters.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2773 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2774 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2775 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2776
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2777 for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2778 if is_blank(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2779
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2780 // Check for tab characters that abuse indentation.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2781 if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2782 yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2783 start_mark, "found a tab character that violates indentation")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2784 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2785 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2786
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2787 // Consume a space or a tab character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2788 if !leading_blanks {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2789 whitespaces = read(parser, whitespaces)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2790 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2791 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2792 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2793 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2794 if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2795 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2796 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2797
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2798 // Check if it is a first line break.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2799 if !leading_blanks {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2800 whitespaces = whitespaces[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2801 leading_break = read_line(parser, leading_break)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2802 leading_blanks = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2803 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2804 trailing_breaks = read_line(parser, trailing_breaks)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2805 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2806 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2807 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2808 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2809 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2810 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2811
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2812 // Check indentation level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2813 if parser.flow_level == 0 && parser.mark.column < indent {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2814 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2815 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2816 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2817
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2818 // Create a token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2819 *token = yaml_token_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2820 typ: yaml_SCALAR_TOKEN,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2821 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2822 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2823 value: s,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2824 style: yaml_PLAIN_SCALAR_STYLE,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2825 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2826
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2827 // Note that we change the 'simple_key_allowed' flag.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2828 if leading_blanks {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2829 parser.simple_key_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2830 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2831 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2832 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2833
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2834 func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2835 if parser.newlines > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2836 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2837 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2838
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2839 var start_mark yaml_mark_t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2840 var text []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2841
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2842 for peek := 0; peek < 512; peek++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2843 if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2844 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2845 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2846 if is_blank(parser.buffer, parser.buffer_pos+peek) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2847 continue
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2848 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2849 if parser.buffer[parser.buffer_pos+peek] == '#' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2850 seen := parser.mark.index+peek
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2851 for {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2852 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2853 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2854 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2855 if is_breakz(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2856 if parser.mark.index >= seen {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2857 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2858 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2859 if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2860 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2861 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2862 skip_line(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2863 } else if parser.mark.index >= seen {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2864 if len(text) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2865 start_mark = parser.mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2866 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2867 text = read(parser, text)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2868 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2869 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2870 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2871 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2872 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2873 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2874 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2875 if len(text) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2876 parser.comments = append(parser.comments, yaml_comment_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2877 token_mark: token_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2878 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2879 line: text,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2880 })
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2881 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2882 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2883 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2884
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2885 func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2886 token := parser.tokens[len(parser.tokens)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2887
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2888 if token.typ == yaml_FLOW_ENTRY_TOKEN && len(parser.tokens) > 1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2889 token = parser.tokens[len(parser.tokens)-2]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2890 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2891
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2892 var token_mark = token.start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2893 var start_mark yaml_mark_t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2894 var next_indent = parser.indent
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2895 if next_indent < 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2896 next_indent = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2897 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2898
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2899 var recent_empty = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2900 var first_empty = parser.newlines <= 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2901
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2902 var line = parser.mark.line
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2903 var column = parser.mark.column
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2904
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2905 var text []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2906
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2907 // The foot line is the place where a comment must start to
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2908 // still be considered as a foot of the prior content.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2909 // If there's some content in the currently parsed line, then
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2910 // the foot is the line below it.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2911 var foot_line = -1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2912 if scan_mark.line > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2913 foot_line = parser.mark.line-parser.newlines+1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2914 if parser.newlines == 0 && parser.mark.column > 1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2915 foot_line++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2916 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2917 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2918
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2919 var peek = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2920 for ; peek < 512; peek++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2921 if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2922 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2923 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2924 column++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2925 if is_blank(parser.buffer, parser.buffer_pos+peek) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2926 continue
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2927 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2928 c := parser.buffer[parser.buffer_pos+peek]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2929 var close_flow = parser.flow_level > 0 && (c == ']' || c == '}')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2930 if close_flow || is_breakz(parser.buffer, parser.buffer_pos+peek) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2931 // Got line break or terminator.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2932 if close_flow || !recent_empty {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2933 if close_flow || first_empty && (start_mark.line == foot_line && token.typ != yaml_VALUE_TOKEN || start_mark.column-1 < next_indent) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2934 // This is the first empty line and there were no empty lines before,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2935 // so this initial part of the comment is a foot of the prior token
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2936 // instead of being a head for the following one. Split it up.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2937 // Alternatively, this might also be the last comment inside a flow
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2938 // scope, so it must be a footer.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2939 if len(text) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2940 if start_mark.column-1 < next_indent {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2941 // If dedented it's unrelated to the prior token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2942 token_mark = start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2943 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2944 parser.comments = append(parser.comments, yaml_comment_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2945 scan_mark: scan_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2946 token_mark: token_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2947 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2948 end_mark: yaml_mark_t{parser.mark.index + peek, line, column},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2949 foot: text,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2950 })
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2951 scan_mark = yaml_mark_t{parser.mark.index + peek, line, column}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2952 token_mark = scan_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2953 text = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2954 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2955 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2956 if len(text) > 0 && parser.buffer[parser.buffer_pos+peek] != 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2957 text = append(text, '\n')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2958 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2959 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2960 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2961 if !is_break(parser.buffer, parser.buffer_pos+peek) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2962 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2963 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2964 first_empty = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2965 recent_empty = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2966 column = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2967 line++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2968 continue
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2969 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2970
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2971 if len(text) > 0 && (close_flow || column-1 < next_indent && column != start_mark.column) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2972 // The comment at the different indentation is a foot of the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2973 // preceding data rather than a head of the upcoming one.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2974 parser.comments = append(parser.comments, yaml_comment_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2975 scan_mark: scan_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2976 token_mark: token_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2977 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2978 end_mark: yaml_mark_t{parser.mark.index + peek, line, column},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2979 foot: text,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2980 })
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2981 scan_mark = yaml_mark_t{parser.mark.index + peek, line, column}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2982 token_mark = scan_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2983 text = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2984 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2985
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2986 if parser.buffer[parser.buffer_pos+peek] != '#' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2987 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2988 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2989
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2990 if len(text) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2991 start_mark = yaml_mark_t{parser.mark.index + peek, line, column}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2992 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2993 text = append(text, '\n')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2994 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2995
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2996 recent_empty = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2997
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2998 // Consume until after the consumed comment line.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2999 seen := parser.mark.index+peek
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3000 for {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3001 if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3002 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3003 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3004 if is_breakz(parser.buffer, parser.buffer_pos) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3005 if parser.mark.index >= seen {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3006 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3007 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3008 if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3009 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3010 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3011 skip_line(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3012 } else if parser.mark.index >= seen {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3013 text = read(parser, text)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3014 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3015 skip(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3016 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3017 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3018
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3019 peek = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3020 column = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3021 line = parser.mark.line
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3022 next_indent = parser.indent
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3023 if next_indent < 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3024 next_indent = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3025 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3026 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3027
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3028 if len(text) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3029 parser.comments = append(parser.comments, yaml_comment_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3030 scan_mark: scan_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3031 token_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3032 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3033 end_mark: yaml_mark_t{parser.mark.index + peek - 1, line, column},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3034 head: text,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3035 })
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3036 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3037 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3038 }