github.com/go-xe2/third@v1.0.3/gopkg.in/yaml.v2/emitterc.go (about)

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