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