1 |
yakumo_izuru |
1.1 |
// |
2 |
|
|
// Copyright (c) 2011-2019 Canonical Ltd |
3 |
|
|
// Copyright (c) 2006-2010 Kirill Simonov |
4 |
|
|
// |
5 |
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy of |
6 |
|
|
// this software and associated documentation files (the "Software"), to deal in |
7 |
|
|
// the Software without restriction, including without limitation the rights to |
8 |
|
|
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies |
9 |
|
|
// of the Software, and to permit persons to whom the Software is furnished to do |
10 |
|
|
// so, subject to the following conditions: |
11 |
|
|
// |
12 |
|
|
// The above copyright notice and this permission notice shall be included in all |
13 |
|
|
// copies or substantial portions of the Software. |
14 |
|
|
// |
15 |
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
16 |
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
17 |
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
18 |
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
19 |
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
20 |
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
21 |
|
|
// SOFTWARE. |
22 |
|
|
|
23 |
|
|
package yaml |
24 |
|
|
|
25 |
|
|
import ( |
26 |
|
|
"bytes" |
27 |
|
|
"fmt" |
28 |
|
|
) |
29 |
|
|
|
30 |
|
|
// Flush the buffer if needed. |
31 |
|
|
func flush(emitter *yaml_emitter_t) bool { |
32 |
|
|
if emitter.buffer_pos+5 >= len(emitter.buffer) { |
33 |
|
|
return yaml_emitter_flush(emitter) |
34 |
|
|
} |
35 |
|
|
return true |
36 |
|
|
} |
37 |
|
|
|
38 |
|
|
// Put a character to the output buffer. |
39 |
|
|
func put(emitter *yaml_emitter_t, value byte) bool { |
40 |
|
|
if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { |
41 |
|
|
return false |
42 |
|
|
} |
43 |
|
|
emitter.buffer[emitter.buffer_pos] = value |
44 |
|
|
emitter.buffer_pos++ |
45 |
|
|
emitter.column++ |
46 |
|
|
return true |
47 |
|
|
} |
48 |
|
|
|
49 |
|
|
// Put a line break to the output buffer. |
50 |
|
|
func put_break(emitter *yaml_emitter_t) bool { |
51 |
|
|
if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { |
52 |
|
|
return false |
53 |
|
|
} |
54 |
|
|
switch emitter.line_break { |
55 |
|
|
case yaml_CR_BREAK: |
56 |
|
|
emitter.buffer[emitter.buffer_pos] = '\r' |
57 |
|
|
emitter.buffer_pos += 1 |
58 |
|
|
case yaml_LN_BREAK: |
59 |
|
|
emitter.buffer[emitter.buffer_pos] = '\n' |
60 |
|
|
emitter.buffer_pos += 1 |
61 |
|
|
case yaml_CRLN_BREAK: |
62 |
|
|
emitter.buffer[emitter.buffer_pos+0] = '\r' |
63 |
|
|
emitter.buffer[emitter.buffer_pos+1] = '\n' |
64 |
|
|
emitter.buffer_pos += 2 |
65 |
|
|
default: |
66 |
|
|
panic("unknown line break setting") |
67 |
|
|
} |
68 |
|
|
if emitter.column == 0 { |
69 |
|
|
emitter.space_above = true |
70 |
|
|
} |
71 |
|
|
emitter.column = 0 |
72 |
|
|
emitter.line++ |
73 |
|
|
// [Go] Do this here and below and drop from everywhere else (see commented lines). |
74 |
|
|
emitter.indention = true |
75 |
|
|
return true |
76 |
|
|
} |
77 |
|
|
|
78 |
|
|
// Copy a character from a string into buffer. |
79 |
|
|
func write(emitter *yaml_emitter_t, s []byte, i *int) bool { |
80 |
|
|
if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { |
81 |
|
|
return false |
82 |
|
|
} |
83 |
|
|
p := emitter.buffer_pos |
84 |
|
|
w := width(s[*i]) |
85 |
|
|
switch w { |
86 |
|
|
case 4: |
87 |
|
|
emitter.buffer[p+3] = s[*i+3] |
88 |
|
|
fallthrough |
89 |
|
|
case 3: |
90 |
|
|
emitter.buffer[p+2] = s[*i+2] |
91 |
|
|
fallthrough |
92 |
|
|
case 2: |
93 |
|
|
emitter.buffer[p+1] = s[*i+1] |
94 |
|
|
fallthrough |
95 |
|
|
case 1: |
96 |
|
|
emitter.buffer[p+0] = s[*i+0] |
97 |
|
|
default: |
98 |
|
|
panic("unknown character width") |
99 |
|
|
} |
100 |
|
|
emitter.column++ |
101 |
|
|
emitter.buffer_pos += w |
102 |
|
|
*i += w |
103 |
|
|
return true |
104 |
|
|
} |
105 |
|
|
|
106 |
|
|
// Write a whole string into buffer. |
107 |
|
|
func write_all(emitter *yaml_emitter_t, s []byte) bool { |
108 |
|
|
for i := 0; i < len(s); { |
109 |
|
|
if !write(emitter, s, &i) { |
110 |
|
|
return false |
111 |
|
|
} |
112 |
|
|
} |
113 |
|
|
return true |
114 |
|
|
} |
115 |
|
|
|
116 |
|
|
// Copy a line break character from a string into buffer. |
117 |
|
|
func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool { |
118 |
|
|
if s[*i] == '\n' { |
119 |
|
|
if !put_break(emitter) { |
120 |
|
|
return false |
121 |
|
|
} |
122 |
|
|
*i++ |
123 |
|
|
} else { |
124 |
|
|
if !write(emitter, s, i) { |
125 |
|
|
return false |
126 |
|
|
} |
127 |
|
|
if emitter.column == 0 { |
128 |
|
|
emitter.space_above = true |
129 |
|
|
} |
130 |
|
|
emitter.column = 0 |
131 |
|
|
emitter.line++ |
132 |
|
|
// [Go] Do this here and above and drop from everywhere else (see commented lines). |
133 |
|
|
emitter.indention = true |
134 |
|
|
} |
135 |
|
|
return true |
136 |
|
|
} |
137 |
|
|
|
138 |
|
|
// Set an emitter error and return false. |
139 |
|
|
func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool { |
140 |
|
|
emitter.error = yaml_EMITTER_ERROR |
141 |
|
|
emitter.problem = problem |
142 |
|
|
return false |
143 |
|
|
} |
144 |
|
|
|
145 |
|
|
// Emit an event. |
146 |
|
|
func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool { |
147 |
|
|
emitter.events = append(emitter.events, *event) |
148 |
|
|
for !yaml_emitter_need_more_events(emitter) { |
149 |
|
|
event := &emitter.events[emitter.events_head] |
150 |
|
|
if !yaml_emitter_analyze_event(emitter, event) { |
151 |
|
|
return false |
152 |
|
|
} |
153 |
|
|
if !yaml_emitter_state_machine(emitter, event) { |
154 |
|
|
return false |
155 |
|
|
} |
156 |
|
|
yaml_event_delete(event) |
157 |
|
|
emitter.events_head++ |
158 |
|
|
} |
159 |
|
|
return true |
160 |
|
|
} |
161 |
|
|
|
162 |
|
|
// Check if we need to accumulate more events before emitting. |
163 |
|
|
// |
164 |
|
|
// We accumulate extra |
165 |
|
|
// - 1 event for DOCUMENT-START |
166 |
|
|
// - 2 events for SEQUENCE-START |
167 |
|
|
// - 3 events for MAPPING-START |
168 |
|
|
// |
169 |
|
|
func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool { |
170 |
|
|
if emitter.events_head == len(emitter.events) { |
171 |
|
|
return true |
172 |
|
|
} |
173 |
|
|
var accumulate int |
174 |
|
|
switch emitter.events[emitter.events_head].typ { |
175 |
|
|
case yaml_DOCUMENT_START_EVENT: |
176 |
|
|
accumulate = 1 |
177 |
|
|
break |
178 |
|
|
case yaml_SEQUENCE_START_EVENT: |
179 |
|
|
accumulate = 2 |
180 |
|
|
break |
181 |
|
|
case yaml_MAPPING_START_EVENT: |
182 |
|
|
accumulate = 3 |
183 |
|
|
break |
184 |
|
|
default: |
185 |
|
|
return false |
186 |
|
|
} |
187 |
|
|
if len(emitter.events)-emitter.events_head > accumulate { |
188 |
|
|
return false |
189 |
|
|
} |
190 |
|
|
var level int |
191 |
|
|
for i := emitter.events_head; i < len(emitter.events); i++ { |
192 |
|
|
switch emitter.events[i].typ { |
193 |
|
|
case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT: |
194 |
|
|
level++ |
195 |
|
|
case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT: |
196 |
|
|
level-- |
197 |
|
|
} |
198 |
|
|
if level == 0 { |
199 |
|
|
return false |
200 |
|
|
} |
201 |
|
|
} |
202 |
|
|
return true |
203 |
|
|
} |
204 |
|
|
|
205 |
|
|
// Append a directive to the directives stack. |
206 |
|
|
func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool { |
207 |
|
|
for i := 0; i < len(emitter.tag_directives); i++ { |
208 |
|
|
if bytes.Equal(value.handle, emitter.tag_directives[i].handle) { |
209 |
|
|
if allow_duplicates { |
210 |
|
|
return true |
211 |
|
|
} |
212 |
|
|
return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive") |
213 |
|
|
} |
214 |
|
|
} |
215 |
|
|
|
216 |
|
|
// [Go] Do we actually need to copy this given garbage collection |
217 |
|
|
// and the lack of deallocating destructors? |
218 |
|
|
tag_copy := yaml_tag_directive_t{ |
219 |
|
|
handle: make([]byte, len(value.handle)), |
220 |
|
|
prefix: make([]byte, len(value.prefix)), |
221 |
|
|
} |
222 |
|
|
copy(tag_copy.handle, value.handle) |
223 |
|
|
copy(tag_copy.prefix, value.prefix) |
224 |
|
|
emitter.tag_directives = append(emitter.tag_directives, tag_copy) |
225 |
|
|
return true |
226 |
|
|
} |
227 |
|
|
|
228 |
|
|
// Increase the indentation level. |
229 |
|
|
func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { |
230 |
|
|
emitter.indents = append(emitter.indents, emitter.indent) |
231 |
|
|
if emitter.indent < 0 { |
232 |
|
|
if flow { |
233 |
|
|
emitter.indent = emitter.best_indent |
234 |
|
|
} else { |
235 |
|
|
emitter.indent = 0 |
236 |
|
|
} |
237 |
|
|
} else if !indentless { |
238 |
|
|
// [Go] This was changed so that indentations are more regular. |
239 |
|
|
if emitter.states[len(emitter.states)-1] == yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE { |
240 |
|
|
// The first indent inside a sequence will just skip the "- " indicator. |
241 |
|
|
emitter.indent += 2 |
242 |
|
|
} else { |
243 |
|
|
// Everything else aligns to the chosen indentation. |
244 |
|
|
emitter.indent = emitter.best_indent*((emitter.indent+emitter.best_indent)/emitter.best_indent) |
245 |
|
|
} |
246 |
|
|
} |
247 |
|
|
return true |
248 |
|
|
} |
249 |
|
|
|
250 |
|
|
// State dispatcher. |
251 |
|
|
func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool { |
252 |
|
|
switch emitter.state { |
253 |
|
|
default: |
254 |
|
|
case yaml_EMIT_STREAM_START_STATE: |
255 |
|
|
return yaml_emitter_emit_stream_start(emitter, event) |
256 |
|
|
|
257 |
|
|
case yaml_EMIT_FIRST_DOCUMENT_START_STATE: |
258 |
|
|
return yaml_emitter_emit_document_start(emitter, event, true) |
259 |
|
|
|
260 |
|
|
case yaml_EMIT_DOCUMENT_START_STATE: |
261 |
|
|
return yaml_emitter_emit_document_start(emitter, event, false) |
262 |
|
|
|
263 |
|
|
case yaml_EMIT_DOCUMENT_CONTENT_STATE: |
264 |
|
|
return yaml_emitter_emit_document_content(emitter, event) |
265 |
|
|
|
266 |
|
|
case yaml_EMIT_DOCUMENT_END_STATE: |
267 |
|
|
return yaml_emitter_emit_document_end(emitter, event) |
268 |
|
|
|
269 |
|
|
case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE: |
270 |
|
|
return yaml_emitter_emit_flow_sequence_item(emitter, event, true, false) |
271 |
|
|
|
272 |
|
|
case yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE: |
273 |
|
|
return yaml_emitter_emit_flow_sequence_item(emitter, event, false, true) |
274 |
|
|
|
275 |
|
|
case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: |
276 |
|
|
return yaml_emitter_emit_flow_sequence_item(emitter, event, false, false) |
277 |
|
|
|
278 |
|
|
case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: |
279 |
|
|
return yaml_emitter_emit_flow_mapping_key(emitter, event, true, false) |
280 |
|
|
|
281 |
|
|
case yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE: |
282 |
|
|
return yaml_emitter_emit_flow_mapping_key(emitter, event, false, true) |
283 |
|
|
|
284 |
|
|
case yaml_EMIT_FLOW_MAPPING_KEY_STATE: |
285 |
|
|
return yaml_emitter_emit_flow_mapping_key(emitter, event, false, false) |
286 |
|
|
|
287 |
|
|
case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE: |
288 |
|
|
return yaml_emitter_emit_flow_mapping_value(emitter, event, true) |
289 |
|
|
|
290 |
|
|
case yaml_EMIT_FLOW_MAPPING_VALUE_STATE: |
291 |
|
|
return yaml_emitter_emit_flow_mapping_value(emitter, event, false) |
292 |
|
|
|
293 |
|
|
case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE: |
294 |
|
|
return yaml_emitter_emit_block_sequence_item(emitter, event, true) |
295 |
|
|
|
296 |
|
|
case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE: |
297 |
|
|
return yaml_emitter_emit_block_sequence_item(emitter, event, false) |
298 |
|
|
|
299 |
|
|
case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE: |
300 |
|
|
return yaml_emitter_emit_block_mapping_key(emitter, event, true) |
301 |
|
|
|
302 |
|
|
case yaml_EMIT_BLOCK_MAPPING_KEY_STATE: |
303 |
|
|
return yaml_emitter_emit_block_mapping_key(emitter, event, false) |
304 |
|
|
|
305 |
|
|
case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE: |
306 |
|
|
return yaml_emitter_emit_block_mapping_value(emitter, event, true) |
307 |
|
|
|
308 |
|
|
case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE: |
309 |
|
|
return yaml_emitter_emit_block_mapping_value(emitter, event, false) |
310 |
|
|
|
311 |
|
|
case yaml_EMIT_END_STATE: |
312 |
|
|
return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END") |
313 |
|
|
} |
314 |
|
|
panic("invalid emitter state") |
315 |
|
|
} |
316 |
|
|
|
317 |
|
|
// Expect STREAM-START. |
318 |
|
|
func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { |
319 |
|
|
if event.typ != yaml_STREAM_START_EVENT { |
320 |
|
|
return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START") |
321 |
|
|
} |
322 |
|
|
if emitter.encoding == yaml_ANY_ENCODING { |
323 |
|
|
emitter.encoding = event.encoding |
324 |
|
|
if emitter.encoding == yaml_ANY_ENCODING { |
325 |
|
|
emitter.encoding = yaml_UTF8_ENCODING |
326 |
|
|
} |
327 |
|
|
} |
328 |
|
|
if emitter.best_indent < 2 || emitter.best_indent > 9 { |
329 |
|
|
emitter.best_indent = 2 |
330 |
|
|
} |
331 |
|
|
if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 { |
332 |
|
|
emitter.best_width = 80 |
333 |
|
|
} |
334 |
|
|
if emitter.best_width < 0 { |
335 |
|
|
emitter.best_width = 1<<31 - 1 |
336 |
|
|
} |
337 |
|
|
if emitter.line_break == yaml_ANY_BREAK { |
338 |
|
|
emitter.line_break = yaml_LN_BREAK |
339 |
|
|
} |
340 |
|
|
|
341 |
|
|
emitter.indent = -1 |
342 |
|
|
emitter.line = 0 |
343 |
|
|
emitter.column = 0 |
344 |
|
|
emitter.whitespace = true |
345 |
|
|
emitter.indention = true |
346 |
|
|
emitter.space_above = true |
347 |
|
|
emitter.foot_indent = -1 |
348 |
|
|
|
349 |
|
|
if emitter.encoding != yaml_UTF8_ENCODING { |
350 |
|
|
if !yaml_emitter_write_bom(emitter) { |
351 |
|
|
return false |
352 |
|
|
} |
353 |
|
|
} |
354 |
|
|
emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE |
355 |
|
|
return true |
356 |
|
|
} |
357 |
|
|
|
358 |
|
|
// Expect DOCUMENT-START or STREAM-END. |
359 |
|
|
func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { |
360 |
|
|
|
361 |
|
|
if event.typ == yaml_DOCUMENT_START_EVENT { |
362 |
|
|
|
363 |
|
|
if event.version_directive != nil { |
364 |
|
|
if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) { |
365 |
|
|
return false |
366 |
|
|
} |
367 |
|
|
} |
368 |
|
|
|
369 |
|
|
for i := 0; i < len(event.tag_directives); i++ { |
370 |
|
|
tag_directive := &event.tag_directives[i] |
371 |
|
|
if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) { |
372 |
|
|
return false |
373 |
|
|
} |
374 |
|
|
if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) { |
375 |
|
|
return false |
376 |
|
|
} |
377 |
|
|
} |
378 |
|
|
|
379 |
|
|
for i := 0; i < len(default_tag_directives); i++ { |
380 |
|
|
tag_directive := &default_tag_directives[i] |
381 |
|
|
if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) { |
382 |
|
|
return false |
383 |
|
|
} |
384 |
|
|
} |
385 |
|
|
|
386 |
|
|
implicit := event.implicit |
387 |
|
|
if !first || emitter.canonical { |
388 |
|
|
implicit = false |
389 |
|
|
} |
390 |
|
|
|
391 |
|
|
if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) { |
392 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { |
393 |
|
|
return false |
394 |
|
|
} |
395 |
|
|
if !yaml_emitter_write_indent(emitter) { |
396 |
|
|
return false |
397 |
|
|
} |
398 |
|
|
} |
399 |
|
|
|
400 |
|
|
if event.version_directive != nil { |
401 |
|
|
implicit = false |
402 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) { |
403 |
|
|
return false |
404 |
|
|
} |
405 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) { |
406 |
|
|
return false |
407 |
|
|
} |
408 |
|
|
if !yaml_emitter_write_indent(emitter) { |
409 |
|
|
return false |
410 |
|
|
} |
411 |
|
|
} |
412 |
|
|
|
413 |
|
|
if len(event.tag_directives) > 0 { |
414 |
|
|
implicit = false |
415 |
|
|
for i := 0; i < len(event.tag_directives); i++ { |
416 |
|
|
tag_directive := &event.tag_directives[i] |
417 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) { |
418 |
|
|
return false |
419 |
|
|
} |
420 |
|
|
if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) { |
421 |
|
|
return false |
422 |
|
|
} |
423 |
|
|
if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) { |
424 |
|
|
return false |
425 |
|
|
} |
426 |
|
|
if !yaml_emitter_write_indent(emitter) { |
427 |
|
|
return false |
428 |
|
|
} |
429 |
|
|
} |
430 |
|
|
} |
431 |
|
|
|
432 |
|
|
if yaml_emitter_check_empty_document(emitter) { |
433 |
|
|
implicit = false |
434 |
|
|
} |
435 |
|
|
if !implicit { |
436 |
|
|
if !yaml_emitter_write_indent(emitter) { |
437 |
|
|
return false |
438 |
|
|
} |
439 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) { |
440 |
|
|
return false |
441 |
|
|
} |
442 |
|
|
if emitter.canonical || true { |
443 |
|
|
if !yaml_emitter_write_indent(emitter) { |
444 |
|
|
return false |
445 |
|
|
} |
446 |
|
|
} |
447 |
|
|
} |
448 |
|
|
|
449 |
|
|
if len(emitter.head_comment) > 0 { |
450 |
|
|
if !yaml_emitter_process_head_comment(emitter) { |
451 |
|
|
return false |
452 |
|
|
} |
453 |
|
|
if !put_break(emitter) { |
454 |
|
|
return false |
455 |
|
|
} |
456 |
|
|
} |
457 |
|
|
|
458 |
|
|
emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE |
459 |
|
|
return true |
460 |
|
|
} |
461 |
|
|
|
462 |
|
|
if event.typ == yaml_STREAM_END_EVENT { |
463 |
|
|
if emitter.open_ended { |
464 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { |
465 |
|
|
return false |
466 |
|
|
} |
467 |
|
|
if !yaml_emitter_write_indent(emitter) { |
468 |
|
|
return false |
469 |
|
|
} |
470 |
|
|
} |
471 |
|
|
if !yaml_emitter_flush(emitter) { |
472 |
|
|
return false |
473 |
|
|
} |
474 |
|
|
emitter.state = yaml_EMIT_END_STATE |
475 |
|
|
return true |
476 |
|
|
} |
477 |
|
|
|
478 |
|
|
return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END") |
479 |
|
|
} |
480 |
|
|
|
481 |
|
|
// Expect the root node. |
482 |
|
|
func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool { |
483 |
|
|
emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE) |
484 |
|
|
|
485 |
|
|
if !yaml_emitter_process_head_comment(emitter) { |
486 |
|
|
return false |
487 |
|
|
} |
488 |
|
|
if !yaml_emitter_emit_node(emitter, event, true, false, false, false) { |
489 |
|
|
return false |
490 |
|
|
} |
491 |
|
|
if !yaml_emitter_process_line_comment(emitter) { |
492 |
|
|
return false |
493 |
|
|
} |
494 |
|
|
if !yaml_emitter_process_foot_comment(emitter) { |
495 |
|
|
return false |
496 |
|
|
} |
497 |
|
|
return true |
498 |
|
|
} |
499 |
|
|
|
500 |
|
|
// Expect DOCUMENT-END. |
501 |
|
|
func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool { |
502 |
|
|
if event.typ != yaml_DOCUMENT_END_EVENT { |
503 |
|
|
return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END") |
504 |
|
|
} |
505 |
|
|
// [Go] Force document foot separation. |
506 |
|
|
emitter.foot_indent = 0 |
507 |
|
|
if !yaml_emitter_process_foot_comment(emitter) { |
508 |
|
|
return false |
509 |
|
|
} |
510 |
|
|
emitter.foot_indent = -1 |
511 |
|
|
if !yaml_emitter_write_indent(emitter) { |
512 |
|
|
return false |
513 |
|
|
} |
514 |
|
|
if !event.implicit { |
515 |
|
|
// [Go] Allocate the slice elsewhere. |
516 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { |
517 |
|
|
return false |
518 |
|
|
} |
519 |
|
|
if !yaml_emitter_write_indent(emitter) { |
520 |
|
|
return false |
521 |
|
|
} |
522 |
|
|
} |
523 |
|
|
if !yaml_emitter_flush(emitter) { |
524 |
|
|
return false |
525 |
|
|
} |
526 |
|
|
emitter.state = yaml_EMIT_DOCUMENT_START_STATE |
527 |
|
|
emitter.tag_directives = emitter.tag_directives[:0] |
528 |
|
|
return true |
529 |
|
|
} |
530 |
|
|
|
531 |
|
|
// Expect a flow item node. |
532 |
|
|
func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool { |
533 |
|
|
if first { |
534 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { |
535 |
|
|
return false |
536 |
|
|
} |
537 |
|
|
if !yaml_emitter_increase_indent(emitter, true, false) { |
538 |
|
|
return false |
539 |
|
|
} |
540 |
|
|
emitter.flow_level++ |
541 |
|
|
} |
542 |
|
|
|
543 |
|
|
if event.typ == yaml_SEQUENCE_END_EVENT { |
544 |
|
|
if emitter.canonical && !first && !trail { |
545 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { |
546 |
|
|
return false |
547 |
|
|
} |
548 |
|
|
} |
549 |
|
|
emitter.flow_level-- |
550 |
|
|
emitter.indent = emitter.indents[len(emitter.indents)-1] |
551 |
|
|
emitter.indents = emitter.indents[:len(emitter.indents)-1] |
552 |
|
|
if emitter.column == 0 || emitter.canonical && !first { |
553 |
|
|
if !yaml_emitter_write_indent(emitter) { |
554 |
|
|
return false |
555 |
|
|
} |
556 |
|
|
} |
557 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { |
558 |
|
|
return false |
559 |
|
|
} |
560 |
|
|
if !yaml_emitter_process_line_comment(emitter) { |
561 |
|
|
return false |
562 |
|
|
} |
563 |
|
|
if !yaml_emitter_process_foot_comment(emitter) { |
564 |
|
|
return false |
565 |
|
|
} |
566 |
|
|
emitter.state = emitter.states[len(emitter.states)-1] |
567 |
|
|
emitter.states = emitter.states[:len(emitter.states)-1] |
568 |
|
|
|
569 |
|
|
return true |
570 |
|
|
} |
571 |
|
|
|
572 |
|
|
if !first && !trail { |
573 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { |
574 |
|
|
return false |
575 |
|
|
} |
576 |
|
|
} |
577 |
|
|
|
578 |
|
|
if !yaml_emitter_process_head_comment(emitter) { |
579 |
|
|
return false |
580 |
|
|
} |
581 |
|
|
if emitter.column == 0 { |
582 |
|
|
if !yaml_emitter_write_indent(emitter) { |
583 |
|
|
return false |
584 |
|
|
} |
585 |
|
|
} |
586 |
|
|
|
587 |
|
|
if emitter.canonical || emitter.column > emitter.best_width { |
588 |
|
|
if !yaml_emitter_write_indent(emitter) { |
589 |
|
|
return false |
590 |
|
|
} |
591 |
|
|
} |
592 |
|
|
if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { |
593 |
|
|
emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE) |
594 |
|
|
} else { |
595 |
|
|
emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) |
596 |
|
|
} |
597 |
|
|
if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { |
598 |
|
|
return false |
599 |
|
|
} |
600 |
|
|
if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { |
601 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { |
602 |
|
|
return false |
603 |
|
|
} |
604 |
|
|
} |
605 |
|
|
if !yaml_emitter_process_line_comment(emitter) { |
606 |
|
|
return false |
607 |
|
|
} |
608 |
|
|
if !yaml_emitter_process_foot_comment(emitter) { |
609 |
|
|
return false |
610 |
|
|
} |
611 |
|
|
return true |
612 |
|
|
} |
613 |
|
|
|
614 |
|
|
// Expect a flow key node. |
615 |
|
|
func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool { |
616 |
|
|
if first { |
617 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { |
618 |
|
|
return false |
619 |
|
|
} |
620 |
|
|
if !yaml_emitter_increase_indent(emitter, true, false) { |
621 |
|
|
return false |
622 |
|
|
} |
623 |
|
|
emitter.flow_level++ |
624 |
|
|
} |
625 |
|
|
|
626 |
|
|
if event.typ == yaml_MAPPING_END_EVENT { |
627 |
|
|
if (emitter.canonical || len(emitter.head_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0) && !first && !trail { |
628 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { |
629 |
|
|
return false |
630 |
|
|
} |
631 |
|
|
} |
632 |
|
|
if !yaml_emitter_process_head_comment(emitter) { |
633 |
|
|
return false |
634 |
|
|
} |
635 |
|
|
emitter.flow_level-- |
636 |
|
|
emitter.indent = emitter.indents[len(emitter.indents)-1] |
637 |
|
|
emitter.indents = emitter.indents[:len(emitter.indents)-1] |
638 |
|
|
if emitter.canonical && !first { |
639 |
|
|
if !yaml_emitter_write_indent(emitter) { |
640 |
|
|
return false |
641 |
|
|
} |
642 |
|
|
} |
643 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { |
644 |
|
|
return false |
645 |
|
|
} |
646 |
|
|
if !yaml_emitter_process_line_comment(emitter) { |
647 |
|
|
return false |
648 |
|
|
} |
649 |
|
|
if !yaml_emitter_process_foot_comment(emitter) { |
650 |
|
|
return false |
651 |
|
|
} |
652 |
|
|
emitter.state = emitter.states[len(emitter.states)-1] |
653 |
|
|
emitter.states = emitter.states[:len(emitter.states)-1] |
654 |
|
|
return true |
655 |
|
|
} |
656 |
|
|
|
657 |
|
|
if !first && !trail { |
658 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { |
659 |
|
|
return false |
660 |
|
|
} |
661 |
|
|
} |
662 |
|
|
|
663 |
|
|
if !yaml_emitter_process_head_comment(emitter) { |
664 |
|
|
return false |
665 |
|
|
} |
666 |
|
|
|
667 |
|
|
if emitter.column == 0 { |
668 |
|
|
if !yaml_emitter_write_indent(emitter) { |
669 |
|
|
return false |
670 |
|
|
} |
671 |
|
|
} |
672 |
|
|
|
673 |
|
|
if emitter.canonical || emitter.column > emitter.best_width { |
674 |
|
|
if !yaml_emitter_write_indent(emitter) { |
675 |
|
|
return false |
676 |
|
|
} |
677 |
|
|
} |
678 |
|
|
|
679 |
|
|
if !emitter.canonical && yaml_emitter_check_simple_key(emitter) { |
680 |
|
|
emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE) |
681 |
|
|
return yaml_emitter_emit_node(emitter, event, false, false, true, true) |
682 |
|
|
} |
683 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) { |
684 |
|
|
return false |
685 |
|
|
} |
686 |
|
|
emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE) |
687 |
|
|
return yaml_emitter_emit_node(emitter, event, false, false, true, false) |
688 |
|
|
} |
689 |
|
|
|
690 |
|
|
// Expect a flow value node. |
691 |
|
|
func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { |
692 |
|
|
if simple { |
693 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { |
694 |
|
|
return false |
695 |
|
|
} |
696 |
|
|
} else { |
697 |
|
|
if emitter.canonical || emitter.column > emitter.best_width { |
698 |
|
|
if !yaml_emitter_write_indent(emitter) { |
699 |
|
|
return false |
700 |
|
|
} |
701 |
|
|
} |
702 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) { |
703 |
|
|
return false |
704 |
|
|
} |
705 |
|
|
} |
706 |
|
|
if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { |
707 |
|
|
emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE) |
708 |
|
|
} else { |
709 |
|
|
emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) |
710 |
|
|
} |
711 |
|
|
if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { |
712 |
|
|
return false |
713 |
|
|
} |
714 |
|
|
if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { |
715 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { |
716 |
|
|
return false |
717 |
|
|
} |
718 |
|
|
} |
719 |
|
|
if !yaml_emitter_process_line_comment(emitter) { |
720 |
|
|
return false |
721 |
|
|
} |
722 |
|
|
if !yaml_emitter_process_foot_comment(emitter) { |
723 |
|
|
return false |
724 |
|
|
} |
725 |
|
|
return true |
726 |
|
|
} |
727 |
|
|
|
728 |
|
|
// Expect a block item node. |
729 |
|
|
func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { |
730 |
|
|
if first { |
731 |
|
|
if !yaml_emitter_increase_indent(emitter, false, false) { |
732 |
|
|
return false |
733 |
|
|
} |
734 |
|
|
} |
735 |
|
|
if event.typ == yaml_SEQUENCE_END_EVENT { |
736 |
|
|
emitter.indent = emitter.indents[len(emitter.indents)-1] |
737 |
|
|
emitter.indents = emitter.indents[:len(emitter.indents)-1] |
738 |
|
|
emitter.state = emitter.states[len(emitter.states)-1] |
739 |
|
|
emitter.states = emitter.states[:len(emitter.states)-1] |
740 |
|
|
return true |
741 |
|
|
} |
742 |
|
|
if !yaml_emitter_process_head_comment(emitter) { |
743 |
|
|
return false |
744 |
|
|
} |
745 |
|
|
if !yaml_emitter_write_indent(emitter) { |
746 |
|
|
return false |
747 |
|
|
} |
748 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) { |
749 |
|
|
return false |
750 |
|
|
} |
751 |
|
|
emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE) |
752 |
|
|
if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { |
753 |
|
|
return false |
754 |
|
|
} |
755 |
|
|
if !yaml_emitter_process_line_comment(emitter) { |
756 |
|
|
return false |
757 |
|
|
} |
758 |
|
|
if !yaml_emitter_process_foot_comment(emitter) { |
759 |
|
|
return false |
760 |
|
|
} |
761 |
|
|
return true |
762 |
|
|
} |
763 |
|
|
|
764 |
|
|
// Expect a block key node. |
765 |
|
|
func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { |
766 |
|
|
if first { |
767 |
|
|
if !yaml_emitter_increase_indent(emitter, false, false) { |
768 |
|
|
return false |
769 |
|
|
} |
770 |
|
|
} |
771 |
|
|
if !yaml_emitter_process_head_comment(emitter) { |
772 |
|
|
return false |
773 |
|
|
} |
774 |
|
|
if event.typ == yaml_MAPPING_END_EVENT { |
775 |
|
|
emitter.indent = emitter.indents[len(emitter.indents)-1] |
776 |
|
|
emitter.indents = emitter.indents[:len(emitter.indents)-1] |
777 |
|
|
emitter.state = emitter.states[len(emitter.states)-1] |
778 |
|
|
emitter.states = emitter.states[:len(emitter.states)-1] |
779 |
|
|
return true |
780 |
|
|
} |
781 |
|
|
if !yaml_emitter_write_indent(emitter) { |
782 |
|
|
return false |
783 |
|
|
} |
784 |
|
|
if len(emitter.line_comment) > 0 { |
785 |
|
|
// [Go] A line comment was provided for the key. That's unusual as the |
786 |
|
|
// scanner associates line comments with the value. Either way, |
787 |
|
|
// save the line comment and render it appropriately later. |
788 |
|
|
emitter.key_line_comment = emitter.line_comment |
789 |
|
|
emitter.line_comment = nil |
790 |
|
|
} |
791 |
|
|
if yaml_emitter_check_simple_key(emitter) { |
792 |
|
|
emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) |
793 |
|
|
return yaml_emitter_emit_node(emitter, event, false, false, true, true) |
794 |
|
|
} |
795 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) { |
796 |
|
|
return false |
797 |
|
|
} |
798 |
|
|
emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE) |
799 |
|
|
return yaml_emitter_emit_node(emitter, event, false, false, true, false) |
800 |
|
|
} |
801 |
|
|
|
802 |
|
|
// Expect a block value node. |
803 |
|
|
func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { |
804 |
|
|
if simple { |
805 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { |
806 |
|
|
return false |
807 |
|
|
} |
808 |
|
|
} else { |
809 |
|
|
if !yaml_emitter_write_indent(emitter) { |
810 |
|
|
return false |
811 |
|
|
} |
812 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) { |
813 |
|
|
return false |
814 |
|
|
} |
815 |
|
|
} |
816 |
|
|
if len(emitter.key_line_comment) > 0 { |
817 |
|
|
// [Go] Line comments are generally associated with the value, but when there's |
818 |
|
|
// no value on the same line as a mapping key they end up attached to the |
819 |
|
|
// key itself. |
820 |
|
|
if event.typ == yaml_SCALAR_EVENT { |
821 |
|
|
if len(emitter.line_comment) == 0 { |
822 |
|
|
// A scalar is coming and it has no line comments by itself yet, |
823 |
|
|
// so just let it handle the line comment as usual. If it has a |
824 |
|
|
// line comment, we can't have both so the one from the key is lost. |
825 |
|
|
emitter.line_comment = emitter.key_line_comment |
826 |
|
|
emitter.key_line_comment = nil |
827 |
|
|
} |
828 |
|
|
} else if event.sequence_style() != yaml_FLOW_SEQUENCE_STYLE && (event.typ == yaml_MAPPING_START_EVENT || event.typ == yaml_SEQUENCE_START_EVENT) { |
829 |
|
|
// An indented block follows, so write the comment right now. |
830 |
|
|
emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment |
831 |
|
|
if !yaml_emitter_process_line_comment(emitter) { |
832 |
|
|
return false |
833 |
|
|
} |
834 |
|
|
emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment |
835 |
|
|
} |
836 |
|
|
} |
837 |
|
|
emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) |
838 |
|
|
if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { |
839 |
|
|
return false |
840 |
|
|
} |
841 |
|
|
if !yaml_emitter_process_line_comment(emitter) { |
842 |
|
|
return false |
843 |
|
|
} |
844 |
|
|
if !yaml_emitter_process_foot_comment(emitter) { |
845 |
|
|
return false |
846 |
|
|
} |
847 |
|
|
return true |
848 |
|
|
} |
849 |
|
|
|
850 |
|
|
func yaml_emitter_silent_nil_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { |
851 |
|
|
return event.typ == yaml_SCALAR_EVENT && event.implicit && !emitter.canonical && len(emitter.scalar_data.value) == 0 |
852 |
|
|
} |
853 |
|
|
|
854 |
|
|
// Expect a node. |
855 |
|
|
func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, |
856 |
|
|
root bool, sequence bool, mapping bool, simple_key bool) bool { |
857 |
|
|
|
858 |
|
|
emitter.root_context = root |
859 |
|
|
emitter.sequence_context = sequence |
860 |
|
|
emitter.mapping_context = mapping |
861 |
|
|
emitter.simple_key_context = simple_key |
862 |
|
|
|
863 |
|
|
switch event.typ { |
864 |
|
|
case yaml_ALIAS_EVENT: |
865 |
|
|
return yaml_emitter_emit_alias(emitter, event) |
866 |
|
|
case yaml_SCALAR_EVENT: |
867 |
|
|
return yaml_emitter_emit_scalar(emitter, event) |
868 |
|
|
case yaml_SEQUENCE_START_EVENT: |
869 |
|
|
return yaml_emitter_emit_sequence_start(emitter, event) |
870 |
|
|
case yaml_MAPPING_START_EVENT: |
871 |
|
|
return yaml_emitter_emit_mapping_start(emitter, event) |
872 |
|
|
default: |
873 |
|
|
return yaml_emitter_set_emitter_error(emitter, |
874 |
|
|
fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ)) |
875 |
|
|
} |
876 |
|
|
} |
877 |
|
|
|
878 |
|
|
// Expect ALIAS. |
879 |
|
|
func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool { |
880 |
|
|
if !yaml_emitter_process_anchor(emitter) { |
881 |
|
|
return false |
882 |
|
|
} |
883 |
|
|
emitter.state = emitter.states[len(emitter.states)-1] |
884 |
|
|
emitter.states = emitter.states[:len(emitter.states)-1] |
885 |
|
|
return true |
886 |
|
|
} |
887 |
|
|
|
888 |
|
|
// Expect SCALAR. |
889 |
|
|
func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool { |
890 |
|
|
if !yaml_emitter_select_scalar_style(emitter, event) { |
891 |
|
|
return false |
892 |
|
|
} |
893 |
|
|
if !yaml_emitter_process_anchor(emitter) { |
894 |
|
|
return false |
895 |
|
|
} |
896 |
|
|
if !yaml_emitter_process_tag(emitter) { |
897 |
|
|
return false |
898 |
|
|
} |
899 |
|
|
if !yaml_emitter_increase_indent(emitter, true, false) { |
900 |
|
|
return false |
901 |
|
|
} |
902 |
|
|
if !yaml_emitter_process_scalar(emitter) { |
903 |
|
|
return false |
904 |
|
|
} |
905 |
|
|
emitter.indent = emitter.indents[len(emitter.indents)-1] |
906 |
|
|
emitter.indents = emitter.indents[:len(emitter.indents)-1] |
907 |
|
|
emitter.state = emitter.states[len(emitter.states)-1] |
908 |
|
|
emitter.states = emitter.states[:len(emitter.states)-1] |
909 |
|
|
return true |
910 |
|
|
} |
911 |
|
|
|
912 |
|
|
// Expect SEQUENCE-START. |
913 |
|
|
func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { |
914 |
|
|
if !yaml_emitter_process_anchor(emitter) { |
915 |
|
|
return false |
916 |
|
|
} |
917 |
|
|
if !yaml_emitter_process_tag(emitter) { |
918 |
|
|
return false |
919 |
|
|
} |
920 |
|
|
if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE || |
921 |
|
|
yaml_emitter_check_empty_sequence(emitter) { |
922 |
|
|
emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE |
923 |
|
|
} else { |
924 |
|
|
emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE |
925 |
|
|
} |
926 |
|
|
return true |
927 |
|
|
} |
928 |
|
|
|
929 |
|
|
// Expect MAPPING-START. |
930 |
|
|
func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { |
931 |
|
|
if !yaml_emitter_process_anchor(emitter) { |
932 |
|
|
return false |
933 |
|
|
} |
934 |
|
|
if !yaml_emitter_process_tag(emitter) { |
935 |
|
|
return false |
936 |
|
|
} |
937 |
|
|
if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE || |
938 |
|
|
yaml_emitter_check_empty_mapping(emitter) { |
939 |
|
|
emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE |
940 |
|
|
} else { |
941 |
|
|
emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE |
942 |
|
|
} |
943 |
|
|
return true |
944 |
|
|
} |
945 |
|
|
|
946 |
|
|
// Check if the document content is an empty scalar. |
947 |
|
|
func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool { |
948 |
|
|
return false // [Go] Huh? |
949 |
|
|
} |
950 |
|
|
|
951 |
|
|
// Check if the next events represent an empty sequence. |
952 |
|
|
func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool { |
953 |
|
|
if len(emitter.events)-emitter.events_head < 2 { |
954 |
|
|
return false |
955 |
|
|
} |
956 |
|
|
return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT && |
957 |
|
|
emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT |
958 |
|
|
} |
959 |
|
|
|
960 |
|
|
// Check if the next events represent an empty mapping. |
961 |
|
|
func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool { |
962 |
|
|
if len(emitter.events)-emitter.events_head < 2 { |
963 |
|
|
return false |
964 |
|
|
} |
965 |
|
|
return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT && |
966 |
|
|
emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT |
967 |
|
|
} |
968 |
|
|
|
969 |
|
|
// Check if the next node can be expressed as a simple key. |
970 |
|
|
func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool { |
971 |
|
|
length := 0 |
972 |
|
|
switch emitter.events[emitter.events_head].typ { |
973 |
|
|
case yaml_ALIAS_EVENT: |
974 |
|
|
length += len(emitter.anchor_data.anchor) |
975 |
|
|
case yaml_SCALAR_EVENT: |
976 |
|
|
if emitter.scalar_data.multiline { |
977 |
|
|
return false |
978 |
|
|
} |
979 |
|
|
length += len(emitter.anchor_data.anchor) + |
980 |
|
|
len(emitter.tag_data.handle) + |
981 |
|
|
len(emitter.tag_data.suffix) + |
982 |
|
|
len(emitter.scalar_data.value) |
983 |
|
|
case yaml_SEQUENCE_START_EVENT: |
984 |
|
|
if !yaml_emitter_check_empty_sequence(emitter) { |
985 |
|
|
return false |
986 |
|
|
} |
987 |
|
|
length += len(emitter.anchor_data.anchor) + |
988 |
|
|
len(emitter.tag_data.handle) + |
989 |
|
|
len(emitter.tag_data.suffix) |
990 |
|
|
case yaml_MAPPING_START_EVENT: |
991 |
|
|
if !yaml_emitter_check_empty_mapping(emitter) { |
992 |
|
|
return false |
993 |
|
|
} |
994 |
|
|
length += len(emitter.anchor_data.anchor) + |
995 |
|
|
len(emitter.tag_data.handle) + |
996 |
|
|
len(emitter.tag_data.suffix) |
997 |
|
|
default: |
998 |
|
|
return false |
999 |
|
|
} |
1000 |
|
|
return length <= 128 |
1001 |
|
|
} |
1002 |
|
|
|
1003 |
|
|
// Determine an acceptable scalar style. |
1004 |
|
|
func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool { |
1005 |
|
|
|
1006 |
|
|
no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 |
1007 |
|
|
if no_tag && !event.implicit && !event.quoted_implicit { |
1008 |
|
|
return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified") |
1009 |
|
|
} |
1010 |
|
|
|
1011 |
|
|
style := event.scalar_style() |
1012 |
|
|
if style == yaml_ANY_SCALAR_STYLE { |
1013 |
|
|
style = yaml_PLAIN_SCALAR_STYLE |
1014 |
|
|
} |
1015 |
|
|
if emitter.canonical { |
1016 |
|
|
style = yaml_DOUBLE_QUOTED_SCALAR_STYLE |
1017 |
|
|
} |
1018 |
|
|
if emitter.simple_key_context && emitter.scalar_data.multiline { |
1019 |
|
|
style = yaml_DOUBLE_QUOTED_SCALAR_STYLE |
1020 |
|
|
} |
1021 |
|
|
|
1022 |
|
|
if style == yaml_PLAIN_SCALAR_STYLE { |
1023 |
|
|
if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed || |
1024 |
|
|
emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed { |
1025 |
|
|
style = yaml_SINGLE_QUOTED_SCALAR_STYLE |
1026 |
|
|
} |
1027 |
|
|
if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) { |
1028 |
|
|
style = yaml_SINGLE_QUOTED_SCALAR_STYLE |
1029 |
|
|
} |
1030 |
|
|
if no_tag && !event.implicit { |
1031 |
|
|
style = yaml_SINGLE_QUOTED_SCALAR_STYLE |
1032 |
|
|
} |
1033 |
|
|
} |
1034 |
|
|
if style == yaml_SINGLE_QUOTED_SCALAR_STYLE { |
1035 |
|
|
if !emitter.scalar_data.single_quoted_allowed { |
1036 |
|
|
style = yaml_DOUBLE_QUOTED_SCALAR_STYLE |
1037 |
|
|
} |
1038 |
|
|
} |
1039 |
|
|
if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE { |
1040 |
|
|
if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context { |
1041 |
|
|
style = yaml_DOUBLE_QUOTED_SCALAR_STYLE |
1042 |
|
|
} |
1043 |
|
|
} |
1044 |
|
|
|
1045 |
|
|
if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE { |
1046 |
|
|
emitter.tag_data.handle = []byte{'!'} |
1047 |
|
|
} |
1048 |
|
|
emitter.scalar_data.style = style |
1049 |
|
|
return true |
1050 |
|
|
} |
1051 |
|
|
|
1052 |
|
|
// Write an anchor. |
1053 |
|
|
func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { |
1054 |
|
|
if emitter.anchor_data.anchor == nil { |
1055 |
|
|
return true |
1056 |
|
|
} |
1057 |
|
|
c := []byte{'&'} |
1058 |
|
|
if emitter.anchor_data.alias { |
1059 |
|
|
c[0] = '*' |
1060 |
|
|
} |
1061 |
|
|
if !yaml_emitter_write_indicator(emitter, c, true, false, false) { |
1062 |
|
|
return false |
1063 |
|
|
} |
1064 |
|
|
return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor) |
1065 |
|
|
} |
1066 |
|
|
|
1067 |
|
|
// Write a tag. |
1068 |
|
|
func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool { |
1069 |
|
|
if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 { |
1070 |
|
|
return true |
1071 |
|
|
} |
1072 |
|
|
if len(emitter.tag_data.handle) > 0 { |
1073 |
|
|
if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) { |
1074 |
|
|
return false |
1075 |
|
|
} |
1076 |
|
|
if len(emitter.tag_data.suffix) > 0 { |
1077 |
|
|
if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { |
1078 |
|
|
return false |
1079 |
|
|
} |
1080 |
|
|
} |
1081 |
|
|
} else { |
1082 |
|
|
// [Go] Allocate these slices elsewhere. |
1083 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) { |
1084 |
|
|
return false |
1085 |
|
|
} |
1086 |
|
|
if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { |
1087 |
|
|
return false |
1088 |
|
|
} |
1089 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) { |
1090 |
|
|
return false |
1091 |
|
|
} |
1092 |
|
|
} |
1093 |
|
|
return true |
1094 |
|
|
} |
1095 |
|
|
|
1096 |
|
|
// Write a scalar. |
1097 |
|
|
func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool { |
1098 |
|
|
switch emitter.scalar_data.style { |
1099 |
|
|
case yaml_PLAIN_SCALAR_STYLE: |
1100 |
|
|
return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) |
1101 |
|
|
|
1102 |
|
|
case yaml_SINGLE_QUOTED_SCALAR_STYLE: |
1103 |
|
|
return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) |
1104 |
|
|
|
1105 |
|
|
case yaml_DOUBLE_QUOTED_SCALAR_STYLE: |
1106 |
|
|
return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) |
1107 |
|
|
|
1108 |
|
|
case yaml_LITERAL_SCALAR_STYLE: |
1109 |
|
|
return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value) |
1110 |
|
|
|
1111 |
|
|
case yaml_FOLDED_SCALAR_STYLE: |
1112 |
|
|
return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value) |
1113 |
|
|
} |
1114 |
|
|
panic("unknown scalar style") |
1115 |
|
|
} |
1116 |
|
|
|
1117 |
|
|
// Write a head comment. |
1118 |
|
|
func yaml_emitter_process_head_comment(emitter *yaml_emitter_t) bool { |
1119 |
|
|
if len(emitter.tail_comment) > 0 { |
1120 |
|
|
if !yaml_emitter_write_indent(emitter) { |
1121 |
|
|
return false |
1122 |
|
|
} |
1123 |
|
|
if !yaml_emitter_write_comment(emitter, emitter.tail_comment) { |
1124 |
|
|
return false |
1125 |
|
|
} |
1126 |
|
|
emitter.tail_comment = emitter.tail_comment[:0] |
1127 |
|
|
emitter.foot_indent = emitter.indent |
1128 |
|
|
if emitter.foot_indent < 0 { |
1129 |
|
|
emitter.foot_indent = 0 |
1130 |
|
|
} |
1131 |
|
|
} |
1132 |
|
|
|
1133 |
|
|
if len(emitter.head_comment) == 0 { |
1134 |
|
|
return true |
1135 |
|
|
} |
1136 |
|
|
if !yaml_emitter_write_indent(emitter) { |
1137 |
|
|
return false |
1138 |
|
|
} |
1139 |
|
|
if !yaml_emitter_write_comment(emitter, emitter.head_comment) { |
1140 |
|
|
return false |
1141 |
|
|
} |
1142 |
|
|
emitter.head_comment = emitter.head_comment[:0] |
1143 |
|
|
return true |
1144 |
|
|
} |
1145 |
|
|
|
1146 |
|
|
// Write an line comment. |
1147 |
|
|
func yaml_emitter_process_line_comment(emitter *yaml_emitter_t) bool { |
1148 |
|
|
if len(emitter.line_comment) == 0 { |
1149 |
|
|
return true |
1150 |
|
|
} |
1151 |
|
|
if !emitter.whitespace { |
1152 |
|
|
if !put(emitter, ' ') { |
1153 |
|
|
return false |
1154 |
|
|
} |
1155 |
|
|
} |
1156 |
|
|
if !yaml_emitter_write_comment(emitter, emitter.line_comment) { |
1157 |
|
|
return false |
1158 |
|
|
} |
1159 |
|
|
emitter.line_comment = emitter.line_comment[:0] |
1160 |
|
|
return true |
1161 |
|
|
} |
1162 |
|
|
|
1163 |
|
|
// Write a foot comment. |
1164 |
|
|
func yaml_emitter_process_foot_comment(emitter *yaml_emitter_t) bool { |
1165 |
|
|
if len(emitter.foot_comment) == 0 { |
1166 |
|
|
return true |
1167 |
|
|
} |
1168 |
|
|
if !yaml_emitter_write_indent(emitter) { |
1169 |
|
|
return false |
1170 |
|
|
} |
1171 |
|
|
if !yaml_emitter_write_comment(emitter, emitter.foot_comment) { |
1172 |
|
|
return false |
1173 |
|
|
} |
1174 |
|
|
emitter.foot_comment = emitter.foot_comment[:0] |
1175 |
|
|
emitter.foot_indent = emitter.indent |
1176 |
|
|
if emitter.foot_indent < 0 { |
1177 |
|
|
emitter.foot_indent = 0 |
1178 |
|
|
} |
1179 |
|
|
return true |
1180 |
|
|
} |
1181 |
|
|
|
1182 |
|
|
// Check if a %YAML directive is valid. |
1183 |
|
|
func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool { |
1184 |
|
|
if version_directive.major != 1 || version_directive.minor != 1 { |
1185 |
|
|
return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive") |
1186 |
|
|
} |
1187 |
|
|
return true |
1188 |
|
|
} |
1189 |
|
|
|
1190 |
|
|
// Check if a %TAG directive is valid. |
1191 |
|
|
func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool { |
1192 |
|
|
handle := tag_directive.handle |
1193 |
|
|
prefix := tag_directive.prefix |
1194 |
|
|
if len(handle) == 0 { |
1195 |
|
|
return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty") |
1196 |
|
|
} |
1197 |
|
|
if handle[0] != '!' { |
1198 |
|
|
return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'") |
1199 |
|
|
} |
1200 |
|
|
if handle[len(handle)-1] != '!' { |
1201 |
|
|
return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'") |
1202 |
|
|
} |
1203 |
|
|
for i := 1; i < len(handle)-1; i += width(handle[i]) { |
1204 |
|
|
if !is_alpha(handle, i) { |
1205 |
|
|
return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only") |
1206 |
|
|
} |
1207 |
|
|
} |
1208 |
|
|
if len(prefix) == 0 { |
1209 |
|
|
return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty") |
1210 |
|
|
} |
1211 |
|
|
return true |
1212 |
|
|
} |
1213 |
|
|
|
1214 |
|
|
// Check if an anchor is valid. |
1215 |
|
|
func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool { |
1216 |
|
|
if len(anchor) == 0 { |
1217 |
|
|
problem := "anchor value must not be empty" |
1218 |
|
|
if alias { |
1219 |
|
|
problem = "alias value must not be empty" |
1220 |
|
|
} |
1221 |
|
|
return yaml_emitter_set_emitter_error(emitter, problem) |
1222 |
|
|
} |
1223 |
|
|
for i := 0; i < len(anchor); i += width(anchor[i]) { |
1224 |
|
|
if !is_alpha(anchor, i) { |
1225 |
|
|
problem := "anchor value must contain alphanumerical characters only" |
1226 |
|
|
if alias { |
1227 |
|
|
problem = "alias value must contain alphanumerical characters only" |
1228 |
|
|
} |
1229 |
|
|
return yaml_emitter_set_emitter_error(emitter, problem) |
1230 |
|
|
} |
1231 |
|
|
} |
1232 |
|
|
emitter.anchor_data.anchor = anchor |
1233 |
|
|
emitter.anchor_data.alias = alias |
1234 |
|
|
return true |
1235 |
|
|
} |
1236 |
|
|
|
1237 |
|
|
// Check if a tag is valid. |
1238 |
|
|
func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool { |
1239 |
|
|
if len(tag) == 0 { |
1240 |
|
|
return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty") |
1241 |
|
|
} |
1242 |
|
|
for i := 0; i < len(emitter.tag_directives); i++ { |
1243 |
|
|
tag_directive := &emitter.tag_directives[i] |
1244 |
|
|
if bytes.HasPrefix(tag, tag_directive.prefix) { |
1245 |
|
|
emitter.tag_data.handle = tag_directive.handle |
1246 |
|
|
emitter.tag_data.suffix = tag[len(tag_directive.prefix):] |
1247 |
|
|
return true |
1248 |
|
|
} |
1249 |
|
|
} |
1250 |
|
|
emitter.tag_data.suffix = tag |
1251 |
|
|
return true |
1252 |
|
|
} |
1253 |
|
|
|
1254 |
|
|
// Check if a scalar is valid. |
1255 |
|
|
func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { |
1256 |
|
|
var ( |
1257 |
|
|
block_indicators = false |
1258 |
|
|
flow_indicators = false |
1259 |
|
|
line_breaks = false |
1260 |
|
|
special_characters = false |
1261 |
|
|
tab_characters = false |
1262 |
|
|
|
1263 |
|
|
leading_space = false |
1264 |
|
|
leading_break = false |
1265 |
|
|
trailing_space = false |
1266 |
|
|
trailing_break = false |
1267 |
|
|
break_space = false |
1268 |
|
|
space_break = false |
1269 |
|
|
|
1270 |
|
|
preceded_by_whitespace = false |
1271 |
|
|
followed_by_whitespace = false |
1272 |
|
|
previous_space = false |
1273 |
|
|
previous_break = false |
1274 |
|
|
) |
1275 |
|
|
|
1276 |
|
|
emitter.scalar_data.value = value |
1277 |
|
|
|
1278 |
|
|
if len(value) == 0 { |
1279 |
|
|
emitter.scalar_data.multiline = false |
1280 |
|
|
emitter.scalar_data.flow_plain_allowed = false |
1281 |
|
|
emitter.scalar_data.block_plain_allowed = true |
1282 |
|
|
emitter.scalar_data.single_quoted_allowed = true |
1283 |
|
|
emitter.scalar_data.block_allowed = false |
1284 |
|
|
return true |
1285 |
|
|
} |
1286 |
|
|
|
1287 |
|
|
if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) { |
1288 |
|
|
block_indicators = true |
1289 |
|
|
flow_indicators = true |
1290 |
|
|
} |
1291 |
|
|
|
1292 |
|
|
preceded_by_whitespace = true |
1293 |
|
|
for i, w := 0, 0; i < len(value); i += w { |
1294 |
|
|
w = width(value[i]) |
1295 |
|
|
followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w) |
1296 |
|
|
|
1297 |
|
|
if i == 0 { |
1298 |
|
|
switch value[i] { |
1299 |
|
|
case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`': |
1300 |
|
|
flow_indicators = true |
1301 |
|
|
block_indicators = true |
1302 |
|
|
case '?', ':': |
1303 |
|
|
flow_indicators = true |
1304 |
|
|
if followed_by_whitespace { |
1305 |
|
|
block_indicators = true |
1306 |
|
|
} |
1307 |
|
|
case '-': |
1308 |
|
|
if followed_by_whitespace { |
1309 |
|
|
flow_indicators = true |
1310 |
|
|
block_indicators = true |
1311 |
|
|
} |
1312 |
|
|
} |
1313 |
|
|
} else { |
1314 |
|
|
switch value[i] { |
1315 |
|
|
case ',', '?', '[', ']', '{', '}': |
1316 |
|
|
flow_indicators = true |
1317 |
|
|
case ':': |
1318 |
|
|
flow_indicators = true |
1319 |
|
|
if followed_by_whitespace { |
1320 |
|
|
block_indicators = true |
1321 |
|
|
} |
1322 |
|
|
case '#': |
1323 |
|
|
if preceded_by_whitespace { |
1324 |
|
|
flow_indicators = true |
1325 |
|
|
block_indicators = true |
1326 |
|
|
} |
1327 |
|
|
} |
1328 |
|
|
} |
1329 |
|
|
|
1330 |
|
|
if value[i] == '\t' { |
1331 |
|
|
tab_characters = true |
1332 |
|
|
} else if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { |
1333 |
|
|
special_characters = true |
1334 |
|
|
} |
1335 |
|
|
if is_space(value, i) { |
1336 |
|
|
if i == 0 { |
1337 |
|
|
leading_space = true |
1338 |
|
|
} |
1339 |
|
|
if i+width(value[i]) == len(value) { |
1340 |
|
|
trailing_space = true |
1341 |
|
|
} |
1342 |
|
|
if previous_break { |
1343 |
|
|
break_space = true |
1344 |
|
|
} |
1345 |
|
|
previous_space = true |
1346 |
|
|
previous_break = false |
1347 |
|
|
} else if is_break(value, i) { |
1348 |
|
|
line_breaks = true |
1349 |
|
|
if i == 0 { |
1350 |
|
|
leading_break = true |
1351 |
|
|
} |
1352 |
|
|
if i+width(value[i]) == len(value) { |
1353 |
|
|
trailing_break = true |
1354 |
|
|
} |
1355 |
|
|
if previous_space { |
1356 |
|
|
space_break = true |
1357 |
|
|
} |
1358 |
|
|
previous_space = false |
1359 |
|
|
previous_break = true |
1360 |
|
|
} else { |
1361 |
|
|
previous_space = false |
1362 |
|
|
previous_break = false |
1363 |
|
|
} |
1364 |
|
|
|
1365 |
|
|
// [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition. |
1366 |
|
|
preceded_by_whitespace = is_blankz(value, i) |
1367 |
|
|
} |
1368 |
|
|
|
1369 |
|
|
emitter.scalar_data.multiline = line_breaks |
1370 |
|
|
emitter.scalar_data.flow_plain_allowed = true |
1371 |
|
|
emitter.scalar_data.block_plain_allowed = true |
1372 |
|
|
emitter.scalar_data.single_quoted_allowed = true |
1373 |
|
|
emitter.scalar_data.block_allowed = true |
1374 |
|
|
|
1375 |
|
|
if leading_space || leading_break || trailing_space || trailing_break { |
1376 |
|
|
emitter.scalar_data.flow_plain_allowed = false |
1377 |
|
|
emitter.scalar_data.block_plain_allowed = false |
1378 |
|
|
} |
1379 |
|
|
if trailing_space { |
1380 |
|
|
emitter.scalar_data.block_allowed = false |
1381 |
|
|
} |
1382 |
|
|
if break_space { |
1383 |
|
|
emitter.scalar_data.flow_plain_allowed = false |
1384 |
|
|
emitter.scalar_data.block_plain_allowed = false |
1385 |
|
|
emitter.scalar_data.single_quoted_allowed = false |
1386 |
|
|
} |
1387 |
|
|
if space_break || tab_characters || special_characters { |
1388 |
|
|
emitter.scalar_data.flow_plain_allowed = false |
1389 |
|
|
emitter.scalar_data.block_plain_allowed = false |
1390 |
|
|
emitter.scalar_data.single_quoted_allowed = false |
1391 |
|
|
} |
1392 |
|
|
if space_break || special_characters { |
1393 |
|
|
emitter.scalar_data.block_allowed = false |
1394 |
|
|
} |
1395 |
|
|
if line_breaks { |
1396 |
|
|
emitter.scalar_data.flow_plain_allowed = false |
1397 |
|
|
emitter.scalar_data.block_plain_allowed = false |
1398 |
|
|
} |
1399 |
|
|
if flow_indicators { |
1400 |
|
|
emitter.scalar_data.flow_plain_allowed = false |
1401 |
|
|
} |
1402 |
|
|
if block_indicators { |
1403 |
|
|
emitter.scalar_data.block_plain_allowed = false |
1404 |
|
|
} |
1405 |
|
|
return true |
1406 |
|
|
} |
1407 |
|
|
|
1408 |
|
|
// Check if the event data is valid. |
1409 |
|
|
func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { |
1410 |
|
|
|
1411 |
|
|
emitter.anchor_data.anchor = nil |
1412 |
|
|
emitter.tag_data.handle = nil |
1413 |
|
|
emitter.tag_data.suffix = nil |
1414 |
|
|
emitter.scalar_data.value = nil |
1415 |
|
|
|
1416 |
|
|
if len(event.head_comment) > 0 { |
1417 |
|
|
emitter.head_comment = event.head_comment |
1418 |
|
|
} |
1419 |
|
|
if len(event.line_comment) > 0 { |
1420 |
|
|
emitter.line_comment = event.line_comment |
1421 |
|
|
} |
1422 |
|
|
if len(event.foot_comment) > 0 { |
1423 |
|
|
emitter.foot_comment = event.foot_comment |
1424 |
|
|
} |
1425 |
|
|
if len(event.tail_comment) > 0 { |
1426 |
|
|
emitter.tail_comment = event.tail_comment |
1427 |
|
|
} |
1428 |
|
|
|
1429 |
|
|
switch event.typ { |
1430 |
|
|
case yaml_ALIAS_EVENT: |
1431 |
|
|
if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) { |
1432 |
|
|
return false |
1433 |
|
|
} |
1434 |
|
|
|
1435 |
|
|
case yaml_SCALAR_EVENT: |
1436 |
|
|
if len(event.anchor) > 0 { |
1437 |
|
|
if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { |
1438 |
|
|
return false |
1439 |
|
|
} |
1440 |
|
|
} |
1441 |
|
|
if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) { |
1442 |
|
|
if !yaml_emitter_analyze_tag(emitter, event.tag) { |
1443 |
|
|
return false |
1444 |
|
|
} |
1445 |
|
|
} |
1446 |
|
|
if !yaml_emitter_analyze_scalar(emitter, event.value) { |
1447 |
|
|
return false |
1448 |
|
|
} |
1449 |
|
|
|
1450 |
|
|
case yaml_SEQUENCE_START_EVENT: |
1451 |
|
|
if len(event.anchor) > 0 { |
1452 |
|
|
if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { |
1453 |
|
|
return false |
1454 |
|
|
} |
1455 |
|
|
} |
1456 |
|
|
if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { |
1457 |
|
|
if !yaml_emitter_analyze_tag(emitter, event.tag) { |
1458 |
|
|
return false |
1459 |
|
|
} |
1460 |
|
|
} |
1461 |
|
|
|
1462 |
|
|
case yaml_MAPPING_START_EVENT: |
1463 |
|
|
if len(event.anchor) > 0 { |
1464 |
|
|
if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { |
1465 |
|
|
return false |
1466 |
|
|
} |
1467 |
|
|
} |
1468 |
|
|
if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { |
1469 |
|
|
if !yaml_emitter_analyze_tag(emitter, event.tag) { |
1470 |
|
|
return false |
1471 |
|
|
} |
1472 |
|
|
} |
1473 |
|
|
} |
1474 |
|
|
return true |
1475 |
|
|
} |
1476 |
|
|
|
1477 |
|
|
// Write the BOM character. |
1478 |
|
|
func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool { |
1479 |
|
|
if !flush(emitter) { |
1480 |
|
|
return false |
1481 |
|
|
} |
1482 |
|
|
pos := emitter.buffer_pos |
1483 |
|
|
emitter.buffer[pos+0] = '\xEF' |
1484 |
|
|
emitter.buffer[pos+1] = '\xBB' |
1485 |
|
|
emitter.buffer[pos+2] = '\xBF' |
1486 |
|
|
emitter.buffer_pos += 3 |
1487 |
|
|
return true |
1488 |
|
|
} |
1489 |
|
|
|
1490 |
|
|
func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool { |
1491 |
|
|
indent := emitter.indent |
1492 |
|
|
if indent < 0 { |
1493 |
|
|
indent = 0 |
1494 |
|
|
} |
1495 |
|
|
if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) { |
1496 |
|
|
if !put_break(emitter) { |
1497 |
|
|
return false |
1498 |
|
|
} |
1499 |
|
|
} |
1500 |
|
|
if emitter.foot_indent == indent { |
1501 |
|
|
if !put_break(emitter) { |
1502 |
|
|
return false |
1503 |
|
|
} |
1504 |
|
|
} |
1505 |
|
|
for emitter.column < indent { |
1506 |
|
|
if !put(emitter, ' ') { |
1507 |
|
|
return false |
1508 |
|
|
} |
1509 |
|
|
} |
1510 |
|
|
emitter.whitespace = true |
1511 |
|
|
//emitter.indention = true |
1512 |
|
|
emitter.space_above = false |
1513 |
|
|
emitter.foot_indent = -1 |
1514 |
|
|
return true |
1515 |
|
|
} |
1516 |
|
|
|
1517 |
|
|
func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool { |
1518 |
|
|
if need_whitespace && !emitter.whitespace { |
1519 |
|
|
if !put(emitter, ' ') { |
1520 |
|
|
return false |
1521 |
|
|
} |
1522 |
|
|
} |
1523 |
|
|
if !write_all(emitter, indicator) { |
1524 |
|
|
return false |
1525 |
|
|
} |
1526 |
|
|
emitter.whitespace = is_whitespace |
1527 |
|
|
emitter.indention = (emitter.indention && is_indention) |
1528 |
|
|
emitter.open_ended = false |
1529 |
|
|
return true |
1530 |
|
|
} |
1531 |
|
|
|
1532 |
|
|
func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool { |
1533 |
|
|
if !write_all(emitter, value) { |
1534 |
|
|
return false |
1535 |
|
|
} |
1536 |
|
|
emitter.whitespace = false |
1537 |
|
|
emitter.indention = false |
1538 |
|
|
return true |
1539 |
|
|
} |
1540 |
|
|
|
1541 |
|
|
func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool { |
1542 |
|
|
if !emitter.whitespace { |
1543 |
|
|
if !put(emitter, ' ') { |
1544 |
|
|
return false |
1545 |
|
|
} |
1546 |
|
|
} |
1547 |
|
|
if !write_all(emitter, value) { |
1548 |
|
|
return false |
1549 |
|
|
} |
1550 |
|
|
emitter.whitespace = false |
1551 |
|
|
emitter.indention = false |
1552 |
|
|
return true |
1553 |
|
|
} |
1554 |
|
|
|
1555 |
|
|
func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool { |
1556 |
|
|
if need_whitespace && !emitter.whitespace { |
1557 |
|
|
if !put(emitter, ' ') { |
1558 |
|
|
return false |
1559 |
|
|
} |
1560 |
|
|
} |
1561 |
|
|
for i := 0; i < len(value); { |
1562 |
|
|
var must_write bool |
1563 |
|
|
switch value[i] { |
1564 |
|
|
case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']': |
1565 |
|
|
must_write = true |
1566 |
|
|
default: |
1567 |
|
|
must_write = is_alpha(value, i) |
1568 |
|
|
} |
1569 |
|
|
if must_write { |
1570 |
|
|
if !write(emitter, value, &i) { |
1571 |
|
|
return false |
1572 |
|
|
} |
1573 |
|
|
} else { |
1574 |
|
|
w := width(value[i]) |
1575 |
|
|
for k := 0; k < w; k++ { |
1576 |
|
|
octet := value[i] |
1577 |
|
|
i++ |
1578 |
|
|
if !put(emitter, '%') { |
1579 |
|
|
return false |
1580 |
|
|
} |
1581 |
|
|
|
1582 |
|
|
c := octet >> 4 |
1583 |
|
|
if c < 10 { |
1584 |
|
|
c += '0' |
1585 |
|
|
} else { |
1586 |
|
|
c += 'A' - 10 |
1587 |
|
|
} |
1588 |
|
|
if !put(emitter, c) { |
1589 |
|
|
return false |
1590 |
|
|
} |
1591 |
|
|
|
1592 |
|
|
c = octet & 0x0f |
1593 |
|
|
if c < 10 { |
1594 |
|
|
c += '0' |
1595 |
|
|
} else { |
1596 |
|
|
c += 'A' - 10 |
1597 |
|
|
} |
1598 |
|
|
if !put(emitter, c) { |
1599 |
|
|
return false |
1600 |
|
|
} |
1601 |
|
|
} |
1602 |
|
|
} |
1603 |
|
|
} |
1604 |
|
|
emitter.whitespace = false |
1605 |
|
|
emitter.indention = false |
1606 |
|
|
return true |
1607 |
|
|
} |
1608 |
|
|
|
1609 |
|
|
func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { |
1610 |
|
|
if len(value) > 0 && !emitter.whitespace { |
1611 |
|
|
if !put(emitter, ' ') { |
1612 |
|
|
return false |
1613 |
|
|
} |
1614 |
|
|
} |
1615 |
|
|
|
1616 |
|
|
spaces := false |
1617 |
|
|
breaks := false |
1618 |
|
|
for i := 0; i < len(value); { |
1619 |
|
|
if is_space(value, i) { |
1620 |
|
|
if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) { |
1621 |
|
|
if !yaml_emitter_write_indent(emitter) { |
1622 |
|
|
return false |
1623 |
|
|
} |
1624 |
|
|
i += width(value[i]) |
1625 |
|
|
} else { |
1626 |
|
|
if !write(emitter, value, &i) { |
1627 |
|
|
return false |
1628 |
|
|
} |
1629 |
|
|
} |
1630 |
|
|
spaces = true |
1631 |
|
|
} else if is_break(value, i) { |
1632 |
|
|
if !breaks && value[i] == '\n' { |
1633 |
|
|
if !put_break(emitter) { |
1634 |
|
|
return false |
1635 |
|
|
} |
1636 |
|
|
} |
1637 |
|
|
if !write_break(emitter, value, &i) { |
1638 |
|
|
return false |
1639 |
|
|
} |
1640 |
|
|
//emitter.indention = true |
1641 |
|
|
breaks = true |
1642 |
|
|
} else { |
1643 |
|
|
if breaks { |
1644 |
|
|
if !yaml_emitter_write_indent(emitter) { |
1645 |
|
|
return false |
1646 |
|
|
} |
1647 |
|
|
} |
1648 |
|
|
if !write(emitter, value, &i) { |
1649 |
|
|
return false |
1650 |
|
|
} |
1651 |
|
|
emitter.indention = false |
1652 |
|
|
spaces = false |
1653 |
|
|
breaks = false |
1654 |
|
|
} |
1655 |
|
|
} |
1656 |
|
|
|
1657 |
|
|
if len(value) > 0 { |
1658 |
|
|
emitter.whitespace = false |
1659 |
|
|
} |
1660 |
|
|
emitter.indention = false |
1661 |
|
|
if emitter.root_context { |
1662 |
|
|
emitter.open_ended = true |
1663 |
|
|
} |
1664 |
|
|
|
1665 |
|
|
return true |
1666 |
|
|
} |
1667 |
|
|
|
1668 |
|
|
func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { |
1669 |
|
|
|
1670 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) { |
1671 |
|
|
return false |
1672 |
|
|
} |
1673 |
|
|
|
1674 |
|
|
spaces := false |
1675 |
|
|
breaks := false |
1676 |
|
|
for i := 0; i < len(value); { |
1677 |
|
|
if is_space(value, i) { |
1678 |
|
|
if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) { |
1679 |
|
|
if !yaml_emitter_write_indent(emitter) { |
1680 |
|
|
return false |
1681 |
|
|
} |
1682 |
|
|
i += width(value[i]) |
1683 |
|
|
} else { |
1684 |
|
|
if !write(emitter, value, &i) { |
1685 |
|
|
return false |
1686 |
|
|
} |
1687 |
|
|
} |
1688 |
|
|
spaces = true |
1689 |
|
|
} else if is_break(value, i) { |
1690 |
|
|
if !breaks && value[i] == '\n' { |
1691 |
|
|
if !put_break(emitter) { |
1692 |
|
|
return false |
1693 |
|
|
} |
1694 |
|
|
} |
1695 |
|
|
if !write_break(emitter, value, &i) { |
1696 |
|
|
return false |
1697 |
|
|
} |
1698 |
|
|
//emitter.indention = true |
1699 |
|
|
breaks = true |
1700 |
|
|
} else { |
1701 |
|
|
if breaks { |
1702 |
|
|
if !yaml_emitter_write_indent(emitter) { |
1703 |
|
|
return false |
1704 |
|
|
} |
1705 |
|
|
} |
1706 |
|
|
if value[i] == '\'' { |
1707 |
|
|
if !put(emitter, '\'') { |
1708 |
|
|
return false |
1709 |
|
|
} |
1710 |
|
|
} |
1711 |
|
|
if !write(emitter, value, &i) { |
1712 |
|
|
return false |
1713 |
|
|
} |
1714 |
|
|
emitter.indention = false |
1715 |
|
|
spaces = false |
1716 |
|
|
breaks = false |
1717 |
|
|
} |
1718 |
|
|
} |
1719 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) { |
1720 |
|
|
return false |
1721 |
|
|
} |
1722 |
|
|
emitter.whitespace = false |
1723 |
|
|
emitter.indention = false |
1724 |
|
|
return true |
1725 |
|
|
} |
1726 |
|
|
|
1727 |
|
|
func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { |
1728 |
|
|
spaces := false |
1729 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) { |
1730 |
|
|
return false |
1731 |
|
|
} |
1732 |
|
|
|
1733 |
|
|
for i := 0; i < len(value); { |
1734 |
|
|
if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) || |
1735 |
|
|
is_bom(value, i) || is_break(value, i) || |
1736 |
|
|
value[i] == '"' || value[i] == '\\' { |
1737 |
|
|
|
1738 |
|
|
octet := value[i] |
1739 |
|
|
|
1740 |
|
|
var w int |
1741 |
|
|
var v rune |
1742 |
|
|
switch { |
1743 |
|
|
case octet&0x80 == 0x00: |
1744 |
|
|
w, v = 1, rune(octet&0x7F) |
1745 |
|
|
case octet&0xE0 == 0xC0: |
1746 |
|
|
w, v = 2, rune(octet&0x1F) |
1747 |
|
|
case octet&0xF0 == 0xE0: |
1748 |
|
|
w, v = 3, rune(octet&0x0F) |
1749 |
|
|
case octet&0xF8 == 0xF0: |
1750 |
|
|
w, v = 4, rune(octet&0x07) |
1751 |
|
|
} |
1752 |
|
|
for k := 1; k < w; k++ { |
1753 |
|
|
octet = value[i+k] |
1754 |
|
|
v = (v << 6) + (rune(octet) & 0x3F) |
1755 |
|
|
} |
1756 |
|
|
i += w |
1757 |
|
|
|
1758 |
|
|
if !put(emitter, '\\') { |
1759 |
|
|
return false |
1760 |
|
|
} |
1761 |
|
|
|
1762 |
|
|
var ok bool |
1763 |
|
|
switch v { |
1764 |
|
|
case 0x00: |
1765 |
|
|
ok = put(emitter, '0') |
1766 |
|
|
case 0x07: |
1767 |
|
|
ok = put(emitter, 'a') |
1768 |
|
|
case 0x08: |
1769 |
|
|
ok = put(emitter, 'b') |
1770 |
|
|
case 0x09: |
1771 |
|
|
ok = put(emitter, 't') |
1772 |
|
|
case 0x0A: |
1773 |
|
|
ok = put(emitter, 'n') |
1774 |
|
|
case 0x0b: |
1775 |
|
|
ok = put(emitter, 'v') |
1776 |
|
|
case 0x0c: |
1777 |
|
|
ok = put(emitter, 'f') |
1778 |
|
|
case 0x0d: |
1779 |
|
|
ok = put(emitter, 'r') |
1780 |
|
|
case 0x1b: |
1781 |
|
|
ok = put(emitter, 'e') |
1782 |
|
|
case 0x22: |
1783 |
|
|
ok = put(emitter, '"') |
1784 |
|
|
case 0x5c: |
1785 |
|
|
ok = put(emitter, '\\') |
1786 |
|
|
case 0x85: |
1787 |
|
|
ok = put(emitter, 'N') |
1788 |
|
|
case 0xA0: |
1789 |
|
|
ok = put(emitter, '_') |
1790 |
|
|
case 0x2028: |
1791 |
|
|
ok = put(emitter, 'L') |
1792 |
|
|
case 0x2029: |
1793 |
|
|
ok = put(emitter, 'P') |
1794 |
|
|
default: |
1795 |
|
|
if v <= 0xFF { |
1796 |
|
|
ok = put(emitter, 'x') |
1797 |
|
|
w = 2 |
1798 |
|
|
} else if v <= 0xFFFF { |
1799 |
|
|
ok = put(emitter, 'u') |
1800 |
|
|
w = 4 |
1801 |
|
|
} else { |
1802 |
|
|
ok = put(emitter, 'U') |
1803 |
|
|
w = 8 |
1804 |
|
|
} |
1805 |
|
|
for k := (w - 1) * 4; ok && k >= 0; k -= 4 { |
1806 |
|
|
digit := byte((v >> uint(k)) & 0x0F) |
1807 |
|
|
if digit < 10 { |
1808 |
|
|
ok = put(emitter, digit+'0') |
1809 |
|
|
} else { |
1810 |
|
|
ok = put(emitter, digit+'A'-10) |
1811 |
|
|
} |
1812 |
|
|
} |
1813 |
|
|
} |
1814 |
|
|
if !ok { |
1815 |
|
|
return false |
1816 |
|
|
} |
1817 |
|
|
spaces = false |
1818 |
|
|
} else if is_space(value, i) { |
1819 |
|
|
if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 { |
1820 |
|
|
if !yaml_emitter_write_indent(emitter) { |
1821 |
|
|
return false |
1822 |
|
|
} |
1823 |
|
|
if is_space(value, i+1) { |
1824 |
|
|
if !put(emitter, '\\') { |
1825 |
|
|
return false |
1826 |
|
|
} |
1827 |
|
|
} |
1828 |
|
|
i += width(value[i]) |
1829 |
|
|
} else if !write(emitter, value, &i) { |
1830 |
|
|
return false |
1831 |
|
|
} |
1832 |
|
|
spaces = true |
1833 |
|
|
} else { |
1834 |
|
|
if !write(emitter, value, &i) { |
1835 |
|
|
return false |
1836 |
|
|
} |
1837 |
|
|
spaces = false |
1838 |
|
|
} |
1839 |
|
|
} |
1840 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) { |
1841 |
|
|
return false |
1842 |
|
|
} |
1843 |
|
|
emitter.whitespace = false |
1844 |
|
|
emitter.indention = false |
1845 |
|
|
return true |
1846 |
|
|
} |
1847 |
|
|
|
1848 |
|
|
func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool { |
1849 |
|
|
if is_space(value, 0) || is_break(value, 0) { |
1850 |
|
|
indent_hint := []byte{'0' + byte(emitter.best_indent)} |
1851 |
|
|
if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) { |
1852 |
|
|
return false |
1853 |
|
|
} |
1854 |
|
|
} |
1855 |
|
|
|
1856 |
|
|
emitter.open_ended = false |
1857 |
|
|
|
1858 |
|
|
var chomp_hint [1]byte |
1859 |
|
|
if len(value) == 0 { |
1860 |
|
|
chomp_hint[0] = '-' |
1861 |
|
|
} else { |
1862 |
|
|
i := len(value) - 1 |
1863 |
|
|
for value[i]&0xC0 == 0x80 { |
1864 |
|
|
i-- |
1865 |
|
|
} |
1866 |
|
|
if !is_break(value, i) { |
1867 |
|
|
chomp_hint[0] = '-' |
1868 |
|
|
} else if i == 0 { |
1869 |
|
|
chomp_hint[0] = '+' |
1870 |
|
|
emitter.open_ended = true |
1871 |
|
|
} else { |
1872 |
|
|
i-- |
1873 |
|
|
for value[i]&0xC0 == 0x80 { |
1874 |
|
|
i-- |
1875 |
|
|
} |
1876 |
|
|
if is_break(value, i) { |
1877 |
|
|
chomp_hint[0] = '+' |
1878 |
|
|
emitter.open_ended = true |
1879 |
|
|
} |
1880 |
|
|
} |
1881 |
|
|
} |
1882 |
|
|
if chomp_hint[0] != 0 { |
1883 |
|
|
if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) { |
1884 |
|
|
return false |
1885 |
|
|
} |
1886 |
|
|
} |
1887 |
|
|
return true |
1888 |
|
|
} |
1889 |
|
|
|
1890 |
|
|
func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool { |
1891 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) { |
1892 |
|
|
return false |
1893 |
|
|
} |
1894 |
|
|
if !yaml_emitter_write_block_scalar_hints(emitter, value) { |
1895 |
|
|
return false |
1896 |
|
|
} |
1897 |
|
|
if !yaml_emitter_process_line_comment(emitter) { |
1898 |
|
|
return false |
1899 |
|
|
} |
1900 |
|
|
//emitter.indention = true |
1901 |
|
|
emitter.whitespace = true |
1902 |
|
|
breaks := true |
1903 |
|
|
for i := 0; i < len(value); { |
1904 |
|
|
if is_break(value, i) { |
1905 |
|
|
if !write_break(emitter, value, &i) { |
1906 |
|
|
return false |
1907 |
|
|
} |
1908 |
|
|
//emitter.indention = true |
1909 |
|
|
breaks = true |
1910 |
|
|
} else { |
1911 |
|
|
if breaks { |
1912 |
|
|
if !yaml_emitter_write_indent(emitter) { |
1913 |
|
|
return false |
1914 |
|
|
} |
1915 |
|
|
} |
1916 |
|
|
if !write(emitter, value, &i) { |
1917 |
|
|
return false |
1918 |
|
|
} |
1919 |
|
|
emitter.indention = false |
1920 |
|
|
breaks = false |
1921 |
|
|
} |
1922 |
|
|
} |
1923 |
|
|
|
1924 |
|
|
return true |
1925 |
|
|
} |
1926 |
|
|
|
1927 |
|
|
func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool { |
1928 |
|
|
if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) { |
1929 |
|
|
return false |
1930 |
|
|
} |
1931 |
|
|
if !yaml_emitter_write_block_scalar_hints(emitter, value) { |
1932 |
|
|
return false |
1933 |
|
|
} |
1934 |
|
|
if !yaml_emitter_process_line_comment(emitter) { |
1935 |
|
|
return false |
1936 |
|
|
} |
1937 |
|
|
|
1938 |
|
|
//emitter.indention = true |
1939 |
|
|
emitter.whitespace = true |
1940 |
|
|
|
1941 |
|
|
breaks := true |
1942 |
|
|
leading_spaces := true |
1943 |
|
|
for i := 0; i < len(value); { |
1944 |
|
|
if is_break(value, i) { |
1945 |
|
|
if !breaks && !leading_spaces && value[i] == '\n' { |
1946 |
|
|
k := 0 |
1947 |
|
|
for is_break(value, k) { |
1948 |
|
|
k += width(value[k]) |
1949 |
|
|
} |
1950 |
|
|
if !is_blankz(value, k) { |
1951 |
|
|
if !put_break(emitter) { |
1952 |
|
|
return false |
1953 |
|
|
} |
1954 |
|
|
} |
1955 |
|
|
} |
1956 |
|
|
if !write_break(emitter, value, &i) { |
1957 |
|
|
return false |
1958 |
|
|
} |
1959 |
|
|
//emitter.indention = true |
1960 |
|
|
breaks = true |
1961 |
|
|
} else { |
1962 |
|
|
if breaks { |
1963 |
|
|
if !yaml_emitter_write_indent(emitter) { |
1964 |
|
|
return false |
1965 |
|
|
} |
1966 |
|
|
leading_spaces = is_blank(value, i) |
1967 |
|
|
} |
1968 |
|
|
if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width { |
1969 |
|
|
if !yaml_emitter_write_indent(emitter) { |
1970 |
|
|
return false |
1971 |
|
|
} |
1972 |
|
|
i += width(value[i]) |
1973 |
|
|
} else { |
1974 |
|
|
if !write(emitter, value, &i) { |
1975 |
|
|
return false |
1976 |
|
|
} |
1977 |
|
|
} |
1978 |
|
|
emitter.indention = false |
1979 |
|
|
breaks = false |
1980 |
|
|
} |
1981 |
|
|
} |
1982 |
|
|
return true |
1983 |
|
|
} |
1984 |
|
|
|
1985 |
|
|
func yaml_emitter_write_comment(emitter *yaml_emitter_t, comment []byte) bool { |
1986 |
|
|
breaks := false |
1987 |
|
|
pound := false |
1988 |
|
|
for i := 0; i < len(comment); { |
1989 |
|
|
if is_break(comment, i) { |
1990 |
|
|
if !write_break(emitter, comment, &i) { |
1991 |
|
|
return false |
1992 |
|
|
} |
1993 |
|
|
//emitter.indention = true |
1994 |
|
|
breaks = true |
1995 |
|
|
pound = false |
1996 |
|
|
} else { |
1997 |
|
|
if breaks && !yaml_emitter_write_indent(emitter) { |
1998 |
|
|
return false |
1999 |
|
|
} |
2000 |
|
|
if !pound { |
2001 |
|
|
if comment[i] != '#' && (!put(emitter, '#') || !put(emitter, ' ')) { |
2002 |
|
|
return false |
2003 |
|
|
} |
2004 |
|
|
pound = true |
2005 |
|
|
} |
2006 |
|
|
if !write(emitter, comment, &i) { |
2007 |
|
|
return false |
2008 |
|
|
} |
2009 |
|
|
emitter.indention = false |
2010 |
|
|
breaks = false |
2011 |
|
|
} |
2012 |
|
|
} |
2013 |
|
|
if !breaks && !put_break(emitter) { |
2014 |
|
|
return false |
2015 |
|
|
} |
2016 |
|
|
|
2017 |
|
|
emitter.whitespace = true |
2018 |
|
|
//emitter.indention = true |
2019 |
|
|
return true |
2020 |
|
|
} |