emitterc.go raw

   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  }
2021