gitee.com/sy_183/go-common@v1.0.5-0.20231205030221-958cfe129b47/yaml/emitterc.go (about)

     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  }