gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

emitterc.go (55187B)


      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 }