podman

Форк
0
1685 строк · 44.3 Кб
1
package yaml
2

3
import (
4
	"bytes"
5
	"fmt"
6
)
7

8
// Flush the buffer if needed.
9
func flush(emitter *yaml_emitter_t) bool {
10
	if emitter.buffer_pos+5 >= len(emitter.buffer) {
11
		return yaml_emitter_flush(emitter)
12
	}
13
	return true
14
}
15

16
// Put a character to the output buffer.
17
func put(emitter *yaml_emitter_t, value byte) bool {
18
	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
19
		return false
20
	}
21
	emitter.buffer[emitter.buffer_pos] = value
22
	emitter.buffer_pos++
23
	emitter.column++
24
	return true
25
}
26

27
// Put a line break to the output buffer.
28
func put_break(emitter *yaml_emitter_t) bool {
29
	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
30
		return false
31
	}
32
	switch emitter.line_break {
33
	case yaml_CR_BREAK:
34
		emitter.buffer[emitter.buffer_pos] = '\r'
35
		emitter.buffer_pos += 1
36
	case yaml_LN_BREAK:
37
		emitter.buffer[emitter.buffer_pos] = '\n'
38
		emitter.buffer_pos += 1
39
	case yaml_CRLN_BREAK:
40
		emitter.buffer[emitter.buffer_pos+0] = '\r'
41
		emitter.buffer[emitter.buffer_pos+1] = '\n'
42
		emitter.buffer_pos += 2
43
	default:
44
		panic("unknown line break setting")
45
	}
46
	emitter.column = 0
47
	emitter.line++
48
	return true
49
}
50

51
// Copy a character from a string into buffer.
52
func write(emitter *yaml_emitter_t, s []byte, i *int) bool {
53
	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
54
		return false
55
	}
56
	p := emitter.buffer_pos
57
	w := width(s[*i])
58
	switch w {
59
	case 4:
60
		emitter.buffer[p+3] = s[*i+3]
61
		fallthrough
62
	case 3:
63
		emitter.buffer[p+2] = s[*i+2]
64
		fallthrough
65
	case 2:
66
		emitter.buffer[p+1] = s[*i+1]
67
		fallthrough
68
	case 1:
69
		emitter.buffer[p+0] = s[*i+0]
70
	default:
71
		panic("unknown character width")
72
	}
73
	emitter.column++
74
	emitter.buffer_pos += w
75
	*i += w
76
	return true
77
}
78

79
// Write a whole string into buffer.
80
func write_all(emitter *yaml_emitter_t, s []byte) bool {
81
	for i := 0; i < len(s); {
82
		if !write(emitter, s, &i) {
83
			return false
84
		}
85
	}
86
	return true
87
}
88

89
// Copy a line break character from a string into buffer.
90
func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool {
91
	if s[*i] == '\n' {
92
		if !put_break(emitter) {
93
			return false
94
		}
95
		*i++
96
	} else {
97
		if !write(emitter, s, i) {
98
			return false
99
		}
100
		emitter.column = 0
101
		emitter.line++
102
	}
103
	return true
104
}
105

106
// Set an emitter error and return false.
107
func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool {
108
	emitter.error = yaml_EMITTER_ERROR
109
	emitter.problem = problem
110
	return false
111
}
112

113
// Emit an event.
114
func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool {
115
	emitter.events = append(emitter.events, *event)
116
	for !yaml_emitter_need_more_events(emitter) {
117
		event := &emitter.events[emitter.events_head]
118
		if !yaml_emitter_analyze_event(emitter, event) {
119
			return false
120
		}
121
		if !yaml_emitter_state_machine(emitter, event) {
122
			return false
123
		}
124
		yaml_event_delete(event)
125
		emitter.events_head++
126
	}
127
	return true
128
}
129

130
// Check if we need to accumulate more events before emitting.
131
//
132
// We accumulate extra
133
//  - 1 event for DOCUMENT-START
134
//  - 2 events for SEQUENCE-START
135
//  - 3 events for MAPPING-START
136
//
137
func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool {
138
	if emitter.events_head == len(emitter.events) {
139
		return true
140
	}
141
	var accumulate int
142
	switch emitter.events[emitter.events_head].typ {
143
	case yaml_DOCUMENT_START_EVENT:
144
		accumulate = 1
145
		break
146
	case yaml_SEQUENCE_START_EVENT:
147
		accumulate = 2
148
		break
149
	case yaml_MAPPING_START_EVENT:
150
		accumulate = 3
151
		break
152
	default:
153
		return false
154
	}
155
	if len(emitter.events)-emitter.events_head > accumulate {
156
		return false
157
	}
158
	var level int
159
	for i := emitter.events_head; i < len(emitter.events); i++ {
160
		switch emitter.events[i].typ {
161
		case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT:
162
			level++
163
		case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT:
164
			level--
165
		}
166
		if level == 0 {
167
			return false
168
		}
169
	}
170
	return true
171
}
172

173
// Append a directive to the directives stack.
174
func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool {
175
	for i := 0; i < len(emitter.tag_directives); i++ {
176
		if bytes.Equal(value.handle, emitter.tag_directives[i].handle) {
177
			if allow_duplicates {
178
				return true
179
			}
180
			return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive")
181
		}
182
	}
183

184
	// [Go] Do we actually need to copy this given garbage collection
185
	// and the lack of deallocating destructors?
186
	tag_copy := yaml_tag_directive_t{
187
		handle: make([]byte, len(value.handle)),
188
		prefix: make([]byte, len(value.prefix)),
189
	}
190
	copy(tag_copy.handle, value.handle)
191
	copy(tag_copy.prefix, value.prefix)
192
	emitter.tag_directives = append(emitter.tag_directives, tag_copy)
193
	return true
194
}
195

196
// Increase the indentation level.
197
func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool {
198
	emitter.indents = append(emitter.indents, emitter.indent)
199
	if emitter.indent < 0 {
200
		if flow {
201
			emitter.indent = emitter.best_indent
202
		} else {
203
			emitter.indent = 0
204
		}
205
	} else if !indentless {
206
		emitter.indent += emitter.best_indent
207
	}
208
	return true
209
}
210

211
// State dispatcher.
212
func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool {
213
	switch emitter.state {
214
	default:
215
	case yaml_EMIT_STREAM_START_STATE:
216
		return yaml_emitter_emit_stream_start(emitter, event)
217

218
	case yaml_EMIT_FIRST_DOCUMENT_START_STATE:
219
		return yaml_emitter_emit_document_start(emitter, event, true)
220

221
	case yaml_EMIT_DOCUMENT_START_STATE:
222
		return yaml_emitter_emit_document_start(emitter, event, false)
223

224
	case yaml_EMIT_DOCUMENT_CONTENT_STATE:
225
		return yaml_emitter_emit_document_content(emitter, event)
226

227
	case yaml_EMIT_DOCUMENT_END_STATE:
228
		return yaml_emitter_emit_document_end(emitter, event)
229

230
	case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE:
231
		return yaml_emitter_emit_flow_sequence_item(emitter, event, true)
232

233
	case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE:
234
		return yaml_emitter_emit_flow_sequence_item(emitter, event, false)
235

236
	case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE:
237
		return yaml_emitter_emit_flow_mapping_key(emitter, event, true)
238

239
	case yaml_EMIT_FLOW_MAPPING_KEY_STATE:
240
		return yaml_emitter_emit_flow_mapping_key(emitter, event, false)
241

242
	case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE:
243
		return yaml_emitter_emit_flow_mapping_value(emitter, event, true)
244

245
	case yaml_EMIT_FLOW_MAPPING_VALUE_STATE:
246
		return yaml_emitter_emit_flow_mapping_value(emitter, event, false)
247

248
	case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE:
249
		return yaml_emitter_emit_block_sequence_item(emitter, event, true)
250

251
	case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE:
252
		return yaml_emitter_emit_block_sequence_item(emitter, event, false)
253

254
	case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:
255
		return yaml_emitter_emit_block_mapping_key(emitter, event, true)
256

257
	case yaml_EMIT_BLOCK_MAPPING_KEY_STATE:
258
		return yaml_emitter_emit_block_mapping_key(emitter, event, false)
259

260
	case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:
261
		return yaml_emitter_emit_block_mapping_value(emitter, event, true)
262

263
	case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE:
264
		return yaml_emitter_emit_block_mapping_value(emitter, event, false)
265

266
	case yaml_EMIT_END_STATE:
267
		return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END")
268
	}
269
	panic("invalid emitter state")
270
}
271

272
// Expect STREAM-START.
273
func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
274
	if event.typ != yaml_STREAM_START_EVENT {
275
		return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START")
276
	}
277
	if emitter.encoding == yaml_ANY_ENCODING {
278
		emitter.encoding = event.encoding
279
		if emitter.encoding == yaml_ANY_ENCODING {
280
			emitter.encoding = yaml_UTF8_ENCODING
281
		}
282
	}
283
	if emitter.best_indent < 2 || emitter.best_indent > 9 {
284
		emitter.best_indent = 2
285
	}
286
	if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 {
287
		emitter.best_width = 80
288
	}
289
	if emitter.best_width < 0 {
290
		emitter.best_width = 1<<31 - 1
291
	}
292
	if emitter.line_break == yaml_ANY_BREAK {
293
		emitter.line_break = yaml_LN_BREAK
294
	}
295

296
	emitter.indent = -1
297
	emitter.line = 0
298
	emitter.column = 0
299
	emitter.whitespace = true
300
	emitter.indention = true
301

302
	if emitter.encoding != yaml_UTF8_ENCODING {
303
		if !yaml_emitter_write_bom(emitter) {
304
			return false
305
		}
306
	}
307
	emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE
308
	return true
309
}
310

311
// Expect DOCUMENT-START or STREAM-END.
312
func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
313

314
	if event.typ == yaml_DOCUMENT_START_EVENT {
315

316
		if event.version_directive != nil {
317
			if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) {
318
				return false
319
			}
320
		}
321

322
		for i := 0; i < len(event.tag_directives); i++ {
323
			tag_directive := &event.tag_directives[i]
324
			if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) {
325
				return false
326
			}
327
			if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) {
328
				return false
329
			}
330
		}
331

332
		for i := 0; i < len(default_tag_directives); i++ {
333
			tag_directive := &default_tag_directives[i]
334
			if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) {
335
				return false
336
			}
337
		}
338

339
		implicit := event.implicit
340
		if !first || emitter.canonical {
341
			implicit = false
342
		}
343

344
		if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) {
345
			if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
346
				return false
347
			}
348
			if !yaml_emitter_write_indent(emitter) {
349
				return false
350
			}
351
		}
352

353
		if event.version_directive != nil {
354
			implicit = false
355
			if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) {
356
				return false
357
			}
358
			if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) {
359
				return false
360
			}
361
			if !yaml_emitter_write_indent(emitter) {
362
				return false
363
			}
364
		}
365

366
		if len(event.tag_directives) > 0 {
367
			implicit = false
368
			for i := 0; i < len(event.tag_directives); i++ {
369
				tag_directive := &event.tag_directives[i]
370
				if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) {
371
					return false
372
				}
373
				if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) {
374
					return false
375
				}
376
				if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) {
377
					return false
378
				}
379
				if !yaml_emitter_write_indent(emitter) {
380
					return false
381
				}
382
			}
383
		}
384

385
		if yaml_emitter_check_empty_document(emitter) {
386
			implicit = false
387
		}
388
		if !implicit {
389
			if !yaml_emitter_write_indent(emitter) {
390
				return false
391
			}
392
			if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) {
393
				return false
394
			}
395
			if emitter.canonical {
396
				if !yaml_emitter_write_indent(emitter) {
397
					return false
398
				}
399
			}
400
		}
401

402
		emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE
403
		return true
404
	}
405

406
	if event.typ == yaml_STREAM_END_EVENT {
407
		if emitter.open_ended {
408
			if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
409
				return false
410
			}
411
			if !yaml_emitter_write_indent(emitter) {
412
				return false
413
			}
414
		}
415
		if !yaml_emitter_flush(emitter) {
416
			return false
417
		}
418
		emitter.state = yaml_EMIT_END_STATE
419
		return true
420
	}
421

422
	return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END")
423
}
424

425
// Expect the root node.
426
func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool {
427
	emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE)
428
	return yaml_emitter_emit_node(emitter, event, true, false, false, false)
429
}
430

431
// Expect DOCUMENT-END.
432
func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool {
433
	if event.typ != yaml_DOCUMENT_END_EVENT {
434
		return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END")
435
	}
436
	if !yaml_emitter_write_indent(emitter) {
437
		return false
438
	}
439
	if !event.implicit {
440
		// [Go] Allocate the slice elsewhere.
441
		if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
442
			return false
443
		}
444
		if !yaml_emitter_write_indent(emitter) {
445
			return false
446
		}
447
	}
448
	if !yaml_emitter_flush(emitter) {
449
		return false
450
	}
451
	emitter.state = yaml_EMIT_DOCUMENT_START_STATE
452
	emitter.tag_directives = emitter.tag_directives[:0]
453
	return true
454
}
455

456
// Expect a flow item node.
457
func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
458
	if first {
459
		if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) {
460
			return false
461
		}
462
		if !yaml_emitter_increase_indent(emitter, true, false) {
463
			return false
464
		}
465
		emitter.flow_level++
466
	}
467

468
	if event.typ == yaml_SEQUENCE_END_EVENT {
469
		emitter.flow_level--
470
		emitter.indent = emitter.indents[len(emitter.indents)-1]
471
		emitter.indents = emitter.indents[:len(emitter.indents)-1]
472
		if emitter.canonical && !first {
473
			if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
474
				return false
475
			}
476
			if !yaml_emitter_write_indent(emitter) {
477
				return false
478
			}
479
		}
480
		if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) {
481
			return false
482
		}
483
		emitter.state = emitter.states[len(emitter.states)-1]
484
		emitter.states = emitter.states[:len(emitter.states)-1]
485

486
		return true
487
	}
488

489
	if !first {
490
		if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
491
			return false
492
		}
493
	}
494

495
	if emitter.canonical || emitter.column > emitter.best_width {
496
		if !yaml_emitter_write_indent(emitter) {
497
			return false
498
		}
499
	}
500
	emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE)
501
	return yaml_emitter_emit_node(emitter, event, false, true, false, false)
502
}
503

504
// Expect a flow key node.
505
func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
506
	if first {
507
		if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) {
508
			return false
509
		}
510
		if !yaml_emitter_increase_indent(emitter, true, false) {
511
			return false
512
		}
513
		emitter.flow_level++
514
	}
515

516
	if event.typ == yaml_MAPPING_END_EVENT {
517
		emitter.flow_level--
518
		emitter.indent = emitter.indents[len(emitter.indents)-1]
519
		emitter.indents = emitter.indents[:len(emitter.indents)-1]
520
		if emitter.canonical && !first {
521
			if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
522
				return false
523
			}
524
			if !yaml_emitter_write_indent(emitter) {
525
				return false
526
			}
527
		}
528
		if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) {
529
			return false
530
		}
531
		emitter.state = emitter.states[len(emitter.states)-1]
532
		emitter.states = emitter.states[:len(emitter.states)-1]
533
		return true
534
	}
535

536
	if !first {
537
		if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
538
			return false
539
		}
540
	}
541
	if emitter.canonical || emitter.column > emitter.best_width {
542
		if !yaml_emitter_write_indent(emitter) {
543
			return false
544
		}
545
	}
546

547
	if !emitter.canonical && yaml_emitter_check_simple_key(emitter) {
548
		emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE)
549
		return yaml_emitter_emit_node(emitter, event, false, false, true, true)
550
	}
551
	if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) {
552
		return false
553
	}
554
	emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE)
555
	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
556
}
557

558
// Expect a flow value node.
559
func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
560
	if simple {
561
		if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
562
			return false
563
		}
564
	} else {
565
		if emitter.canonical || emitter.column > emitter.best_width {
566
			if !yaml_emitter_write_indent(emitter) {
567
				return false
568
			}
569
		}
570
		if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) {
571
			return false
572
		}
573
	}
574
	emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE)
575
	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
576
}
577

578
// Expect a block item node.
579
func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
580
	if first {
581
		if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) {
582
			return false
583
		}
584
	}
585
	if event.typ == yaml_SEQUENCE_END_EVENT {
586
		emitter.indent = emitter.indents[len(emitter.indents)-1]
587
		emitter.indents = emitter.indents[:len(emitter.indents)-1]
588
		emitter.state = emitter.states[len(emitter.states)-1]
589
		emitter.states = emitter.states[:len(emitter.states)-1]
590
		return true
591
	}
592
	if !yaml_emitter_write_indent(emitter) {
593
		return false
594
	}
595
	if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) {
596
		return false
597
	}
598
	emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE)
599
	return yaml_emitter_emit_node(emitter, event, false, true, false, false)
600
}
601

602
// Expect a block key node.
603
func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
604
	if first {
605
		if !yaml_emitter_increase_indent(emitter, false, false) {
606
			return false
607
		}
608
	}
609
	if event.typ == yaml_MAPPING_END_EVENT {
610
		emitter.indent = emitter.indents[len(emitter.indents)-1]
611
		emitter.indents = emitter.indents[:len(emitter.indents)-1]
612
		emitter.state = emitter.states[len(emitter.states)-1]
613
		emitter.states = emitter.states[:len(emitter.states)-1]
614
		return true
615
	}
616
	if !yaml_emitter_write_indent(emitter) {
617
		return false
618
	}
619
	if yaml_emitter_check_simple_key(emitter) {
620
		emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE)
621
		return yaml_emitter_emit_node(emitter, event, false, false, true, true)
622
	}
623
	if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) {
624
		return false
625
	}
626
	emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE)
627
	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
628
}
629

630
// Expect a block value node.
631
func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
632
	if simple {
633
		if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
634
			return false
635
		}
636
	} else {
637
		if !yaml_emitter_write_indent(emitter) {
638
			return false
639
		}
640
		if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) {
641
			return false
642
		}
643
	}
644
	emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE)
645
	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
646
}
647

648
// Expect a node.
649
func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t,
650
	root bool, sequence bool, mapping bool, simple_key bool) bool {
651

652
	emitter.root_context = root
653
	emitter.sequence_context = sequence
654
	emitter.mapping_context = mapping
655
	emitter.simple_key_context = simple_key
656

657
	switch event.typ {
658
	case yaml_ALIAS_EVENT:
659
		return yaml_emitter_emit_alias(emitter, event)
660
	case yaml_SCALAR_EVENT:
661
		return yaml_emitter_emit_scalar(emitter, event)
662
	case yaml_SEQUENCE_START_EVENT:
663
		return yaml_emitter_emit_sequence_start(emitter, event)
664
	case yaml_MAPPING_START_EVENT:
665
		return yaml_emitter_emit_mapping_start(emitter, event)
666
	default:
667
		return yaml_emitter_set_emitter_error(emitter,
668
			fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ))
669
	}
670
}
671

672
// Expect ALIAS.
673
func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool {
674
	if !yaml_emitter_process_anchor(emitter) {
675
		return false
676
	}
677
	emitter.state = emitter.states[len(emitter.states)-1]
678
	emitter.states = emitter.states[:len(emitter.states)-1]
679
	return true
680
}
681

682
// Expect SCALAR.
683
func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool {
684
	if !yaml_emitter_select_scalar_style(emitter, event) {
685
		return false
686
	}
687
	if !yaml_emitter_process_anchor(emitter) {
688
		return false
689
	}
690
	if !yaml_emitter_process_tag(emitter) {
691
		return false
692
	}
693
	if !yaml_emitter_increase_indent(emitter, true, false) {
694
		return false
695
	}
696
	if !yaml_emitter_process_scalar(emitter) {
697
		return false
698
	}
699
	emitter.indent = emitter.indents[len(emitter.indents)-1]
700
	emitter.indents = emitter.indents[:len(emitter.indents)-1]
701
	emitter.state = emitter.states[len(emitter.states)-1]
702
	emitter.states = emitter.states[:len(emitter.states)-1]
703
	return true
704
}
705

706
// Expect SEQUENCE-START.
707
func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
708
	if !yaml_emitter_process_anchor(emitter) {
709
		return false
710
	}
711
	if !yaml_emitter_process_tag(emitter) {
712
		return false
713
	}
714
	if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE ||
715
		yaml_emitter_check_empty_sequence(emitter) {
716
		emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE
717
	} else {
718
		emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE
719
	}
720
	return true
721
}
722

723
// Expect MAPPING-START.
724
func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
725
	if !yaml_emitter_process_anchor(emitter) {
726
		return false
727
	}
728
	if !yaml_emitter_process_tag(emitter) {
729
		return false
730
	}
731
	if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE ||
732
		yaml_emitter_check_empty_mapping(emitter) {
733
		emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE
734
	} else {
735
		emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE
736
	}
737
	return true
738
}
739

740
// Check if the document content is an empty scalar.
741
func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool {
742
	return false // [Go] Huh?
743
}
744

745
// Check if the next events represent an empty sequence.
746
func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool {
747
	if len(emitter.events)-emitter.events_head < 2 {
748
		return false
749
	}
750
	return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT &&
751
		emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT
752
}
753

754
// Check if the next events represent an empty mapping.
755
func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool {
756
	if len(emitter.events)-emitter.events_head < 2 {
757
		return false
758
	}
759
	return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT &&
760
		emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT
761
}
762

763
// Check if the next node can be expressed as a simple key.
764
func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool {
765
	length := 0
766
	switch emitter.events[emitter.events_head].typ {
767
	case yaml_ALIAS_EVENT:
768
		length += len(emitter.anchor_data.anchor)
769
	case yaml_SCALAR_EVENT:
770
		if emitter.scalar_data.multiline {
771
			return false
772
		}
773
		length += len(emitter.anchor_data.anchor) +
774
			len(emitter.tag_data.handle) +
775
			len(emitter.tag_data.suffix) +
776
			len(emitter.scalar_data.value)
777
	case yaml_SEQUENCE_START_EVENT:
778
		if !yaml_emitter_check_empty_sequence(emitter) {
779
			return false
780
		}
781
		length += len(emitter.anchor_data.anchor) +
782
			len(emitter.tag_data.handle) +
783
			len(emitter.tag_data.suffix)
784
	case yaml_MAPPING_START_EVENT:
785
		if !yaml_emitter_check_empty_mapping(emitter) {
786
			return false
787
		}
788
		length += len(emitter.anchor_data.anchor) +
789
			len(emitter.tag_data.handle) +
790
			len(emitter.tag_data.suffix)
791
	default:
792
		return false
793
	}
794
	return length <= 128
795
}
796

797
// Determine an acceptable scalar style.
798
func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool {
799

800
	no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0
801
	if no_tag && !event.implicit && !event.quoted_implicit {
802
		return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified")
803
	}
804

805
	style := event.scalar_style()
806
	if style == yaml_ANY_SCALAR_STYLE {
807
		style = yaml_PLAIN_SCALAR_STYLE
808
	}
809
	if emitter.canonical {
810
		style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
811
	}
812
	if emitter.simple_key_context && emitter.scalar_data.multiline {
813
		style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
814
	}
815

816
	if style == yaml_PLAIN_SCALAR_STYLE {
817
		if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed ||
818
			emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed {
819
			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
820
		}
821
		if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) {
822
			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
823
		}
824
		if no_tag && !event.implicit {
825
			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
826
		}
827
	}
828
	if style == yaml_SINGLE_QUOTED_SCALAR_STYLE {
829
		if !emitter.scalar_data.single_quoted_allowed {
830
			style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
831
		}
832
	}
833
	if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE {
834
		if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context {
835
			style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
836
		}
837
	}
838

839
	if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE {
840
		emitter.tag_data.handle = []byte{'!'}
841
	}
842
	emitter.scalar_data.style = style
843
	return true
844
}
845

846
// Write an anchor.
847
func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool {
848
	if emitter.anchor_data.anchor == nil {
849
		return true
850
	}
851
	c := []byte{'&'}
852
	if emitter.anchor_data.alias {
853
		c[0] = '*'
854
	}
855
	if !yaml_emitter_write_indicator(emitter, c, true, false, false) {
856
		return false
857
	}
858
	return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor)
859
}
860

861
// Write a tag.
862
func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool {
863
	if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 {
864
		return true
865
	}
866
	if len(emitter.tag_data.handle) > 0 {
867
		if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) {
868
			return false
869
		}
870
		if len(emitter.tag_data.suffix) > 0 {
871
			if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
872
				return false
873
			}
874
		}
875
	} else {
876
		// [Go] Allocate these slices elsewhere.
877
		if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) {
878
			return false
879
		}
880
		if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
881
			return false
882
		}
883
		if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) {
884
			return false
885
		}
886
	}
887
	return true
888
}
889

890
// Write a scalar.
891
func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool {
892
	switch emitter.scalar_data.style {
893
	case yaml_PLAIN_SCALAR_STYLE:
894
		return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
895

896
	case yaml_SINGLE_QUOTED_SCALAR_STYLE:
897
		return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
898

899
	case yaml_DOUBLE_QUOTED_SCALAR_STYLE:
900
		return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
901

902
	case yaml_LITERAL_SCALAR_STYLE:
903
		return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value)
904

905
	case yaml_FOLDED_SCALAR_STYLE:
906
		return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value)
907
	}
908
	panic("unknown scalar style")
909
}
910

911
// Check if a %YAML directive is valid.
912
func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool {
913
	if version_directive.major != 1 || version_directive.minor != 1 {
914
		return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive")
915
	}
916
	return true
917
}
918

919
// Check if a %TAG directive is valid.
920
func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool {
921
	handle := tag_directive.handle
922
	prefix := tag_directive.prefix
923
	if len(handle) == 0 {
924
		return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty")
925
	}
926
	if handle[0] != '!' {
927
		return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'")
928
	}
929
	if handle[len(handle)-1] != '!' {
930
		return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'")
931
	}
932
	for i := 1; i < len(handle)-1; i += width(handle[i]) {
933
		if !is_alpha(handle, i) {
934
			return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only")
935
		}
936
	}
937
	if len(prefix) == 0 {
938
		return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty")
939
	}
940
	return true
941
}
942

943
// Check if an anchor is valid.
944
func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool {
945
	if len(anchor) == 0 {
946
		problem := "anchor value must not be empty"
947
		if alias {
948
			problem = "alias value must not be empty"
949
		}
950
		return yaml_emitter_set_emitter_error(emitter, problem)
951
	}
952
	for i := 0; i < len(anchor); i += width(anchor[i]) {
953
		if !is_alpha(anchor, i) {
954
			problem := "anchor value must contain alphanumerical characters only"
955
			if alias {
956
				problem = "alias value must contain alphanumerical characters only"
957
			}
958
			return yaml_emitter_set_emitter_error(emitter, problem)
959
		}
960
	}
961
	emitter.anchor_data.anchor = anchor
962
	emitter.anchor_data.alias = alias
963
	return true
964
}
965

966
// Check if a tag is valid.
967
func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool {
968
	if len(tag) == 0 {
969
		return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty")
970
	}
971
	for i := 0; i < len(emitter.tag_directives); i++ {
972
		tag_directive := &emitter.tag_directives[i]
973
		if bytes.HasPrefix(tag, tag_directive.prefix) {
974
			emitter.tag_data.handle = tag_directive.handle
975
			emitter.tag_data.suffix = tag[len(tag_directive.prefix):]
976
			return true
977
		}
978
	}
979
	emitter.tag_data.suffix = tag
980
	return true
981
}
982

983
// Check if a scalar is valid.
984
func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
985
	var (
986
		block_indicators   = false
987
		flow_indicators    = false
988
		line_breaks        = false
989
		special_characters = false
990

991
		leading_space  = false
992
		leading_break  = false
993
		trailing_space = false
994
		trailing_break = false
995
		break_space    = false
996
		space_break    = false
997

998
		preceded_by_whitespace = false
999
		followed_by_whitespace = false
1000
		previous_space         = false
1001
		previous_break         = false
1002
	)
1003

1004
	emitter.scalar_data.value = value
1005

1006
	if len(value) == 0 {
1007
		emitter.scalar_data.multiline = false
1008
		emitter.scalar_data.flow_plain_allowed = false
1009
		emitter.scalar_data.block_plain_allowed = true
1010
		emitter.scalar_data.single_quoted_allowed = true
1011
		emitter.scalar_data.block_allowed = false
1012
		return true
1013
	}
1014

1015
	if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) {
1016
		block_indicators = true
1017
		flow_indicators = true
1018
	}
1019

1020
	preceded_by_whitespace = true
1021
	for i, w := 0, 0; i < len(value); i += w {
1022
		w = width(value[i])
1023
		followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w)
1024

1025
		if i == 0 {
1026
			switch value[i] {
1027
			case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`':
1028
				flow_indicators = true
1029
				block_indicators = true
1030
			case '?', ':':
1031
				flow_indicators = true
1032
				if followed_by_whitespace {
1033
					block_indicators = true
1034
				}
1035
			case '-':
1036
				if followed_by_whitespace {
1037
					flow_indicators = true
1038
					block_indicators = true
1039
				}
1040
			}
1041
		} else {
1042
			switch value[i] {
1043
			case ',', '?', '[', ']', '{', '}':
1044
				flow_indicators = true
1045
			case ':':
1046
				flow_indicators = true
1047
				if followed_by_whitespace {
1048
					block_indicators = true
1049
				}
1050
			case '#':
1051
				if preceded_by_whitespace {
1052
					flow_indicators = true
1053
					block_indicators = true
1054
				}
1055
			}
1056
		}
1057

1058
		if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode {
1059
			special_characters = true
1060
		}
1061
		if is_space(value, i) {
1062
			if i == 0 {
1063
				leading_space = true
1064
			}
1065
			if i+width(value[i]) == len(value) {
1066
				trailing_space = true
1067
			}
1068
			if previous_break {
1069
				break_space = true
1070
			}
1071
			previous_space = true
1072
			previous_break = false
1073
		} else if is_break(value, i) {
1074
			line_breaks = true
1075
			if i == 0 {
1076
				leading_break = true
1077
			}
1078
			if i+width(value[i]) == len(value) {
1079
				trailing_break = true
1080
			}
1081
			if previous_space {
1082
				space_break = true
1083
			}
1084
			previous_space = false
1085
			previous_break = true
1086
		} else {
1087
			previous_space = false
1088
			previous_break = false
1089
		}
1090

1091
		// [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition.
1092
		preceded_by_whitespace = is_blankz(value, i)
1093
	}
1094

1095
	emitter.scalar_data.multiline = line_breaks
1096
	emitter.scalar_data.flow_plain_allowed = true
1097
	emitter.scalar_data.block_plain_allowed = true
1098
	emitter.scalar_data.single_quoted_allowed = true
1099
	emitter.scalar_data.block_allowed = true
1100

1101
	if leading_space || leading_break || trailing_space || trailing_break {
1102
		emitter.scalar_data.flow_plain_allowed = false
1103
		emitter.scalar_data.block_plain_allowed = false
1104
	}
1105
	if trailing_space {
1106
		emitter.scalar_data.block_allowed = false
1107
	}
1108
	if break_space {
1109
		emitter.scalar_data.flow_plain_allowed = false
1110
		emitter.scalar_data.block_plain_allowed = false
1111
		emitter.scalar_data.single_quoted_allowed = false
1112
	}
1113
	if space_break || special_characters {
1114
		emitter.scalar_data.flow_plain_allowed = false
1115
		emitter.scalar_data.block_plain_allowed = false
1116
		emitter.scalar_data.single_quoted_allowed = false
1117
		emitter.scalar_data.block_allowed = false
1118
	}
1119
	if line_breaks {
1120
		emitter.scalar_data.flow_plain_allowed = false
1121
		emitter.scalar_data.block_plain_allowed = false
1122
	}
1123
	if flow_indicators {
1124
		emitter.scalar_data.flow_plain_allowed = false
1125
	}
1126
	if block_indicators {
1127
		emitter.scalar_data.block_plain_allowed = false
1128
	}
1129
	return true
1130
}
1131

1132
// Check if the event data is valid.
1133
func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool {
1134

1135
	emitter.anchor_data.anchor = nil
1136
	emitter.tag_data.handle = nil
1137
	emitter.tag_data.suffix = nil
1138
	emitter.scalar_data.value = nil
1139

1140
	switch event.typ {
1141
	case yaml_ALIAS_EVENT:
1142
		if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) {
1143
			return false
1144
		}
1145

1146
	case yaml_SCALAR_EVENT:
1147
		if len(event.anchor) > 0 {
1148
			if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
1149
				return false
1150
			}
1151
		}
1152
		if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) {
1153
			if !yaml_emitter_analyze_tag(emitter, event.tag) {
1154
				return false
1155
			}
1156
		}
1157
		if !yaml_emitter_analyze_scalar(emitter, event.value) {
1158
			return false
1159
		}
1160

1161
	case yaml_SEQUENCE_START_EVENT:
1162
		if len(event.anchor) > 0 {
1163
			if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
1164
				return false
1165
			}
1166
		}
1167
		if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
1168
			if !yaml_emitter_analyze_tag(emitter, event.tag) {
1169
				return false
1170
			}
1171
		}
1172

1173
	case yaml_MAPPING_START_EVENT:
1174
		if len(event.anchor) > 0 {
1175
			if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
1176
				return false
1177
			}
1178
		}
1179
		if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
1180
			if !yaml_emitter_analyze_tag(emitter, event.tag) {
1181
				return false
1182
			}
1183
		}
1184
	}
1185
	return true
1186
}
1187

1188
// Write the BOM character.
1189
func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool {
1190
	if !flush(emitter) {
1191
		return false
1192
	}
1193
	pos := emitter.buffer_pos
1194
	emitter.buffer[pos+0] = '\xEF'
1195
	emitter.buffer[pos+1] = '\xBB'
1196
	emitter.buffer[pos+2] = '\xBF'
1197
	emitter.buffer_pos += 3
1198
	return true
1199
}
1200

1201
func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool {
1202
	indent := emitter.indent
1203
	if indent < 0 {
1204
		indent = 0
1205
	}
1206
	if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) {
1207
		if !put_break(emitter) {
1208
			return false
1209
		}
1210
	}
1211
	for emitter.column < indent {
1212
		if !put(emitter, ' ') {
1213
			return false
1214
		}
1215
	}
1216
	emitter.whitespace = true
1217
	emitter.indention = true
1218
	return true
1219
}
1220

1221
func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool {
1222
	if need_whitespace && !emitter.whitespace {
1223
		if !put(emitter, ' ') {
1224
			return false
1225
		}
1226
	}
1227
	if !write_all(emitter, indicator) {
1228
		return false
1229
	}
1230
	emitter.whitespace = is_whitespace
1231
	emitter.indention = (emitter.indention && is_indention)
1232
	emitter.open_ended = false
1233
	return true
1234
}
1235

1236
func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool {
1237
	if !write_all(emitter, value) {
1238
		return false
1239
	}
1240
	emitter.whitespace = false
1241
	emitter.indention = false
1242
	return true
1243
}
1244

1245
func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool {
1246
	if !emitter.whitespace {
1247
		if !put(emitter, ' ') {
1248
			return false
1249
		}
1250
	}
1251
	if !write_all(emitter, value) {
1252
		return false
1253
	}
1254
	emitter.whitespace = false
1255
	emitter.indention = false
1256
	return true
1257
}
1258

1259
func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool {
1260
	if need_whitespace && !emitter.whitespace {
1261
		if !put(emitter, ' ') {
1262
			return false
1263
		}
1264
	}
1265
	for i := 0; i < len(value); {
1266
		var must_write bool
1267
		switch value[i] {
1268
		case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']':
1269
			must_write = true
1270
		default:
1271
			must_write = is_alpha(value, i)
1272
		}
1273
		if must_write {
1274
			if !write(emitter, value, &i) {
1275
				return false
1276
			}
1277
		} else {
1278
			w := width(value[i])
1279
			for k := 0; k < w; k++ {
1280
				octet := value[i]
1281
				i++
1282
				if !put(emitter, '%') {
1283
					return false
1284
				}
1285

1286
				c := octet >> 4
1287
				if c < 10 {
1288
					c += '0'
1289
				} else {
1290
					c += 'A' - 10
1291
				}
1292
				if !put(emitter, c) {
1293
					return false
1294
				}
1295

1296
				c = octet & 0x0f
1297
				if c < 10 {
1298
					c += '0'
1299
				} else {
1300
					c += 'A' - 10
1301
				}
1302
				if !put(emitter, c) {
1303
					return false
1304
				}
1305
			}
1306
		}
1307
	}
1308
	emitter.whitespace = false
1309
	emitter.indention = false
1310
	return true
1311
}
1312

1313
func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
1314
	if !emitter.whitespace {
1315
		if !put(emitter, ' ') {
1316
			return false
1317
		}
1318
	}
1319

1320
	spaces := false
1321
	breaks := false
1322
	for i := 0; i < len(value); {
1323
		if is_space(value, i) {
1324
			if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) {
1325
				if !yaml_emitter_write_indent(emitter) {
1326
					return false
1327
				}
1328
				i += width(value[i])
1329
			} else {
1330
				if !write(emitter, value, &i) {
1331
					return false
1332
				}
1333
			}
1334
			spaces = true
1335
		} else if is_break(value, i) {
1336
			if !breaks && value[i] == '\n' {
1337
				if !put_break(emitter) {
1338
					return false
1339
				}
1340
			}
1341
			if !write_break(emitter, value, &i) {
1342
				return false
1343
			}
1344
			emitter.indention = true
1345
			breaks = true
1346
		} else {
1347
			if breaks {
1348
				if !yaml_emitter_write_indent(emitter) {
1349
					return false
1350
				}
1351
			}
1352
			if !write(emitter, value, &i) {
1353
				return false
1354
			}
1355
			emitter.indention = false
1356
			spaces = false
1357
			breaks = false
1358
		}
1359
	}
1360

1361
	emitter.whitespace = false
1362
	emitter.indention = false
1363
	if emitter.root_context {
1364
		emitter.open_ended = true
1365
	}
1366

1367
	return true
1368
}
1369

1370
func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
1371

1372
	if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) {
1373
		return false
1374
	}
1375

1376
	spaces := false
1377
	breaks := false
1378
	for i := 0; i < len(value); {
1379
		if is_space(value, i) {
1380
			if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) {
1381
				if !yaml_emitter_write_indent(emitter) {
1382
					return false
1383
				}
1384
				i += width(value[i])
1385
			} else {
1386
				if !write(emitter, value, &i) {
1387
					return false
1388
				}
1389
			}
1390
			spaces = true
1391
		} else if is_break(value, i) {
1392
			if !breaks && value[i] == '\n' {
1393
				if !put_break(emitter) {
1394
					return false
1395
				}
1396
			}
1397
			if !write_break(emitter, value, &i) {
1398
				return false
1399
			}
1400
			emitter.indention = true
1401
			breaks = true
1402
		} else {
1403
			if breaks {
1404
				if !yaml_emitter_write_indent(emitter) {
1405
					return false
1406
				}
1407
			}
1408
			if value[i] == '\'' {
1409
				if !put(emitter, '\'') {
1410
					return false
1411
				}
1412
			}
1413
			if !write(emitter, value, &i) {
1414
				return false
1415
			}
1416
			emitter.indention = false
1417
			spaces = false
1418
			breaks = false
1419
		}
1420
	}
1421
	if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) {
1422
		return false
1423
	}
1424
	emitter.whitespace = false
1425
	emitter.indention = false
1426
	return true
1427
}
1428

1429
func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
1430
	spaces := false
1431
	if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) {
1432
		return false
1433
	}
1434

1435
	for i := 0; i < len(value); {
1436
		if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) ||
1437
			is_bom(value, i) || is_break(value, i) ||
1438
			value[i] == '"' || value[i] == '\\' {
1439

1440
			octet := value[i]
1441

1442
			var w int
1443
			var v rune
1444
			switch {
1445
			case octet&0x80 == 0x00:
1446
				w, v = 1, rune(octet&0x7F)
1447
			case octet&0xE0 == 0xC0:
1448
				w, v = 2, rune(octet&0x1F)
1449
			case octet&0xF0 == 0xE0:
1450
				w, v = 3, rune(octet&0x0F)
1451
			case octet&0xF8 == 0xF0:
1452
				w, v = 4, rune(octet&0x07)
1453
			}
1454
			for k := 1; k < w; k++ {
1455
				octet = value[i+k]
1456
				v = (v << 6) + (rune(octet) & 0x3F)
1457
			}
1458
			i += w
1459

1460
			if !put(emitter, '\\') {
1461
				return false
1462
			}
1463

1464
			var ok bool
1465
			switch v {
1466
			case 0x00:
1467
				ok = put(emitter, '0')
1468
			case 0x07:
1469
				ok = put(emitter, 'a')
1470
			case 0x08:
1471
				ok = put(emitter, 'b')
1472
			case 0x09:
1473
				ok = put(emitter, 't')
1474
			case 0x0A:
1475
				ok = put(emitter, 'n')
1476
			case 0x0b:
1477
				ok = put(emitter, 'v')
1478
			case 0x0c:
1479
				ok = put(emitter, 'f')
1480
			case 0x0d:
1481
				ok = put(emitter, 'r')
1482
			case 0x1b:
1483
				ok = put(emitter, 'e')
1484
			case 0x22:
1485
				ok = put(emitter, '"')
1486
			case 0x5c:
1487
				ok = put(emitter, '\\')
1488
			case 0x85:
1489
				ok = put(emitter, 'N')
1490
			case 0xA0:
1491
				ok = put(emitter, '_')
1492
			case 0x2028:
1493
				ok = put(emitter, 'L')
1494
			case 0x2029:
1495
				ok = put(emitter, 'P')
1496
			default:
1497
				if v <= 0xFF {
1498
					ok = put(emitter, 'x')
1499
					w = 2
1500
				} else if v <= 0xFFFF {
1501
					ok = put(emitter, 'u')
1502
					w = 4
1503
				} else {
1504
					ok = put(emitter, 'U')
1505
					w = 8
1506
				}
1507
				for k := (w - 1) * 4; ok && k >= 0; k -= 4 {
1508
					digit := byte((v >> uint(k)) & 0x0F)
1509
					if digit < 10 {
1510
						ok = put(emitter, digit+'0')
1511
					} else {
1512
						ok = put(emitter, digit+'A'-10)
1513
					}
1514
				}
1515
			}
1516
			if !ok {
1517
				return false
1518
			}
1519
			spaces = false
1520
		} else if is_space(value, i) {
1521
			if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 {
1522
				if !yaml_emitter_write_indent(emitter) {
1523
					return false
1524
				}
1525
				if is_space(value, i+1) {
1526
					if !put(emitter, '\\') {
1527
						return false
1528
					}
1529
				}
1530
				i += width(value[i])
1531
			} else if !write(emitter, value, &i) {
1532
				return false
1533
			}
1534
			spaces = true
1535
		} else {
1536
			if !write(emitter, value, &i) {
1537
				return false
1538
			}
1539
			spaces = false
1540
		}
1541
	}
1542
	if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) {
1543
		return false
1544
	}
1545
	emitter.whitespace = false
1546
	emitter.indention = false
1547
	return true
1548
}
1549

1550
func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool {
1551
	if is_space(value, 0) || is_break(value, 0) {
1552
		indent_hint := []byte{'0' + byte(emitter.best_indent)}
1553
		if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) {
1554
			return false
1555
		}
1556
	}
1557

1558
	emitter.open_ended = false
1559

1560
	var chomp_hint [1]byte
1561
	if len(value) == 0 {
1562
		chomp_hint[0] = '-'
1563
	} else {
1564
		i := len(value) - 1
1565
		for value[i]&0xC0 == 0x80 {
1566
			i--
1567
		}
1568
		if !is_break(value, i) {
1569
			chomp_hint[0] = '-'
1570
		} else if i == 0 {
1571
			chomp_hint[0] = '+'
1572
			emitter.open_ended = true
1573
		} else {
1574
			i--
1575
			for value[i]&0xC0 == 0x80 {
1576
				i--
1577
			}
1578
			if is_break(value, i) {
1579
				chomp_hint[0] = '+'
1580
				emitter.open_ended = true
1581
			}
1582
		}
1583
	}
1584
	if chomp_hint[0] != 0 {
1585
		if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) {
1586
			return false
1587
		}
1588
	}
1589
	return true
1590
}
1591

1592
func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool {
1593
	if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) {
1594
		return false
1595
	}
1596
	if !yaml_emitter_write_block_scalar_hints(emitter, value) {
1597
		return false
1598
	}
1599
	if !put_break(emitter) {
1600
		return false
1601
	}
1602
	emitter.indention = true
1603
	emitter.whitespace = true
1604
	breaks := true
1605
	for i := 0; i < len(value); {
1606
		if is_break(value, i) {
1607
			if !write_break(emitter, value, &i) {
1608
				return false
1609
			}
1610
			emitter.indention = true
1611
			breaks = true
1612
		} else {
1613
			if breaks {
1614
				if !yaml_emitter_write_indent(emitter) {
1615
					return false
1616
				}
1617
			}
1618
			if !write(emitter, value, &i) {
1619
				return false
1620
			}
1621
			emitter.indention = false
1622
			breaks = false
1623
		}
1624
	}
1625

1626
	return true
1627
}
1628

1629
func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool {
1630
	if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) {
1631
		return false
1632
	}
1633
	if !yaml_emitter_write_block_scalar_hints(emitter, value) {
1634
		return false
1635
	}
1636

1637
	if !put_break(emitter) {
1638
		return false
1639
	}
1640
	emitter.indention = true
1641
	emitter.whitespace = true
1642

1643
	breaks := true
1644
	leading_spaces := true
1645
	for i := 0; i < len(value); {
1646
		if is_break(value, i) {
1647
			if !breaks && !leading_spaces && value[i] == '\n' {
1648
				k := 0
1649
				for is_break(value, k) {
1650
					k += width(value[k])
1651
				}
1652
				if !is_blankz(value, k) {
1653
					if !put_break(emitter) {
1654
						return false
1655
					}
1656
				}
1657
			}
1658
			if !write_break(emitter, value, &i) {
1659
				return false
1660
			}
1661
			emitter.indention = true
1662
			breaks = true
1663
		} else {
1664
			if breaks {
1665
				if !yaml_emitter_write_indent(emitter) {
1666
					return false
1667
				}
1668
				leading_spaces = is_blank(value, i)
1669
			}
1670
			if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width {
1671
				if !yaml_emitter_write_indent(emitter) {
1672
					return false
1673
				}
1674
				i += width(value[i])
1675
			} else {
1676
				if !write(emitter, value, &i) {
1677
					return false
1678
				}
1679
			}
1680
			emitter.indention = false
1681
			breaks = false
1682
		}
1683
	}
1684
	return true
1685
}
1686

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.