OSDN Git Service

new repo
[bytom/vapor.git] / vendor / gopkg.in / yaml.v2 / emitterc.go
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 }