emitterc.go (45331B)
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 }