github.com/pankona/gometalinter@v2.0.11+incompatible/_linters/src/gopkg.in/yaml.v2/emitterc.go (about)

     1  package yaml
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  )
     7  
     8  // Flush the buffer if needed.
     9  func flush(emitter *yaml_emitter_t) bool {
    10  	if emitter.buffer_pos+5 >= len(emitter.buffer) {
    11  		return yaml_emitter_flush(emitter)
    12  	}
    13  	return true
    14  }
    15  
    16  // Put a character to the output buffer.
    17  func put(emitter *yaml_emitter_t, value byte) bool {
    18  	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
    19  		return false
    20  	}
    21  	emitter.buffer[emitter.buffer_pos] = value
    22  	emitter.buffer_pos++
    23  	emitter.column++
    24  	return true
    25  }
    26  
    27  // Put a line break to the output buffer.
    28  func put_break(emitter *yaml_emitter_t) bool {
    29  	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
    30  		return false
    31  	}
    32  	switch emitter.line_break {
    33  	case yaml_CR_BREAK:
    34  		emitter.buffer[emitter.buffer_pos] = '\r'
    35  		emitter.buffer_pos += 1
    36  	case yaml_LN_BREAK:
    37  		emitter.buffer[emitter.buffer_pos] = '\n'
    38  		emitter.buffer_pos += 1
    39  	case yaml_CRLN_BREAK:
    40  		emitter.buffer[emitter.buffer_pos+0] = '\r'
    41  		emitter.buffer[emitter.buffer_pos+1] = '\n'
    42  		emitter.buffer_pos += 2
    43  	default:
    44  		panic("unknown line break setting")
    45  	}
    46  	emitter.column = 0
    47  	emitter.line++
    48  	return true
    49  }
    50  
    51  // Copy a character from a string into buffer.
    52  func write(emitter *yaml_emitter_t, s []byte, i *int) bool {
    53  	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
    54  		return false
    55  	}
    56  	p := emitter.buffer_pos
    57  	w := width(s[*i])
    58  	switch w {
    59  	case 4:
    60  		emitter.buffer[p+3] = s[*i+3]
    61  		fallthrough
    62  	case 3:
    63  		emitter.buffer[p+2] = s[*i+2]
    64  		fallthrough
    65  	case 2:
    66  		emitter.buffer[p+1] = s[*i+1]
    67  		fallthrough
    68  	case 1:
    69  		emitter.buffer[p+0] = s[*i+0]
    70  	default:
    71  		panic("unknown character width")
    72  	}
    73  	emitter.column++
    74  	emitter.buffer_pos += w
    75  	*i += w
    76  	return true
    77  }
    78  
    79  // Write a whole string into buffer.
    80  func write_all(emitter *yaml_emitter_t, s []byte) bool {
    81  	for i := 0; i < len(s); {
    82  		if !write(emitter, s, &i) {
    83  			return false
    84  		}
    85  	}
    86  	return true
    87  }
    88  
    89  // Copy a line break character from a string into buffer.
    90  func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool {
    91  	if s[*i] == '\n' {
    92  		if !put_break(emitter) {
    93  			return false
    94  		}
    95  		*i++
    96  	} else {
    97  		if !write(emitter, s, i) {
    98  			return false
    99  		}
   100  		emitter.column = 0
   101  		emitter.line++
   102  	}
   103  	return true
   104  }
   105  
   106  // Set an emitter error and return false.
   107  func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool {
   108  	emitter.error = yaml_EMITTER_ERROR
   109  	emitter.problem = problem
   110  	return false
   111  }
   112  
   113  // Emit an event.
   114  func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool {
   115  	emitter.events = append(emitter.events, *event)
   116  	for !yaml_emitter_need_more_events(emitter) {
   117  		event := &emitter.events[emitter.events_head]
   118  		if !yaml_emitter_analyze_event(emitter, event) {
   119  			return false
   120  		}
   121  		if !yaml_emitter_state_machine(emitter, event) {
   122  			return false
   123  		}
   124  		yaml_event_delete(event)
   125  		emitter.events_head++
   126  	}
   127  	return true
   128  }
   129  
   130  // Check if we need to accumulate more events before emitting.
   131  //
   132  // We accumulate extra
   133  //  - 1 event for DOCUMENT-START
   134  //  - 2 events for SEQUENCE-START
   135  //  - 3 events for MAPPING-START
   136  //
   137  func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool {
   138  	if emitter.events_head == len(emitter.events) {
   139  		return true
   140  	}
   141  	var accumulate int
   142  	switch emitter.events[emitter.events_head].typ {
   143  	case yaml_DOCUMENT_START_EVENT:
   144  		accumulate = 1
   145  		break
   146  	case yaml_SEQUENCE_START_EVENT:
   147  		accumulate = 2
   148  		break
   149  	case yaml_MAPPING_START_EVENT:
   150  		accumulate = 3
   151  		break
   152  	default:
   153  		return false
   154  	}
   155  	if len(emitter.events)-emitter.events_head > accumulate {
   156  		return false
   157  	}
   158  	var level int
   159  	for i := emitter.events_head; i < len(emitter.events); i++ {
   160  		switch emitter.events[i].typ {
   161  		case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT:
   162  			level++
   163  		case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT:
   164  			level--
   165  		}
   166  		if level == 0 {
   167  			return false
   168  		}
   169  	}
   170  	return true
   171  }
   172  
   173  // Append a directive to the directives stack.
   174  func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool {
   175  	for i := 0; i < len(emitter.tag_directives); i++ {
   176  		if bytes.Equal(value.handle, emitter.tag_directives[i].handle) {
   177  			if allow_duplicates {
   178  				return true
   179  			}
   180  			return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive")
   181  		}
   182  	}
   183  
   184  	// [Go] Do we actually need to copy this given garbage collection
   185  	// and the lack of deallocating destructors?
   186  	tag_copy := yaml_tag_directive_t{
   187  		handle: make([]byte, len(value.handle)),
   188  		prefix: make([]byte, len(value.prefix)),
   189  	}
   190  	copy(tag_copy.handle, value.handle)
   191  	copy(tag_copy.prefix, value.prefix)
   192  	emitter.tag_directives = append(emitter.tag_directives, tag_copy)
   193  	return true
   194  }
   195  
   196  // Increase the indentation level.
   197  func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool {
   198  	emitter.indents = append(emitter.indents, emitter.indent)
   199  	if emitter.indent < 0 {
   200  		if flow {
   201  			emitter.indent = emitter.best_indent
   202  		} else {
   203  			emitter.indent = 0
   204  		}
   205  	} else if !indentless {
   206  		emitter.indent += emitter.best_indent
   207  	}
   208  	return true
   209  }
   210  
   211  // State dispatcher.
   212  func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool {
   213  	switch emitter.state {
   214  	default:
   215  	case yaml_EMIT_STREAM_START_STATE:
   216  		return yaml_emitter_emit_stream_start(emitter, event)
   217  
   218  	case yaml_EMIT_FIRST_DOCUMENT_START_STATE:
   219  		return yaml_emitter_emit_document_start(emitter, event, true)
   220  
   221  	case yaml_EMIT_DOCUMENT_START_STATE:
   222  		return yaml_emitter_emit_document_start(emitter, event, false)
   223  
   224  	case yaml_EMIT_DOCUMENT_CONTENT_STATE:
   225  		return yaml_emitter_emit_document_content(emitter, event)
   226  
   227  	case yaml_EMIT_DOCUMENT_END_STATE:
   228  		return yaml_emitter_emit_document_end(emitter, event)
   229  
   230  	case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE:
   231  		return yaml_emitter_emit_flow_sequence_item(emitter, event, true)
   232  
   233  	case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE:
   234  		return yaml_emitter_emit_flow_sequence_item(emitter, event, false)
   235  
   236  	case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE:
   237  		return yaml_emitter_emit_flow_mapping_key(emitter, event, true)
   238  
   239  	case yaml_EMIT_FLOW_MAPPING_KEY_STATE:
   240  		return yaml_emitter_emit_flow_mapping_key(emitter, event, false)
   241  
   242  	case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE:
   243  		return yaml_emitter_emit_flow_mapping_value(emitter, event, true)
   244  
   245  	case yaml_EMIT_FLOW_MAPPING_VALUE_STATE:
   246  		return yaml_emitter_emit_flow_mapping_value(emitter, event, false)
   247  
   248  	case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE:
   249  		return yaml_emitter_emit_block_sequence_item(emitter, event, true)
   250  
   251  	case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE:
   252  		return yaml_emitter_emit_block_sequence_item(emitter, event, false)
   253  
   254  	case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:
   255  		return yaml_emitter_emit_block_mapping_key(emitter, event, true)
   256  
   257  	case yaml_EMIT_BLOCK_MAPPING_KEY_STATE:
   258  		return yaml_emitter_emit_block_mapping_key(emitter, event, false)
   259  
   260  	case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:
   261  		return yaml_emitter_emit_block_mapping_value(emitter, event, true)
   262  
   263  	case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE:
   264  		return yaml_emitter_emit_block_mapping_value(emitter, event, false)
   265  
   266  	case yaml_EMIT_END_STATE:
   267  		return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END")
   268  	}
   269  	panic("invalid emitter state")
   270  }
   271  
   272  // Expect STREAM-START.
   273  func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
   274  	if event.typ != yaml_STREAM_START_EVENT {
   275  		return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START")
   276  	}
   277  	if emitter.encoding == yaml_ANY_ENCODING {
   278  		emitter.encoding = event.encoding
   279  		if emitter.encoding == yaml_ANY_ENCODING {
   280  			emitter.encoding = yaml_UTF8_ENCODING
   281  		}
   282  	}
   283  	if emitter.best_indent < 2 || emitter.best_indent > 9 {
   284  		emitter.best_indent = 2
   285  	}
   286  	if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 {
   287  		emitter.best_width = 80
   288  	}
   289  	if emitter.best_width < 0 {
   290  		emitter.best_width = 1<<31 - 1
   291  	}
   292  	if emitter.line_break == yaml_ANY_BREAK {
   293  		emitter.line_break = yaml_LN_BREAK
   294  	}
   295  
   296  	emitter.indent = -1
   297  	emitter.line = 0
   298  	emitter.column = 0
   299  	emitter.whitespace = true
   300  	emitter.indention = true
   301  
   302  	if emitter.encoding != yaml_UTF8_ENCODING {
   303  		if !yaml_emitter_write_bom(emitter) {
   304  			return false
   305  		}
   306  	}
   307  	emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE
   308  	return true
   309  }
   310  
   311  // Expect DOCUMENT-START or STREAM-END.
   312  func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
   313  
   314  	if event.typ == yaml_DOCUMENT_START_EVENT {
   315  
   316  		if event.version_directive != nil {
   317  			if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) {
   318  				return false
   319  			}
   320  		}
   321  
   322  		for i := 0; i < len(event.tag_directives); i++ {
   323  			tag_directive := &event.tag_directives[i]
   324  			if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) {
   325  				return false
   326  			}
   327  			if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) {
   328  				return false
   329  			}
   330  		}
   331  
   332  		for i := 0; i < len(default_tag_directives); i++ {
   333  			tag_directive := &default_tag_directives[i]
   334  			if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) {
   335  				return false
   336  			}
   337  		}
   338  
   339  		implicit := event.implicit
   340  		if !first || emitter.canonical {
   341  			implicit = false
   342  		}
   343  
   344  		if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) {
   345  			if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
   346  				return false
   347  			}
   348  			if !yaml_emitter_write_indent(emitter) {
   349  				return false
   350  			}
   351  		}
   352  
   353  		if event.version_directive != nil {
   354  			implicit = false
   355  			if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) {
   356  				return false
   357  			}
   358  			if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) {
   359  				return false
   360  			}
   361  			if !yaml_emitter_write_indent(emitter) {
   362  				return false
   363  			}
   364  		}
   365  
   366  		if len(event.tag_directives) > 0 {
   367  			implicit = false
   368  			for i := 0; i < len(event.tag_directives); i++ {
   369  				tag_directive := &event.tag_directives[i]
   370  				if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) {
   371  					return false
   372  				}
   373  				if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) {
   374  					return false
   375  				}
   376  				if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) {
   377  					return false
   378  				}
   379  				if !yaml_emitter_write_indent(emitter) {
   380  					return false
   381  				}
   382  			}
   383  		}
   384  
   385  		if yaml_emitter_check_empty_document(emitter) {
   386  			implicit = false
   387  		}
   388  		if !implicit {
   389  			if !yaml_emitter_write_indent(emitter) {
   390  				return false
   391  			}
   392  			if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) {
   393  				return false
   394  			}
   395  			if emitter.canonical {
   396  				if !yaml_emitter_write_indent(emitter) {
   397  					return false
   398  				}
   399  			}
   400  		}
   401  
   402  		emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE
   403  		return true
   404  	}
   405  
   406  	if event.typ == yaml_STREAM_END_EVENT {
   407  		if emitter.open_ended {
   408  			if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
   409  				return false
   410  			}
   411  			if !yaml_emitter_write_indent(emitter) {
   412  				return false
   413  			}
   414  		}
   415  		if !yaml_emitter_flush(emitter) {
   416  			return false
   417  		}
   418  		emitter.state = yaml_EMIT_END_STATE
   419  		return true
   420  	}
   421  
   422  	return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END")
   423  }
   424  
   425  // Expect the root node.
   426  func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool {
   427  	emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE)
   428  	return yaml_emitter_emit_node(emitter, event, true, false, false, false)
   429  }
   430  
   431  // Expect DOCUMENT-END.
   432  func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool {
   433  	if event.typ != yaml_DOCUMENT_END_EVENT {
   434  		return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END")
   435  	}
   436  	if !yaml_emitter_write_indent(emitter) {
   437  		return false
   438  	}
   439  	if !event.implicit {
   440  		// [Go] Allocate the slice elsewhere.
   441  		if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
   442  			return false
   443  		}
   444  		if !yaml_emitter_write_indent(emitter) {
   445  			return false
   446  		}
   447  	}
   448  	if !yaml_emitter_flush(emitter) {
   449  		return false
   450  	}
   451  	emitter.state = yaml_EMIT_DOCUMENT_START_STATE
   452  	emitter.tag_directives = emitter.tag_directives[:0]
   453  	return true
   454  }
   455  
   456  // Expect a flow item node.
   457  func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
   458  	if first {
   459  		if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) {
   460  			return false
   461  		}
   462  		if !yaml_emitter_increase_indent(emitter, true, false) {
   463  			return false
   464  		}
   465  		emitter.flow_level++
   466  	}
   467  
   468  	if event.typ == yaml_SEQUENCE_END_EVENT {
   469  		emitter.flow_level--
   470  		emitter.indent = emitter.indents[len(emitter.indents)-1]
   471  		emitter.indents = emitter.indents[:len(emitter.indents)-1]
   472  		if emitter.canonical && !first {
   473  			if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
   474  				return false
   475  			}
   476  			if !yaml_emitter_write_indent(emitter) {
   477  				return false
   478  			}
   479  		}
   480  		if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) {
   481  			return false
   482  		}
   483  		emitter.state = emitter.states[len(emitter.states)-1]
   484  		emitter.states = emitter.states[:len(emitter.states)-1]
   485  
   486  		return true
   487  	}
   488  
   489  	if !first {
   490  		if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
   491  			return false
   492  		}
   493  	}
   494  
   495  	if emitter.canonical || emitter.column > emitter.best_width {
   496  		if !yaml_emitter_write_indent(emitter) {
   497  			return false
   498  		}
   499  	}
   500  	emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE)
   501  	return yaml_emitter_emit_node(emitter, event, false, true, false, false)
   502  }
   503  
   504  // Expect a flow key node.
   505  func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
   506  	if first {
   507  		if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) {
   508  			return false
   509  		}
   510  		if !yaml_emitter_increase_indent(emitter, true, false) {
   511  			return false
   512  		}
   513  		emitter.flow_level++
   514  	}
   515  
   516  	if event.typ == yaml_MAPPING_END_EVENT {
   517  		emitter.flow_level--
   518  		emitter.indent = emitter.indents[len(emitter.indents)-1]
   519  		emitter.indents = emitter.indents[:len(emitter.indents)-1]
   520  		if emitter.canonical && !first {
   521  			if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
   522  				return false
   523  			}
   524  			if !yaml_emitter_write_indent(emitter) {
   525  				return false
   526  			}
   527  		}
   528  		if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) {
   529  			return false
   530  		}
   531  		emitter.state = emitter.states[len(emitter.states)-1]
   532  		emitter.states = emitter.states[:len(emitter.states)-1]
   533  		return true
   534  	}
   535  
   536  	if !first {
   537  		if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
   538  			return false
   539  		}
   540  	}
   541  	if emitter.canonical || emitter.column > emitter.best_width {
   542  		if !yaml_emitter_write_indent(emitter) {
   543  			return false
   544  		}
   545  	}
   546  
   547  	if !emitter.canonical && yaml_emitter_check_simple_key(emitter) {
   548  		emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE)
   549  		return yaml_emitter_emit_node(emitter, event, false, false, true, true)
   550  	}
   551  	if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) {
   552  		return false
   553  	}
   554  	emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE)
   555  	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
   556  }
   557  
   558  // Expect a flow value node.
   559  func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
   560  	if simple {
   561  		if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
   562  			return false
   563  		}
   564  	} else {
   565  		if emitter.canonical || emitter.column > emitter.best_width {
   566  			if !yaml_emitter_write_indent(emitter) {
   567  				return false
   568  			}
   569  		}
   570  		if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) {
   571  			return false
   572  		}
   573  	}
   574  	emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE)
   575  	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
   576  }
   577  
   578  // Expect a block item node.
   579  func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
   580  	if first {
   581  		if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) {
   582  			return false
   583  		}
   584  	}
   585  	if event.typ == yaml_SEQUENCE_END_EVENT {
   586  		emitter.indent = emitter.indents[len(emitter.indents)-1]
   587  		emitter.indents = emitter.indents[:len(emitter.indents)-1]
   588  		emitter.state = emitter.states[len(emitter.states)-1]
   589  		emitter.states = emitter.states[:len(emitter.states)-1]
   590  		return true
   591  	}
   592  	if !yaml_emitter_write_indent(emitter) {
   593  		return false
   594  	}
   595  	if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) {
   596  		return false
   597  	}
   598  	emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE)
   599  	return yaml_emitter_emit_node(emitter, event, false, true, false, false)
   600  }
   601  
   602  // Expect a block key node.
   603  func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
   604  	if first {
   605  		if !yaml_emitter_increase_indent(emitter, false, false) {
   606  			return false
   607  		}
   608  	}
   609  	if event.typ == yaml_MAPPING_END_EVENT {
   610  		emitter.indent = emitter.indents[len(emitter.indents)-1]
   611  		emitter.indents = emitter.indents[:len(emitter.indents)-1]
   612  		emitter.state = emitter.states[len(emitter.states)-1]
   613  		emitter.states = emitter.states[:len(emitter.states)-1]
   614  		return true
   615  	}
   616  	if !yaml_emitter_write_indent(emitter) {
   617  		return false
   618  	}
   619  	if yaml_emitter_check_simple_key(emitter) {
   620  		emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE)
   621  		return yaml_emitter_emit_node(emitter, event, false, false, true, true)
   622  	}
   623  	if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) {
   624  		return false
   625  	}
   626  	emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE)
   627  	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
   628  }
   629  
   630  // Expect a block value node.
   631  func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
   632  	if simple {
   633  		if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
   634  			return false
   635  		}
   636  	} else {
   637  		if !yaml_emitter_write_indent(emitter) {
   638  			return false
   639  		}
   640  		if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) {
   641  			return false
   642  		}
   643  	}
   644  	emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE)
   645  	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
   646  }
   647  
   648  // Expect a node.
   649  func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t,
   650  	root bool, sequence bool, mapping bool, simple_key bool) bool {
   651  
   652  	emitter.root_context = root
   653  	emitter.sequence_context = sequence
   654  	emitter.mapping_context = mapping
   655  	emitter.simple_key_context = simple_key
   656  
   657  	switch event.typ {
   658  	case yaml_ALIAS_EVENT:
   659  		return yaml_emitter_emit_alias(emitter, event)
   660  	case yaml_SCALAR_EVENT:
   661  		return yaml_emitter_emit_scalar(emitter, event)
   662  	case yaml_SEQUENCE_START_EVENT:
   663  		return yaml_emitter_emit_sequence_start(emitter, event)
   664  	case yaml_MAPPING_START_EVENT:
   665  		return yaml_emitter_emit_mapping_start(emitter, event)
   666  	default:
   667  		return yaml_emitter_set_emitter_error(emitter,
   668  			fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ))
   669  	}
   670  }
   671  
   672  // Expect ALIAS.
   673  func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool {
   674  	if !yaml_emitter_process_anchor(emitter) {
   675  		return false
   676  	}
   677  	emitter.state = emitter.states[len(emitter.states)-1]
   678  	emitter.states = emitter.states[:len(emitter.states)-1]
   679  	return true
   680  }
   681  
   682  // Expect SCALAR.
   683  func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool {
   684  	if !yaml_emitter_select_scalar_style(emitter, event) {
   685  		return false
   686  	}
   687  	if !yaml_emitter_process_anchor(emitter) {
   688  		return false
   689  	}
   690  	if !yaml_emitter_process_tag(emitter) {
   691  		return false
   692  	}
   693  	if !yaml_emitter_increase_indent(emitter, true, false) {
   694  		return false
   695  	}
   696  	if !yaml_emitter_process_scalar(emitter) {
   697  		return false
   698  	}
   699  	emitter.indent = emitter.indents[len(emitter.indents)-1]
   700  	emitter.indents = emitter.indents[:len(emitter.indents)-1]
   701  	emitter.state = emitter.states[len(emitter.states)-1]
   702  	emitter.states = emitter.states[:len(emitter.states)-1]
   703  	return true
   704  }
   705  
   706  // Expect SEQUENCE-START.
   707  func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
   708  	if !yaml_emitter_process_anchor(emitter) {
   709  		return false
   710  	}
   711  	if !yaml_emitter_process_tag(emitter) {
   712  		return false
   713  	}
   714  	if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE ||
   715  		yaml_emitter_check_empty_sequence(emitter) {
   716  		emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE
   717  	} else {
   718  		emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE
   719  	}
   720  	return true
   721  }
   722  
   723  // Expect MAPPING-START.
   724  func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
   725  	if !yaml_emitter_process_anchor(emitter) {
   726  		return false
   727  	}
   728  	if !yaml_emitter_process_tag(emitter) {
   729  		return false
   730  	}
   731  	if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE ||
   732  		yaml_emitter_check_empty_mapping(emitter) {
   733  		emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE
   734  	} else {
   735  		emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE
   736  	}
   737  	return true
   738  }
   739  
   740  // Check if the document content is an empty scalar.
   741  func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool {
   742  	return false // [Go] Huh?
   743  }
   744  
   745  // Check if the next events represent an empty sequence.
   746  func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool {
   747  	if len(emitter.events)-emitter.events_head < 2 {
   748  		return false
   749  	}
   750  	return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT &&
   751  		emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT
   752  }
   753  
   754  // Check if the next events represent an empty mapping.
   755  func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool {
   756  	if len(emitter.events)-emitter.events_head < 2 {
   757  		return false
   758  	}
   759  	return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT &&
   760  		emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT
   761  }
   762  
   763  // Check if the next node can be expressed as a simple key.
   764  func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool {
   765  	length := 0
   766  	switch emitter.events[emitter.events_head].typ {
   767  	case yaml_ALIAS_EVENT:
   768  		length += len(emitter.anchor_data.anchor)
   769  	case yaml_SCALAR_EVENT:
   770  		if emitter.scalar_data.multiline {
   771  			return false
   772  		}
   773  		length += len(emitter.anchor_data.anchor) +
   774  			len(emitter.tag_data.handle) +
   775  			len(emitter.tag_data.suffix) +
   776  			len(emitter.scalar_data.value)
   777  	case yaml_SEQUENCE_START_EVENT:
   778  		if !yaml_emitter_check_empty_sequence(emitter) {
   779  			return false
   780  		}
   781  		length += len(emitter.anchor_data.anchor) +
   782  			len(emitter.tag_data.handle) +
   783  			len(emitter.tag_data.suffix)
   784  	case yaml_MAPPING_START_EVENT:
   785  		if !yaml_emitter_check_empty_mapping(emitter) {
   786  			return false
   787  		}
   788  		length += len(emitter.anchor_data.anchor) +
   789  			len(emitter.tag_data.handle) +
   790  			len(emitter.tag_data.suffix)
   791  	default:
   792  		return false
   793  	}
   794  	return length <= 128
   795  }
   796  
   797  // Determine an acceptable scalar style.
   798  func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool {
   799  
   800  	no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0
   801  	if no_tag && !event.implicit && !event.quoted_implicit {
   802  		return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified")
   803  	}
   804  
   805  	style := event.scalar_style()
   806  	if style == yaml_ANY_SCALAR_STYLE {
   807  		style = yaml_PLAIN_SCALAR_STYLE
   808  	}
   809  	if emitter.canonical {
   810  		style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
   811  	}
   812  	if emitter.simple_key_context && emitter.scalar_data.multiline {
   813  		style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
   814  	}
   815  
   816  	if style == yaml_PLAIN_SCALAR_STYLE {
   817  		if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed ||
   818  			emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed {
   819  			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
   820  		}
   821  		if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) {
   822  			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
   823  		}
   824  		if no_tag && !event.implicit {
   825  			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
   826  		}
   827  	}
   828  	if style == yaml_SINGLE_QUOTED_SCALAR_STYLE {
   829  		if !emitter.scalar_data.single_quoted_allowed {
   830  			style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
   831  		}
   832  	}
   833  	if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE {
   834  		if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context {
   835  			style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
   836  		}
   837  	}
   838  
   839  	if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE {
   840  		emitter.tag_data.handle = []byte{'!'}
   841  	}
   842  	emitter.scalar_data.style = style
   843  	return true
   844  }
   845  
   846  // Write an anchor.
   847  func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool {
   848  	if emitter.anchor_data.anchor == nil {
   849  		return true
   850  	}
   851  	c := []byte{'&'}
   852  	if emitter.anchor_data.alias {
   853  		c[0] = '*'
   854  	}
   855  	if !yaml_emitter_write_indicator(emitter, c, true, false, false) {
   856  		return false
   857  	}
   858  	return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor)
   859  }
   860  
   861  // Write a tag.
   862  func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool {
   863  	if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 {
   864  		return true
   865  	}
   866  	if len(emitter.tag_data.handle) > 0 {
   867  		if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) {
   868  			return false
   869  		}
   870  		if len(emitter.tag_data.suffix) > 0 {
   871  			if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
   872  				return false
   873  			}
   874  		}
   875  	} else {
   876  		// [Go] Allocate these slices elsewhere.
   877  		if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) {
   878  			return false
   879  		}
   880  		if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
   881  			return false
   882  		}
   883  		if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) {
   884  			return false
   885  		}
   886  	}
   887  	return true
   888  }
   889  
   890  // Write a scalar.
   891  func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool {
   892  	switch emitter.scalar_data.style {
   893  	case yaml_PLAIN_SCALAR_STYLE:
   894  		return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
   895  
   896  	case yaml_SINGLE_QUOTED_SCALAR_STYLE:
   897  		return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
   898  
   899  	case yaml_DOUBLE_QUOTED_SCALAR_STYLE:
   900  		return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
   901  
   902  	case yaml_LITERAL_SCALAR_STYLE:
   903  		return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value)
   904  
   905  	case yaml_FOLDED_SCALAR_STYLE:
   906  		return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value)
   907  	}
   908  	panic("unknown scalar style")
   909  }
   910  
   911  // Check if a %YAML directive is valid.
   912  func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool {
   913  	if version_directive.major != 1 || version_directive.minor != 1 {
   914  		return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive")
   915  	}
   916  	return true
   917  }
   918  
   919  // Check if a %TAG directive is valid.
   920  func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool {
   921  	handle := tag_directive.handle
   922  	prefix := tag_directive.prefix
   923  	if len(handle) == 0 {
   924  		return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty")
   925  	}
   926  	if handle[0] != '!' {
   927  		return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'")
   928  	}
   929  	if handle[len(handle)-1] != '!' {
   930  		return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'")
   931  	}
   932  	for i := 1; i < len(handle)-1; i += width(handle[i]) {
   933  		if !is_alpha(handle, i) {
   934  			return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only")
   935  		}
   936  	}
   937  	if len(prefix) == 0 {
   938  		return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty")
   939  	}
   940  	return true
   941  }
   942  
   943  // Check if an anchor is valid.
   944  func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool {
   945  	if len(anchor) == 0 {
   946  		problem := "anchor value must not be empty"
   947  		if alias {
   948  			problem = "alias value must not be empty"
   949  		}
   950  		return yaml_emitter_set_emitter_error(emitter, problem)
   951  	}
   952  	for i := 0; i < len(anchor); i += width(anchor[i]) {
   953  		if !is_alpha(anchor, i) {
   954  			problem := "anchor value must contain alphanumerical characters only"
   955  			if alias {
   956  				problem = "alias value must contain alphanumerical characters only"
   957  			}
   958  			return yaml_emitter_set_emitter_error(emitter, problem)
   959  		}
   960  	}
   961  	emitter.anchor_data.anchor = anchor
   962  	emitter.anchor_data.alias = alias
   963  	return true
   964  }
   965  
   966  // Check if a tag is valid.
   967  func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool {
   968  	if len(tag) == 0 {
   969  		return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty")
   970  	}
   971  	for i := 0; i < len(emitter.tag_directives); i++ {
   972  		tag_directive := &emitter.tag_directives[i]
   973  		if bytes.HasPrefix(tag, tag_directive.prefix) {
   974  			emitter.tag_data.handle = tag_directive.handle
   975  			emitter.tag_data.suffix = tag[len(tag_directive.prefix):]
   976  			return true
   977  		}
   978  	}
   979  	emitter.tag_data.suffix = tag
   980  	return true
   981  }
   982  
   983  // Check if a scalar is valid.
   984  func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
   985  	var (
   986  		block_indicators   = false
   987  		flow_indicators    = false
   988  		line_breaks        = false
   989  		special_characters = false
   990  
   991  		leading_space  = false
   992  		leading_break  = false
   993  		trailing_space = false
   994  		trailing_break = false
   995  		break_space    = false
   996  		space_break    = false
   997  
   998  		preceded_by_whitespace = false
   999  		followed_by_whitespace = false
  1000  		previous_space         = false
  1001  		previous_break         = false
  1002  	)
  1003  
  1004  	emitter.scalar_data.value = value
  1005  
  1006  	if len(value) == 0 {
  1007  		emitter.scalar_data.multiline = false
  1008  		emitter.scalar_data.flow_plain_allowed = false
  1009  		emitter.scalar_data.block_plain_allowed = true
  1010  		emitter.scalar_data.single_quoted_allowed = true
  1011  		emitter.scalar_data.block_allowed = false
  1012  		return true
  1013  	}
  1014  
  1015  	if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) {
  1016  		block_indicators = true
  1017  		flow_indicators = true
  1018  	}
  1019  
  1020  	preceded_by_whitespace = true
  1021  	for i, w := 0, 0; i < len(value); i += w {
  1022  		w = width(value[i])
  1023  		followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w)
  1024  
  1025  		if i == 0 {
  1026  			switch value[i] {
  1027  			case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`':
  1028  				flow_indicators = true
  1029  				block_indicators = true
  1030  			case '?', ':':
  1031  				flow_indicators = true
  1032  				if followed_by_whitespace {
  1033  					block_indicators = true
  1034  				}
  1035  			case '-':
  1036  				if followed_by_whitespace {
  1037  					flow_indicators = true
  1038  					block_indicators = true
  1039  				}
  1040  			}
  1041  		} else {
  1042  			switch value[i] {
  1043  			case ',', '?', '[', ']', '{', '}':
  1044  				flow_indicators = true
  1045  			case ':':
  1046  				flow_indicators = true
  1047  				if followed_by_whitespace {
  1048  					block_indicators = true
  1049  				}
  1050  			case '#':
  1051  				if preceded_by_whitespace {
  1052  					flow_indicators = true
  1053  					block_indicators = true
  1054  				}
  1055  			}
  1056  		}
  1057  
  1058  		if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode {
  1059  			special_characters = true
  1060  		}
  1061  		if is_space(value, i) {
  1062  			if i == 0 {
  1063  				leading_space = true
  1064  			}
  1065  			if i+width(value[i]) == len(value) {
  1066  				trailing_space = true
  1067  			}
  1068  			if previous_break {
  1069  				break_space = true
  1070  			}
  1071  			previous_space = true
  1072  			previous_break = false
  1073  		} else if is_break(value, i) {
  1074  			line_breaks = true
  1075  			if i == 0 {
  1076  				leading_break = true
  1077  			}
  1078  			if i+width(value[i]) == len(value) {
  1079  				trailing_break = true
  1080  			}
  1081  			if previous_space {
  1082  				space_break = true
  1083  			}
  1084  			previous_space = false
  1085  			previous_break = true
  1086  		} else {
  1087  			previous_space = false
  1088  			previous_break = false
  1089  		}
  1090  
  1091  		// [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition.
  1092  		preceded_by_whitespace = is_blankz(value, i)
  1093  	}
  1094  
  1095  	emitter.scalar_data.multiline = line_breaks
  1096  	emitter.scalar_data.flow_plain_allowed = true
  1097  	emitter.scalar_data.block_plain_allowed = true
  1098  	emitter.scalar_data.single_quoted_allowed = true
  1099  	emitter.scalar_data.block_allowed = true
  1100  
  1101  	if leading_space || leading_break || trailing_space || trailing_break {
  1102  		emitter.scalar_data.flow_plain_allowed = false
  1103  		emitter.scalar_data.block_plain_allowed = false
  1104  	}
  1105  	if trailing_space {
  1106  		emitter.scalar_data.block_allowed = false
  1107  	}
  1108  	if break_space {
  1109  		emitter.scalar_data.flow_plain_allowed = false
  1110  		emitter.scalar_data.block_plain_allowed = false
  1111  		emitter.scalar_data.single_quoted_allowed = false
  1112  	}
  1113  	if space_break || special_characters {
  1114  		emitter.scalar_data.flow_plain_allowed = false
  1115  		emitter.scalar_data.block_plain_allowed = false
  1116  		emitter.scalar_data.single_quoted_allowed = false
  1117  		emitter.scalar_data.block_allowed = false
  1118  	}
  1119  	if line_breaks {
  1120  		emitter.scalar_data.flow_plain_allowed = false
  1121  		emitter.scalar_data.block_plain_allowed = false
  1122  	}
  1123  	if flow_indicators {
  1124  		emitter.scalar_data.flow_plain_allowed = false
  1125  	}
  1126  	if block_indicators {
  1127  		emitter.scalar_data.block_plain_allowed = false
  1128  	}
  1129  	return true
  1130  }
  1131  
  1132  // Check if the event data is valid.
  1133  func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool {
  1134  
  1135  	emitter.anchor_data.anchor = nil
  1136  	emitter.tag_data.handle = nil
  1137  	emitter.tag_data.suffix = nil
  1138  	emitter.scalar_data.value = nil
  1139  
  1140  	switch event.typ {
  1141  	case yaml_ALIAS_EVENT:
  1142  		if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) {
  1143  			return false
  1144  		}
  1145  
  1146  	case yaml_SCALAR_EVENT:
  1147  		if len(event.anchor) > 0 {
  1148  			if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
  1149  				return false
  1150  			}
  1151  		}
  1152  		if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) {
  1153  			if !yaml_emitter_analyze_tag(emitter, event.tag) {
  1154  				return false
  1155  			}
  1156  		}
  1157  		if !yaml_emitter_analyze_scalar(emitter, event.value) {
  1158  			return false
  1159  		}
  1160  
  1161  	case yaml_SEQUENCE_START_EVENT:
  1162  		if len(event.anchor) > 0 {
  1163  			if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
  1164  				return false
  1165  			}
  1166  		}
  1167  		if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
  1168  			if !yaml_emitter_analyze_tag(emitter, event.tag) {
  1169  				return false
  1170  			}
  1171  		}
  1172  
  1173  	case yaml_MAPPING_START_EVENT:
  1174  		if len(event.anchor) > 0 {
  1175  			if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
  1176  				return false
  1177  			}
  1178  		}
  1179  		if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
  1180  			if !yaml_emitter_analyze_tag(emitter, event.tag) {
  1181  				return false
  1182  			}
  1183  		}
  1184  	}
  1185  	return true
  1186  }
  1187  
  1188  // Write the BOM character.
  1189  func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool {
  1190  	if !flush(emitter) {
  1191  		return false
  1192  	}
  1193  	pos := emitter.buffer_pos
  1194  	emitter.buffer[pos+0] = '\xEF'
  1195  	emitter.buffer[pos+1] = '\xBB'
  1196  	emitter.buffer[pos+2] = '\xBF'
  1197  	emitter.buffer_pos += 3
  1198  	return true
  1199  }
  1200  
  1201  func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool {
  1202  	indent := emitter.indent
  1203  	if indent < 0 {
  1204  		indent = 0
  1205  	}
  1206  	if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) {
  1207  		if !put_break(emitter) {
  1208  			return false
  1209  		}
  1210  	}
  1211  	for emitter.column < indent {
  1212  		if !put(emitter, ' ') {
  1213  			return false
  1214  		}
  1215  	}
  1216  	emitter.whitespace = true
  1217  	emitter.indention = true
  1218  	return true
  1219  }
  1220  
  1221  func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool {
  1222  	if need_whitespace && !emitter.whitespace {
  1223  		if !put(emitter, ' ') {
  1224  			return false
  1225  		}
  1226  	}
  1227  	if !write_all(emitter, indicator) {
  1228  		return false
  1229  	}
  1230  	emitter.whitespace = is_whitespace
  1231  	emitter.indention = (emitter.indention && is_indention)
  1232  	emitter.open_ended = false
  1233  	return true
  1234  }
  1235  
  1236  func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool {
  1237  	if !write_all(emitter, value) {
  1238  		return false
  1239  	}
  1240  	emitter.whitespace = false
  1241  	emitter.indention = false
  1242  	return true
  1243  }
  1244  
  1245  func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool {
  1246  	if !emitter.whitespace {
  1247  		if !put(emitter, ' ') {
  1248  			return false
  1249  		}
  1250  	}
  1251  	if !write_all(emitter, value) {
  1252  		return false
  1253  	}
  1254  	emitter.whitespace = false
  1255  	emitter.indention = false
  1256  	return true
  1257  }
  1258  
  1259  func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool {
  1260  	if need_whitespace && !emitter.whitespace {
  1261  		if !put(emitter, ' ') {
  1262  			return false
  1263  		}
  1264  	}
  1265  	for i := 0; i < len(value); {
  1266  		var must_write bool
  1267  		switch value[i] {
  1268  		case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']':
  1269  			must_write = true
  1270  		default:
  1271  			must_write = is_alpha(value, i)
  1272  		}
  1273  		if must_write {
  1274  			if !write(emitter, value, &i) {
  1275  				return false
  1276  			}
  1277  		} else {
  1278  			w := width(value[i])
  1279  			for k := 0; k < w; k++ {
  1280  				octet := value[i]
  1281  				i++
  1282  				if !put(emitter, '%') {
  1283  					return false
  1284  				}
  1285  
  1286  				c := octet >> 4
  1287  				if c < 10 {
  1288  					c += '0'
  1289  				} else {
  1290  					c += 'A' - 10
  1291  				}
  1292  				if !put(emitter, c) {
  1293  					return false
  1294  				}
  1295  
  1296  				c = octet & 0x0f
  1297  				if c < 10 {
  1298  					c += '0'
  1299  				} else {
  1300  					c += 'A' - 10
  1301  				}
  1302  				if !put(emitter, c) {
  1303  					return false
  1304  				}
  1305  			}
  1306  		}
  1307  	}
  1308  	emitter.whitespace = false
  1309  	emitter.indention = false
  1310  	return true
  1311  }
  1312  
  1313  func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
  1314  	if !emitter.whitespace {
  1315  		if !put(emitter, ' ') {
  1316  			return false
  1317  		}
  1318  	}
  1319  
  1320  	spaces := false
  1321  	breaks := false
  1322  	for i := 0; i < len(value); {
  1323  		if is_space(value, i) {
  1324  			if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) {
  1325  				if !yaml_emitter_write_indent(emitter) {
  1326  					return false
  1327  				}
  1328  				i += width(value[i])
  1329  			} else {
  1330  				if !write(emitter, value, &i) {
  1331  					return false
  1332  				}
  1333  			}
  1334  			spaces = true
  1335  		} else if is_break(value, i) {
  1336  			if !breaks && value[i] == '\n' {
  1337  				if !put_break(emitter) {
  1338  					return false
  1339  				}
  1340  			}
  1341  			if !write_break(emitter, value, &i) {
  1342  				return false
  1343  			}
  1344  			emitter.indention = true
  1345  			breaks = true
  1346  		} else {
  1347  			if breaks {
  1348  				if !yaml_emitter_write_indent(emitter) {
  1349  					return false
  1350  				}
  1351  			}
  1352  			if !write(emitter, value, &i) {
  1353  				return false
  1354  			}
  1355  			emitter.indention = false
  1356  			spaces = false
  1357  			breaks = false
  1358  		}
  1359  	}
  1360  
  1361  	emitter.whitespace = false
  1362  	emitter.indention = false
  1363  	if emitter.root_context {
  1364  		emitter.open_ended = true
  1365  	}
  1366  
  1367  	return true
  1368  }
  1369  
  1370  func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
  1371  
  1372  	if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) {
  1373  		return false
  1374  	}
  1375  
  1376  	spaces := false
  1377  	breaks := false
  1378  	for i := 0; i < len(value); {
  1379  		if is_space(value, i) {
  1380  			if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) {
  1381  				if !yaml_emitter_write_indent(emitter) {
  1382  					return false
  1383  				}
  1384  				i += width(value[i])
  1385  			} else {
  1386  				if !write(emitter, value, &i) {
  1387  					return false
  1388  				}
  1389  			}
  1390  			spaces = true
  1391  		} else if is_break(value, i) {
  1392  			if !breaks && value[i] == '\n' {
  1393  				if !put_break(emitter) {
  1394  					return false
  1395  				}
  1396  			}
  1397  			if !write_break(emitter, value, &i) {
  1398  				return false
  1399  			}
  1400  			emitter.indention = true
  1401  			breaks = true
  1402  		} else {
  1403  			if breaks {
  1404  				if !yaml_emitter_write_indent(emitter) {
  1405  					return false
  1406  				}
  1407  			}
  1408  			if value[i] == '\'' {
  1409  				if !put(emitter, '\'') {
  1410  					return false
  1411  				}
  1412  			}
  1413  			if !write(emitter, value, &i) {
  1414  				return false
  1415  			}
  1416  			emitter.indention = false
  1417  			spaces = false
  1418  			breaks = false
  1419  		}
  1420  	}
  1421  	if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) {
  1422  		return false
  1423  	}
  1424  	emitter.whitespace = false
  1425  	emitter.indention = false
  1426  	return true
  1427  }
  1428  
  1429  func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
  1430  	spaces := false
  1431  	if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) {
  1432  		return false
  1433  	}
  1434  
  1435  	for i := 0; i < len(value); {
  1436  		if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) ||
  1437  			is_bom(value, i) || is_break(value, i) ||
  1438  			value[i] == '"' || value[i] == '\\' {
  1439  
  1440  			octet := value[i]
  1441  
  1442  			var w int
  1443  			var v rune
  1444  			switch {
  1445  			case octet&0x80 == 0x00:
  1446  				w, v = 1, rune(octet&0x7F)
  1447  			case octet&0xE0 == 0xC0:
  1448  				w, v = 2, rune(octet&0x1F)
  1449  			case octet&0xF0 == 0xE0:
  1450  				w, v = 3, rune(octet&0x0F)
  1451  			case octet&0xF8 == 0xF0:
  1452  				w, v = 4, rune(octet&0x07)
  1453  			}
  1454  			for k := 1; k < w; k++ {
  1455  				octet = value[i+k]
  1456  				v = (v << 6) + (rune(octet) & 0x3F)
  1457  			}
  1458  			i += w
  1459  
  1460  			if !put(emitter, '\\') {
  1461  				return false
  1462  			}
  1463  
  1464  			var ok bool
  1465  			switch v {
  1466  			case 0x00:
  1467  				ok = put(emitter, '0')
  1468  			case 0x07:
  1469  				ok = put(emitter, 'a')
  1470  			case 0x08:
  1471  				ok = put(emitter, 'b')
  1472  			case 0x09:
  1473  				ok = put(emitter, 't')
  1474  			case 0x0A:
  1475  				ok = put(emitter, 'n')
  1476  			case 0x0b:
  1477  				ok = put(emitter, 'v')
  1478  			case 0x0c:
  1479  				ok = put(emitter, 'f')
  1480  			case 0x0d:
  1481  				ok = put(emitter, 'r')
  1482  			case 0x1b:
  1483  				ok = put(emitter, 'e')
  1484  			case 0x22:
  1485  				ok = put(emitter, '"')
  1486  			case 0x5c:
  1487  				ok = put(emitter, '\\')
  1488  			case 0x85:
  1489  				ok = put(emitter, 'N')
  1490  			case 0xA0:
  1491  				ok = put(emitter, '_')
  1492  			case 0x2028:
  1493  				ok = put(emitter, 'L')
  1494  			case 0x2029:
  1495  				ok = put(emitter, 'P')
  1496  			default:
  1497  				if v <= 0xFF {
  1498  					ok = put(emitter, 'x')
  1499  					w = 2
  1500  				} else if v <= 0xFFFF {
  1501  					ok = put(emitter, 'u')
  1502  					w = 4
  1503  				} else {
  1504  					ok = put(emitter, 'U')
  1505  					w = 8
  1506  				}
  1507  				for k := (w - 1) * 4; ok && k >= 0; k -= 4 {
  1508  					digit := byte((v >> uint(k)) & 0x0F)
  1509  					if digit < 10 {
  1510  						ok = put(emitter, digit+'0')
  1511  					} else {
  1512  						ok = put(emitter, digit+'A'-10)
  1513  					}
  1514  				}
  1515  			}
  1516  			if !ok {
  1517  				return false
  1518  			}
  1519  			spaces = false
  1520  		} else if is_space(value, i) {
  1521  			if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 {
  1522  				if !yaml_emitter_write_indent(emitter) {
  1523  					return false
  1524  				}
  1525  				if is_space(value, i+1) {
  1526  					if !put(emitter, '\\') {
  1527  						return false
  1528  					}
  1529  				}
  1530  				i += width(value[i])
  1531  			} else if !write(emitter, value, &i) {
  1532  				return false
  1533  			}
  1534  			spaces = true
  1535  		} else {
  1536  			if !write(emitter, value, &i) {
  1537  				return false
  1538  			}
  1539  			spaces = false
  1540  		}
  1541  	}
  1542  	if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) {
  1543  		return false
  1544  	}
  1545  	emitter.whitespace = false
  1546  	emitter.indention = false
  1547  	return true
  1548  }
  1549  
  1550  func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool {
  1551  	if is_space(value, 0) || is_break(value, 0) {
  1552  		indent_hint := []byte{'0' + byte(emitter.best_indent)}
  1553  		if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) {
  1554  			return false
  1555  		}
  1556  	}
  1557  
  1558  	emitter.open_ended = false
  1559  
  1560  	var chomp_hint [1]byte
  1561  	if len(value) == 0 {
  1562  		chomp_hint[0] = '-'
  1563  	} else {
  1564  		i := len(value) - 1
  1565  		for value[i]&0xC0 == 0x80 {
  1566  			i--
  1567  		}
  1568  		if !is_break(value, i) {
  1569  			chomp_hint[0] = '-'
  1570  		} else if i == 0 {
  1571  			chomp_hint[0] = '+'
  1572  			emitter.open_ended = true
  1573  		} else {
  1574  			i--
  1575  			for value[i]&0xC0 == 0x80 {
  1576  				i--
  1577  			}
  1578  			if is_break(value, i) {
  1579  				chomp_hint[0] = '+'
  1580  				emitter.open_ended = true
  1581  			}
  1582  		}
  1583  	}
  1584  	if chomp_hint[0] != 0 {
  1585  		if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) {
  1586  			return false
  1587  		}
  1588  	}
  1589  	return true
  1590  }
  1591  
  1592  func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool {
  1593  	if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) {
  1594  		return false
  1595  	}
  1596  	if !yaml_emitter_write_block_scalar_hints(emitter, value) {
  1597  		return false
  1598  	}
  1599  	if !put_break(emitter) {
  1600  		return false
  1601  	}
  1602  	emitter.indention = true
  1603  	emitter.whitespace = true
  1604  	breaks := true
  1605  	for i := 0; i < len(value); {
  1606  		if is_break(value, i) {
  1607  			if !write_break(emitter, value, &i) {
  1608  				return false
  1609  			}
  1610  			emitter.indention = true
  1611  			breaks = true
  1612  		} else {
  1613  			if breaks {
  1614  				if !yaml_emitter_write_indent(emitter) {
  1615  					return false
  1616  				}
  1617  			}
  1618  			if !write(emitter, value, &i) {
  1619  				return false
  1620  			}
  1621  			emitter.indention = false
  1622  			breaks = false
  1623  		}
  1624  	}
  1625  
  1626  	return true
  1627  }
  1628  
  1629  func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool {
  1630  	if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) {
  1631  		return false
  1632  	}
  1633  	if !yaml_emitter_write_block_scalar_hints(emitter, value) {
  1634  		return false
  1635  	}
  1636  
  1637  	if !put_break(emitter) {
  1638  		return false
  1639  	}
  1640  	emitter.indention = true
  1641  	emitter.whitespace = true
  1642  
  1643  	breaks := true
  1644  	leading_spaces := true
  1645  	for i := 0; i < len(value); {
  1646  		if is_break(value, i) {
  1647  			if !breaks && !leading_spaces && value[i] == '\n' {
  1648  				k := 0
  1649  				for is_break(value, k) {
  1650  					k += width(value[k])
  1651  				}
  1652  				if !is_blankz(value, k) {
  1653  					if !put_break(emitter) {
  1654  						return false
  1655  					}
  1656  				}
  1657  			}
  1658  			if !write_break(emitter, value, &i) {
  1659  				return false
  1660  			}
  1661  			emitter.indention = true
  1662  			breaks = true
  1663  		} else {
  1664  			if breaks {
  1665  				if !yaml_emitter_write_indent(emitter) {
  1666  					return false
  1667  				}
  1668  				leading_spaces = is_blank(value, i)
  1669  			}
  1670  			if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width {
  1671  				if !yaml_emitter_write_indent(emitter) {
  1672  					return false
  1673  				}
  1674  				i += width(value[i])
  1675  			} else {
  1676  				if !write(emitter, value, &i) {
  1677  					return false
  1678  				}
  1679  			}
  1680  			emitter.indention = false
  1681  			breaks = false
  1682  		}
  1683  	}
  1684  	return true
  1685  }