gtsocial-umbx

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

emitterc.go (45331B)


      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 }