rcee_packaged_source 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2358 @@
1
+
2
+ #include "yaml_private.h"
3
+
4
+ /*
5
+ * Flush the buffer if needed.
6
+ */
7
+
8
+ #define FLUSH(emitter) \
9
+ ((emitter->buffer.pointer+5 < emitter->buffer.end) \
10
+ || yaml_emitter_flush(emitter))
11
+
12
+ /*
13
+ * Put a character to the output buffer.
14
+ */
15
+
16
+ #define PUT(emitter,value) \
17
+ (FLUSH(emitter) \
18
+ && (*(emitter->buffer.pointer++) = (yaml_char_t)(value), \
19
+ emitter->column++, \
20
+ 1))
21
+
22
+ /*
23
+ * Put a line break to the output buffer.
24
+ */
25
+
26
+ #define PUT_BREAK(emitter) \
27
+ (FLUSH(emitter) ? \
28
+ ((emitter->line_break == YAML_CR_BREAK ? \
29
+ (*(emitter->buffer.pointer++) = (yaml_char_t) '\r') : \
30
+ emitter->line_break == YAML_LN_BREAK ? \
31
+ (*(emitter->buffer.pointer++) = (yaml_char_t) '\n') : \
32
+ emitter->line_break == YAML_CRLN_BREAK ? \
33
+ (*(emitter->buffer.pointer++) = (yaml_char_t) '\r', \
34
+ *(emitter->buffer.pointer++) = (yaml_char_t) '\n') : 0), \
35
+ emitter->column = 0, \
36
+ emitter->line ++, \
37
+ 1) : 0)
38
+
39
+ /*
40
+ * Copy a character from a string into buffer.
41
+ */
42
+
43
+ #define WRITE(emitter,string) \
44
+ (FLUSH(emitter) \
45
+ && (COPY(emitter->buffer,string), \
46
+ emitter->column ++, \
47
+ 1))
48
+
49
+ /*
50
+ * Copy a line break character from a string into buffer.
51
+ */
52
+
53
+ #define WRITE_BREAK(emitter,string) \
54
+ (FLUSH(emitter) \
55
+ && (CHECK(string,'\n') ? \
56
+ (PUT_BREAK(emitter), \
57
+ string.pointer ++, \
58
+ 1) : \
59
+ (COPY(emitter->buffer,string), \
60
+ emitter->column = 0, \
61
+ emitter->line ++, \
62
+ 1)))
63
+
64
+ /*
65
+ * API functions.
66
+ */
67
+
68
+ YAML_DECLARE(int)
69
+ yaml_emitter_emit(yaml_emitter_t *emitter, yaml_event_t *event);
70
+
71
+ /*
72
+ * Utility functions.
73
+ */
74
+
75
+ static int
76
+ yaml_emitter_set_emitter_error(yaml_emitter_t *emitter, const char *problem);
77
+
78
+ static int
79
+ yaml_emitter_need_more_events(yaml_emitter_t *emitter);
80
+
81
+ static int
82
+ yaml_emitter_append_tag_directive(yaml_emitter_t *emitter,
83
+ yaml_tag_directive_t value, int allow_duplicates);
84
+
85
+ static int
86
+ yaml_emitter_increase_indent(yaml_emitter_t *emitter,
87
+ int flow, int indentless);
88
+
89
+ /*
90
+ * State functions.
91
+ */
92
+
93
+ static int
94
+ yaml_emitter_state_machine(yaml_emitter_t *emitter, yaml_event_t *event);
95
+
96
+ static int
97
+ yaml_emitter_emit_stream_start(yaml_emitter_t *emitter,
98
+ yaml_event_t *event);
99
+
100
+ static int
101
+ yaml_emitter_emit_document_start(yaml_emitter_t *emitter,
102
+ yaml_event_t *event, int first);
103
+
104
+ static int
105
+ yaml_emitter_emit_document_content(yaml_emitter_t *emitter,
106
+ yaml_event_t *event);
107
+
108
+ static int
109
+ yaml_emitter_emit_document_end(yaml_emitter_t *emitter,
110
+ yaml_event_t *event);
111
+
112
+ static int
113
+ yaml_emitter_emit_flow_sequence_item(yaml_emitter_t *emitter,
114
+ yaml_event_t *event, int first);
115
+
116
+ static int
117
+ yaml_emitter_emit_flow_mapping_key(yaml_emitter_t *emitter,
118
+ yaml_event_t *event, int first);
119
+
120
+ static int
121
+ yaml_emitter_emit_flow_mapping_value(yaml_emitter_t *emitter,
122
+ yaml_event_t *event, int simple);
123
+
124
+ static int
125
+ yaml_emitter_emit_block_sequence_item(yaml_emitter_t *emitter,
126
+ yaml_event_t *event, int first);
127
+
128
+ static int
129
+ yaml_emitter_emit_block_mapping_key(yaml_emitter_t *emitter,
130
+ yaml_event_t *event, int first);
131
+
132
+ static int
133
+ yaml_emitter_emit_block_mapping_value(yaml_emitter_t *emitter,
134
+ yaml_event_t *event, int simple);
135
+
136
+ static int
137
+ yaml_emitter_emit_node(yaml_emitter_t *emitter, yaml_event_t *event,
138
+ int root, int sequence, int mapping, int simple_key);
139
+
140
+ static int
141
+ yaml_emitter_emit_alias(yaml_emitter_t *emitter, yaml_event_t *event);
142
+
143
+ static int
144
+ yaml_emitter_emit_scalar(yaml_emitter_t *emitter, yaml_event_t *event);
145
+
146
+ static int
147
+ yaml_emitter_emit_sequence_start(yaml_emitter_t *emitter, yaml_event_t *event);
148
+
149
+ static int
150
+ yaml_emitter_emit_mapping_start(yaml_emitter_t *emitter, yaml_event_t *event);
151
+
152
+ /*
153
+ * Checkers.
154
+ */
155
+
156
+ static int
157
+ yaml_emitter_check_empty_document(yaml_emitter_t *emitter);
158
+
159
+ static int
160
+ yaml_emitter_check_empty_sequence(yaml_emitter_t *emitter);
161
+
162
+ static int
163
+ yaml_emitter_check_empty_mapping(yaml_emitter_t *emitter);
164
+
165
+ static int
166
+ yaml_emitter_check_simple_key(yaml_emitter_t *emitter);
167
+
168
+ static int
169
+ yaml_emitter_select_scalar_style(yaml_emitter_t *emitter, yaml_event_t *event);
170
+
171
+ /*
172
+ * Processors.
173
+ */
174
+
175
+ static int
176
+ yaml_emitter_process_anchor(yaml_emitter_t *emitter);
177
+
178
+ static int
179
+ yaml_emitter_process_tag(yaml_emitter_t *emitter);
180
+
181
+ static int
182
+ yaml_emitter_process_scalar(yaml_emitter_t *emitter);
183
+
184
+ /*
185
+ * Analyzers.
186
+ */
187
+
188
+ static int
189
+ yaml_emitter_analyze_version_directive(yaml_emitter_t *emitter,
190
+ yaml_version_directive_t version_directive);
191
+
192
+ static int
193
+ yaml_emitter_analyze_tag_directive(yaml_emitter_t *emitter,
194
+ yaml_tag_directive_t tag_directive);
195
+
196
+ static int
197
+ yaml_emitter_analyze_anchor(yaml_emitter_t *emitter,
198
+ yaml_char_t *anchor, int alias);
199
+
200
+ static int
201
+ yaml_emitter_analyze_tag(yaml_emitter_t *emitter,
202
+ yaml_char_t *tag);
203
+
204
+ static int
205
+ yaml_emitter_analyze_scalar(yaml_emitter_t *emitter,
206
+ yaml_char_t *value, size_t length);
207
+
208
+ static int
209
+ yaml_emitter_analyze_event(yaml_emitter_t *emitter,
210
+ yaml_event_t *event);
211
+
212
+ /*
213
+ * Writers.
214
+ */
215
+
216
+ static int
217
+ yaml_emitter_write_bom(yaml_emitter_t *emitter);
218
+
219
+ static int
220
+ yaml_emitter_write_indent(yaml_emitter_t *emitter);
221
+
222
+ static int
223
+ yaml_emitter_write_indicator(yaml_emitter_t *emitter,
224
+ const char *indicator, int need_whitespace,
225
+ int is_whitespace, int is_indention);
226
+
227
+ static int
228
+ yaml_emitter_write_anchor(yaml_emitter_t *emitter,
229
+ yaml_char_t *value, size_t length);
230
+
231
+ static int
232
+ yaml_emitter_write_tag_handle(yaml_emitter_t *emitter,
233
+ yaml_char_t *value, size_t length);
234
+
235
+ static int
236
+ yaml_emitter_write_tag_content(yaml_emitter_t *emitter,
237
+ yaml_char_t *value, size_t length, int need_whitespace);
238
+
239
+ static int
240
+ yaml_emitter_write_plain_scalar(yaml_emitter_t *emitter,
241
+ yaml_char_t *value, size_t length, int allow_breaks);
242
+
243
+ static int
244
+ yaml_emitter_write_single_quoted_scalar(yaml_emitter_t *emitter,
245
+ yaml_char_t *value, size_t length, int allow_breaks);
246
+
247
+ static int
248
+ yaml_emitter_write_double_quoted_scalar(yaml_emitter_t *emitter,
249
+ yaml_char_t *value, size_t length, int allow_breaks);
250
+
251
+ static int
252
+ yaml_emitter_write_block_scalar_hints(yaml_emitter_t *emitter,
253
+ yaml_string_t string);
254
+
255
+ static int
256
+ yaml_emitter_write_literal_scalar(yaml_emitter_t *emitter,
257
+ yaml_char_t *value, size_t length);
258
+
259
+ static int
260
+ yaml_emitter_write_folded_scalar(yaml_emitter_t *emitter,
261
+ yaml_char_t *value, size_t length);
262
+
263
+ /*
264
+ * Set an emitter error and return 0.
265
+ */
266
+
267
+ static int
268
+ yaml_emitter_set_emitter_error(yaml_emitter_t *emitter, const char *problem)
269
+ {
270
+ emitter->error = YAML_EMITTER_ERROR;
271
+ emitter->problem = problem;
272
+
273
+ return 0;
274
+ }
275
+
276
+ /*
277
+ * Emit an event.
278
+ */
279
+
280
+ YAML_DECLARE(int)
281
+ yaml_emitter_emit(yaml_emitter_t *emitter, yaml_event_t *event)
282
+ {
283
+ if (!ENQUEUE(emitter, emitter->events, *event)) {
284
+ yaml_event_delete(event);
285
+ return 0;
286
+ }
287
+
288
+ while (!yaml_emitter_need_more_events(emitter)) {
289
+ if (!yaml_emitter_analyze_event(emitter, emitter->events.head))
290
+ return 0;
291
+ if (!yaml_emitter_state_machine(emitter, emitter->events.head))
292
+ return 0;
293
+ yaml_event_delete(&DEQUEUE(emitter, emitter->events));
294
+ }
295
+
296
+ return 1;
297
+ }
298
+
299
+ /*
300
+ * Check if we need to accumulate more events before emitting.
301
+ *
302
+ * We accumulate extra
303
+ * - 1 event for DOCUMENT-START
304
+ * - 2 events for SEQUENCE-START
305
+ * - 3 events for MAPPING-START
306
+ */
307
+
308
+ static int
309
+ yaml_emitter_need_more_events(yaml_emitter_t *emitter)
310
+ {
311
+ int level = 0;
312
+ int accumulate = 0;
313
+ yaml_event_t *event;
314
+
315
+ if (QUEUE_EMPTY(emitter, emitter->events))
316
+ return 1;
317
+
318
+ switch (emitter->events.head->type) {
319
+ case YAML_DOCUMENT_START_EVENT:
320
+ accumulate = 1;
321
+ break;
322
+ case YAML_SEQUENCE_START_EVENT:
323
+ accumulate = 2;
324
+ break;
325
+ case YAML_MAPPING_START_EVENT:
326
+ accumulate = 3;
327
+ break;
328
+ default:
329
+ return 0;
330
+ }
331
+
332
+ if (emitter->events.tail - emitter->events.head > accumulate)
333
+ return 0;
334
+
335
+ for (event = emitter->events.head; event != emitter->events.tail; event ++) {
336
+ switch (event->type) {
337
+ case YAML_STREAM_START_EVENT:
338
+ case YAML_DOCUMENT_START_EVENT:
339
+ case YAML_SEQUENCE_START_EVENT:
340
+ case YAML_MAPPING_START_EVENT:
341
+ level += 1;
342
+ break;
343
+ case YAML_STREAM_END_EVENT:
344
+ case YAML_DOCUMENT_END_EVENT:
345
+ case YAML_SEQUENCE_END_EVENT:
346
+ case YAML_MAPPING_END_EVENT:
347
+ level -= 1;
348
+ break;
349
+ default:
350
+ break;
351
+ }
352
+ if (!level)
353
+ return 0;
354
+ }
355
+
356
+ return 1;
357
+ }
358
+
359
+ /*
360
+ * Append a directive to the directives stack.
361
+ */
362
+
363
+ static int
364
+ yaml_emitter_append_tag_directive(yaml_emitter_t *emitter,
365
+ yaml_tag_directive_t value, int allow_duplicates)
366
+ {
367
+ yaml_tag_directive_t *tag_directive;
368
+ yaml_tag_directive_t copy = { NULL, NULL };
369
+
370
+ for (tag_directive = emitter->tag_directives.start;
371
+ tag_directive != emitter->tag_directives.top; tag_directive ++) {
372
+ if (strcmp((char *)value.handle, (char *)tag_directive->handle) == 0) {
373
+ if (allow_duplicates)
374
+ return 1;
375
+ return yaml_emitter_set_emitter_error(emitter,
376
+ "duplicate %TAG directive");
377
+ }
378
+ }
379
+
380
+ copy.handle = yaml_strdup(value.handle);
381
+ copy.prefix = yaml_strdup(value.prefix);
382
+ if (!copy.handle || !copy.prefix) {
383
+ emitter->error = YAML_MEMORY_ERROR;
384
+ goto error;
385
+ }
386
+
387
+ if (!PUSH(emitter, emitter->tag_directives, copy))
388
+ goto error;
389
+
390
+ return 1;
391
+
392
+ error:
393
+ yaml_free(copy.handle);
394
+ yaml_free(copy.prefix);
395
+ return 0;
396
+ }
397
+
398
+ /*
399
+ * Increase the indentation level.
400
+ */
401
+
402
+ static int
403
+ yaml_emitter_increase_indent(yaml_emitter_t *emitter,
404
+ int flow, int indentless)
405
+ {
406
+ if (!PUSH(emitter, emitter->indents, emitter->indent))
407
+ return 0;
408
+
409
+ if (emitter->indent < 0) {
410
+ emitter->indent = flow ? emitter->best_indent : 0;
411
+ }
412
+ else if (!indentless) {
413
+ emitter->indent += emitter->best_indent;
414
+ }
415
+
416
+ return 1;
417
+ }
418
+
419
+ /*
420
+ * State dispatcher.
421
+ */
422
+
423
+ static int
424
+ yaml_emitter_state_machine(yaml_emitter_t *emitter, yaml_event_t *event)
425
+ {
426
+ switch (emitter->state)
427
+ {
428
+ case YAML_EMIT_STREAM_START_STATE:
429
+ return yaml_emitter_emit_stream_start(emitter, event);
430
+
431
+ case YAML_EMIT_FIRST_DOCUMENT_START_STATE:
432
+ return yaml_emitter_emit_document_start(emitter, event, 1);
433
+
434
+ case YAML_EMIT_DOCUMENT_START_STATE:
435
+ return yaml_emitter_emit_document_start(emitter, event, 0);
436
+
437
+ case YAML_EMIT_DOCUMENT_CONTENT_STATE:
438
+ return yaml_emitter_emit_document_content(emitter, event);
439
+
440
+ case YAML_EMIT_DOCUMENT_END_STATE:
441
+ return yaml_emitter_emit_document_end(emitter, event);
442
+
443
+ case YAML_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE:
444
+ return yaml_emitter_emit_flow_sequence_item(emitter, event, 1);
445
+
446
+ case YAML_EMIT_FLOW_SEQUENCE_ITEM_STATE:
447
+ return yaml_emitter_emit_flow_sequence_item(emitter, event, 0);
448
+
449
+ case YAML_EMIT_FLOW_MAPPING_FIRST_KEY_STATE:
450
+ return yaml_emitter_emit_flow_mapping_key(emitter, event, 1);
451
+
452
+ case YAML_EMIT_FLOW_MAPPING_KEY_STATE:
453
+ return yaml_emitter_emit_flow_mapping_key(emitter, event, 0);
454
+
455
+ case YAML_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE:
456
+ return yaml_emitter_emit_flow_mapping_value(emitter, event, 1);
457
+
458
+ case YAML_EMIT_FLOW_MAPPING_VALUE_STATE:
459
+ return yaml_emitter_emit_flow_mapping_value(emitter, event, 0);
460
+
461
+ case YAML_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE:
462
+ return yaml_emitter_emit_block_sequence_item(emitter, event, 1);
463
+
464
+ case YAML_EMIT_BLOCK_SEQUENCE_ITEM_STATE:
465
+ return yaml_emitter_emit_block_sequence_item(emitter, event, 0);
466
+
467
+ case YAML_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:
468
+ return yaml_emitter_emit_block_mapping_key(emitter, event, 1);
469
+
470
+ case YAML_EMIT_BLOCK_MAPPING_KEY_STATE:
471
+ return yaml_emitter_emit_block_mapping_key(emitter, event, 0);
472
+
473
+ case YAML_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:
474
+ return yaml_emitter_emit_block_mapping_value(emitter, event, 1);
475
+
476
+ case YAML_EMIT_BLOCK_MAPPING_VALUE_STATE:
477
+ return yaml_emitter_emit_block_mapping_value(emitter, event, 0);
478
+
479
+ case YAML_EMIT_END_STATE:
480
+ return yaml_emitter_set_emitter_error(emitter,
481
+ "expected nothing after STREAM-END");
482
+
483
+ default:
484
+ assert(1); /* Invalid state. */
485
+ }
486
+
487
+ return 0;
488
+ }
489
+
490
+ /*
491
+ * Expect STREAM-START.
492
+ */
493
+
494
+ static int
495
+ yaml_emitter_emit_stream_start(yaml_emitter_t *emitter,
496
+ yaml_event_t *event)
497
+ {
498
+ emitter->open_ended = 0;
499
+ if (event->type == YAML_STREAM_START_EVENT)
500
+ {
501
+ if (!emitter->encoding) {
502
+ emitter->encoding = event->data.stream_start.encoding;
503
+ }
504
+
505
+ if (!emitter->encoding) {
506
+ emitter->encoding = YAML_UTF8_ENCODING;
507
+ }
508
+
509
+ if (emitter->best_indent < 2 || emitter->best_indent > 9) {
510
+ emitter->best_indent = 2;
511
+ }
512
+
513
+ if (emitter->best_width >= 0
514
+ && emitter->best_width <= emitter->best_indent*2) {
515
+ emitter->best_width = 80;
516
+ }
517
+
518
+ if (emitter->best_width < 0) {
519
+ emitter->best_width = INT_MAX;
520
+ }
521
+
522
+ if (!emitter->line_break) {
523
+ emitter->line_break = YAML_LN_BREAK;
524
+ }
525
+
526
+ emitter->indent = -1;
527
+
528
+ emitter->line = 0;
529
+ emitter->column = 0;
530
+ emitter->whitespace = 1;
531
+ emitter->indention = 1;
532
+
533
+ if (emitter->encoding != YAML_UTF8_ENCODING) {
534
+ if (!yaml_emitter_write_bom(emitter))
535
+ return 0;
536
+ }
537
+
538
+ emitter->state = YAML_EMIT_FIRST_DOCUMENT_START_STATE;
539
+
540
+ return 1;
541
+ }
542
+
543
+ return yaml_emitter_set_emitter_error(emitter,
544
+ "expected STREAM-START");
545
+ }
546
+
547
+ /*
548
+ * Expect DOCUMENT-START or STREAM-END.
549
+ */
550
+
551
+ static int
552
+ yaml_emitter_emit_document_start(yaml_emitter_t *emitter,
553
+ yaml_event_t *event, int first)
554
+ {
555
+ if (event->type == YAML_DOCUMENT_START_EVENT)
556
+ {
557
+ yaml_tag_directive_t default_tag_directives[] = {
558
+ {(yaml_char_t *)"!", (yaml_char_t *)"!"},
559
+ {(yaml_char_t *)"!!", (yaml_char_t *)"tag:yaml.org,2002:"},
560
+ {NULL, NULL}
561
+ };
562
+ yaml_tag_directive_t *tag_directive;
563
+ int implicit;
564
+
565
+ if (event->data.document_start.version_directive) {
566
+ if (!yaml_emitter_analyze_version_directive(emitter,
567
+ *event->data.document_start.version_directive))
568
+ return 0;
569
+ }
570
+
571
+ for (tag_directive = event->data.document_start.tag_directives.start;
572
+ tag_directive != event->data.document_start.tag_directives.end;
573
+ tag_directive ++) {
574
+ if (!yaml_emitter_analyze_tag_directive(emitter, *tag_directive))
575
+ return 0;
576
+ if (!yaml_emitter_append_tag_directive(emitter, *tag_directive, 0))
577
+ return 0;
578
+ }
579
+
580
+ for (tag_directive = default_tag_directives;
581
+ tag_directive->handle; tag_directive ++) {
582
+ if (!yaml_emitter_append_tag_directive(emitter, *tag_directive, 1))
583
+ return 0;
584
+ }
585
+
586
+ implicit = event->data.document_start.implicit;
587
+ if (!first || emitter->canonical) {
588
+ implicit = 0;
589
+ }
590
+
591
+ if ((event->data.document_start.version_directive ||
592
+ (event->data.document_start.tag_directives.start
593
+ != event->data.document_start.tag_directives.end)) &&
594
+ emitter->open_ended)
595
+ {
596
+ if (!yaml_emitter_write_indicator(emitter, "...", 1, 0, 0))
597
+ return 0;
598
+ if (!yaml_emitter_write_indent(emitter))
599
+ return 0;
600
+ }
601
+ emitter->open_ended = 0;
602
+
603
+ if (event->data.document_start.version_directive) {
604
+ implicit = 0;
605
+ if (!yaml_emitter_write_indicator(emitter, "%YAML", 1, 0, 0))
606
+ return 0;
607
+ if (event->data.document_start.version_directive->minor == 1) {
608
+ if (!yaml_emitter_write_indicator(emitter, "1.1", 1, 0, 0))
609
+ return 0;
610
+ }
611
+ else {
612
+ if (!yaml_emitter_write_indicator(emitter, "1.2", 1, 0, 0))
613
+ return 0;
614
+ }
615
+ if (!yaml_emitter_write_indent(emitter))
616
+ return 0;
617
+ }
618
+
619
+ if (event->data.document_start.tag_directives.start
620
+ != event->data.document_start.tag_directives.end) {
621
+ implicit = 0;
622
+ for (tag_directive = event->data.document_start.tag_directives.start;
623
+ tag_directive != event->data.document_start.tag_directives.end;
624
+ tag_directive ++) {
625
+ if (!yaml_emitter_write_indicator(emitter, "%TAG", 1, 0, 0))
626
+ return 0;
627
+ if (!yaml_emitter_write_tag_handle(emitter, tag_directive->handle,
628
+ strlen((char *)tag_directive->handle)))
629
+ return 0;
630
+ if (!yaml_emitter_write_tag_content(emitter, tag_directive->prefix,
631
+ strlen((char *)tag_directive->prefix), 1))
632
+ return 0;
633
+ if (!yaml_emitter_write_indent(emitter))
634
+ return 0;
635
+ }
636
+ }
637
+
638
+ if (yaml_emitter_check_empty_document(emitter)) {
639
+ implicit = 0;
640
+ }
641
+
642
+ if (!implicit) {
643
+ if (!yaml_emitter_write_indent(emitter))
644
+ return 0;
645
+ if (!yaml_emitter_write_indicator(emitter, "---", 1, 0, 0))
646
+ return 0;
647
+ if (emitter->canonical) {
648
+ if (!yaml_emitter_write_indent(emitter))
649
+ return 0;
650
+ }
651
+ }
652
+
653
+ emitter->state = YAML_EMIT_DOCUMENT_CONTENT_STATE;
654
+
655
+ emitter->open_ended = 0;
656
+ return 1;
657
+ }
658
+
659
+ else if (event->type == YAML_STREAM_END_EVENT)
660
+ {
661
+
662
+ /**
663
+ * This can happen if a block scalar with trailing empty lines
664
+ * is at the end of the stream
665
+ */
666
+ if (emitter->open_ended == 2)
667
+ {
668
+ if (!yaml_emitter_write_indicator(emitter, "...", 1, 0, 0))
669
+ return 0;
670
+ emitter->open_ended = 0;
671
+ if (!yaml_emitter_write_indent(emitter))
672
+ return 0;
673
+ }
674
+ if (!yaml_emitter_flush(emitter))
675
+ return 0;
676
+
677
+ emitter->state = YAML_EMIT_END_STATE;
678
+
679
+ return 1;
680
+ }
681
+
682
+ return yaml_emitter_set_emitter_error(emitter,
683
+ "expected DOCUMENT-START or STREAM-END");
684
+ }
685
+
686
+ /*
687
+ * Expect the root node.
688
+ */
689
+
690
+ static int
691
+ yaml_emitter_emit_document_content(yaml_emitter_t *emitter,
692
+ yaml_event_t *event)
693
+ {
694
+ if (!PUSH(emitter, emitter->states, YAML_EMIT_DOCUMENT_END_STATE))
695
+ return 0;
696
+
697
+ return yaml_emitter_emit_node(emitter, event, 1, 0, 0, 0);
698
+ }
699
+
700
+ /*
701
+ * Expect DOCUMENT-END.
702
+ */
703
+
704
+ static int
705
+ yaml_emitter_emit_document_end(yaml_emitter_t *emitter,
706
+ yaml_event_t *event)
707
+ {
708
+ if (event->type == YAML_DOCUMENT_END_EVENT)
709
+ {
710
+ if (!yaml_emitter_write_indent(emitter))
711
+ return 0;
712
+ if (!event->data.document_end.implicit) {
713
+ if (!yaml_emitter_write_indicator(emitter, "...", 1, 0, 0))
714
+ return 0;
715
+ emitter->open_ended = 0;
716
+ if (!yaml_emitter_write_indent(emitter))
717
+ return 0;
718
+ }
719
+ else if (!emitter->open_ended)
720
+ emitter->open_ended = 1;
721
+ if (!yaml_emitter_flush(emitter))
722
+ return 0;
723
+
724
+ emitter->state = YAML_EMIT_DOCUMENT_START_STATE;
725
+
726
+ while (!STACK_EMPTY(emitter, emitter->tag_directives)) {
727
+ yaml_tag_directive_t tag_directive = POP(emitter,
728
+ emitter->tag_directives);
729
+ yaml_free(tag_directive.handle);
730
+ yaml_free(tag_directive.prefix);
731
+ }
732
+
733
+ return 1;
734
+ }
735
+
736
+ return yaml_emitter_set_emitter_error(emitter,
737
+ "expected DOCUMENT-END");
738
+ }
739
+
740
+ /*
741
+ *
742
+ * Expect a flow item node.
743
+ */
744
+
745
+ static int
746
+ yaml_emitter_emit_flow_sequence_item(yaml_emitter_t *emitter,
747
+ yaml_event_t *event, int first)
748
+ {
749
+ if (first)
750
+ {
751
+ if (!yaml_emitter_write_indicator(emitter, "[", 1, 1, 0))
752
+ return 0;
753
+ if (!yaml_emitter_increase_indent(emitter, 1, 0))
754
+ return 0;
755
+ emitter->flow_level ++;
756
+ }
757
+
758
+ if (event->type == YAML_SEQUENCE_END_EVENT)
759
+ {
760
+ emitter->flow_level --;
761
+ emitter->indent = POP(emitter, emitter->indents);
762
+ if (emitter->canonical && !first) {
763
+ if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0))
764
+ return 0;
765
+ if (!yaml_emitter_write_indent(emitter))
766
+ return 0;
767
+ }
768
+ if (!yaml_emitter_write_indicator(emitter, "]", 0, 0, 0))
769
+ return 0;
770
+ emitter->state = POP(emitter, emitter->states);
771
+
772
+ return 1;
773
+ }
774
+
775
+ if (!first) {
776
+ if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0))
777
+ return 0;
778
+ }
779
+
780
+ if (emitter->canonical || emitter->column > emitter->best_width) {
781
+ if (!yaml_emitter_write_indent(emitter))
782
+ return 0;
783
+ }
784
+ if (!PUSH(emitter, emitter->states, YAML_EMIT_FLOW_SEQUENCE_ITEM_STATE))
785
+ return 0;
786
+
787
+ return yaml_emitter_emit_node(emitter, event, 0, 1, 0, 0);
788
+ }
789
+
790
+ /*
791
+ * Expect a flow key node.
792
+ */
793
+
794
+ static int
795
+ yaml_emitter_emit_flow_mapping_key(yaml_emitter_t *emitter,
796
+ yaml_event_t *event, int first)
797
+ {
798
+ if (first)
799
+ {
800
+ if (!yaml_emitter_write_indicator(emitter, "{", 1, 1, 0))
801
+ return 0;
802
+ if (!yaml_emitter_increase_indent(emitter, 1, 0))
803
+ return 0;
804
+ emitter->flow_level ++;
805
+ }
806
+
807
+ if (event->type == YAML_MAPPING_END_EVENT)
808
+ {
809
+ emitter->flow_level --;
810
+ emitter->indent = POP(emitter, emitter->indents);
811
+ if (emitter->canonical && !first) {
812
+ if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0))
813
+ return 0;
814
+ if (!yaml_emitter_write_indent(emitter))
815
+ return 0;
816
+ }
817
+ if (!yaml_emitter_write_indicator(emitter, "}", 0, 0, 0))
818
+ return 0;
819
+ emitter->state = POP(emitter, emitter->states);
820
+
821
+ return 1;
822
+ }
823
+
824
+ if (!first) {
825
+ if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0))
826
+ return 0;
827
+ }
828
+ if (emitter->canonical || emitter->column > emitter->best_width) {
829
+ if (!yaml_emitter_write_indent(emitter))
830
+ return 0;
831
+ }
832
+
833
+ if (!emitter->canonical && yaml_emitter_check_simple_key(emitter))
834
+ {
835
+ if (!PUSH(emitter, emitter->states,
836
+ YAML_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE))
837
+ return 0;
838
+
839
+ return yaml_emitter_emit_node(emitter, event, 0, 0, 1, 1);
840
+ }
841
+ else
842
+ {
843
+ if (!yaml_emitter_write_indicator(emitter, "?", 1, 0, 0))
844
+ return 0;
845
+ if (!PUSH(emitter, emitter->states,
846
+ YAML_EMIT_FLOW_MAPPING_VALUE_STATE))
847
+ return 0;
848
+
849
+ return yaml_emitter_emit_node(emitter, event, 0, 0, 1, 0);
850
+ }
851
+ }
852
+
853
+ /*
854
+ * Expect a flow value node.
855
+ */
856
+
857
+ static int
858
+ yaml_emitter_emit_flow_mapping_value(yaml_emitter_t *emitter,
859
+ yaml_event_t *event, int simple)
860
+ {
861
+ if (simple) {
862
+ if (!yaml_emitter_write_indicator(emitter, ":", 0, 0, 0))
863
+ return 0;
864
+ }
865
+ else {
866
+ if (emitter->canonical || emitter->column > emitter->best_width) {
867
+ if (!yaml_emitter_write_indent(emitter))
868
+ return 0;
869
+ }
870
+ if (!yaml_emitter_write_indicator(emitter, ":", 1, 0, 0))
871
+ return 0;
872
+ }
873
+ if (!PUSH(emitter, emitter->states, YAML_EMIT_FLOW_MAPPING_KEY_STATE))
874
+ return 0;
875
+ return yaml_emitter_emit_node(emitter, event, 0, 0, 1, 0);
876
+ }
877
+
878
+ /*
879
+ * Expect a block item node.
880
+ */
881
+
882
+ static int
883
+ yaml_emitter_emit_block_sequence_item(yaml_emitter_t *emitter,
884
+ yaml_event_t *event, int first)
885
+ {
886
+ if (first)
887
+ {
888
+ if (!yaml_emitter_increase_indent(emitter, 0,
889
+ (emitter->mapping_context && !emitter->indention)))
890
+ return 0;
891
+ }
892
+
893
+ if (event->type == YAML_SEQUENCE_END_EVENT)
894
+ {
895
+ emitter->indent = POP(emitter, emitter->indents);
896
+ emitter->state = POP(emitter, emitter->states);
897
+
898
+ return 1;
899
+ }
900
+
901
+ if (!yaml_emitter_write_indent(emitter))
902
+ return 0;
903
+ if (!yaml_emitter_write_indicator(emitter, "-", 1, 0, 1))
904
+ return 0;
905
+ if (!PUSH(emitter, emitter->states,
906
+ YAML_EMIT_BLOCK_SEQUENCE_ITEM_STATE))
907
+ return 0;
908
+
909
+ return yaml_emitter_emit_node(emitter, event, 0, 1, 0, 0);
910
+ }
911
+
912
+ /*
913
+ * Expect a block key node.
914
+ */
915
+
916
+ static int
917
+ yaml_emitter_emit_block_mapping_key(yaml_emitter_t *emitter,
918
+ yaml_event_t *event, int first)
919
+ {
920
+ if (first)
921
+ {
922
+ if (!yaml_emitter_increase_indent(emitter, 0, 0))
923
+ return 0;
924
+ }
925
+
926
+ if (event->type == YAML_MAPPING_END_EVENT)
927
+ {
928
+ emitter->indent = POP(emitter, emitter->indents);
929
+ emitter->state = POP(emitter, emitter->states);
930
+
931
+ return 1;
932
+ }
933
+
934
+ if (!yaml_emitter_write_indent(emitter))
935
+ return 0;
936
+
937
+ if (yaml_emitter_check_simple_key(emitter))
938
+ {
939
+ if (!PUSH(emitter, emitter->states,
940
+ YAML_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE))
941
+ return 0;
942
+
943
+ return yaml_emitter_emit_node(emitter, event, 0, 0, 1, 1);
944
+ }
945
+ else
946
+ {
947
+ if (!yaml_emitter_write_indicator(emitter, "?", 1, 0, 1))
948
+ return 0;
949
+ if (!PUSH(emitter, emitter->states,
950
+ YAML_EMIT_BLOCK_MAPPING_VALUE_STATE))
951
+ return 0;
952
+
953
+ return yaml_emitter_emit_node(emitter, event, 0, 0, 1, 0);
954
+ }
955
+ }
956
+
957
+ /*
958
+ * Expect a block value node.
959
+ */
960
+
961
+ static int
962
+ yaml_emitter_emit_block_mapping_value(yaml_emitter_t *emitter,
963
+ yaml_event_t *event, int simple)
964
+ {
965
+ if (simple) {
966
+ if (!yaml_emitter_write_indicator(emitter, ":", 0, 0, 0))
967
+ return 0;
968
+ }
969
+ else {
970
+ if (!yaml_emitter_write_indent(emitter))
971
+ return 0;
972
+ if (!yaml_emitter_write_indicator(emitter, ":", 1, 0, 1))
973
+ return 0;
974
+ }
975
+ if (!PUSH(emitter, emitter->states,
976
+ YAML_EMIT_BLOCK_MAPPING_KEY_STATE))
977
+ return 0;
978
+
979
+ return yaml_emitter_emit_node(emitter, event, 0, 0, 1, 0);
980
+ }
981
+
982
+ /*
983
+ * Expect a node.
984
+ */
985
+
986
+ static int
987
+ yaml_emitter_emit_node(yaml_emitter_t *emitter, yaml_event_t *event,
988
+ int root, int sequence, int mapping, int simple_key)
989
+ {
990
+ emitter->root_context = root;
991
+ emitter->sequence_context = sequence;
992
+ emitter->mapping_context = mapping;
993
+ emitter->simple_key_context = simple_key;
994
+
995
+ switch (event->type)
996
+ {
997
+ case YAML_ALIAS_EVENT:
998
+ return yaml_emitter_emit_alias(emitter, event);
999
+
1000
+ case YAML_SCALAR_EVENT:
1001
+ return yaml_emitter_emit_scalar(emitter, event);
1002
+
1003
+ case YAML_SEQUENCE_START_EVENT:
1004
+ return yaml_emitter_emit_sequence_start(emitter, event);
1005
+
1006
+ case YAML_MAPPING_START_EVENT:
1007
+ return yaml_emitter_emit_mapping_start(emitter, event);
1008
+
1009
+ default:
1010
+ return yaml_emitter_set_emitter_error(emitter,
1011
+ "expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS");
1012
+ }
1013
+
1014
+ return 0;
1015
+ }
1016
+
1017
+ /*
1018
+ * Expect ALIAS.
1019
+ */
1020
+
1021
+ static int
1022
+ yaml_emitter_emit_alias(yaml_emitter_t *emitter, SHIM(yaml_event_t *event))
1023
+ {
1024
+ if (!yaml_emitter_process_anchor(emitter))
1025
+ return 0;
1026
+ if (emitter->simple_key_context)
1027
+ if (!PUT(emitter, ' ')) return 0;
1028
+ emitter->state = POP(emitter, emitter->states);
1029
+
1030
+ return 1;
1031
+ }
1032
+
1033
+ /*
1034
+ * Expect SCALAR.
1035
+ */
1036
+
1037
+ static int
1038
+ yaml_emitter_emit_scalar(yaml_emitter_t *emitter, yaml_event_t *event)
1039
+ {
1040
+ if (!yaml_emitter_select_scalar_style(emitter, event))
1041
+ return 0;
1042
+ if (!yaml_emitter_process_anchor(emitter))
1043
+ return 0;
1044
+ if (!yaml_emitter_process_tag(emitter))
1045
+ return 0;
1046
+ if (!yaml_emitter_increase_indent(emitter, 1, 0))
1047
+ return 0;
1048
+ if (!yaml_emitter_process_scalar(emitter))
1049
+ return 0;
1050
+ emitter->indent = POP(emitter, emitter->indents);
1051
+ emitter->state = POP(emitter, emitter->states);
1052
+
1053
+ return 1;
1054
+ }
1055
+
1056
+ /*
1057
+ * Expect SEQUENCE-START.
1058
+ */
1059
+
1060
+ static int
1061
+ yaml_emitter_emit_sequence_start(yaml_emitter_t *emitter, yaml_event_t *event)
1062
+ {
1063
+ if (!yaml_emitter_process_anchor(emitter))
1064
+ return 0;
1065
+ if (!yaml_emitter_process_tag(emitter))
1066
+ return 0;
1067
+
1068
+ if (emitter->flow_level || emitter->canonical
1069
+ || event->data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE
1070
+ || yaml_emitter_check_empty_sequence(emitter)) {
1071
+ emitter->state = YAML_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE;
1072
+ }
1073
+ else {
1074
+ emitter->state = YAML_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE;
1075
+ }
1076
+
1077
+ return 1;
1078
+ }
1079
+
1080
+ /*
1081
+ * Expect MAPPING-START.
1082
+ */
1083
+
1084
+ static int
1085
+ yaml_emitter_emit_mapping_start(yaml_emitter_t *emitter, yaml_event_t *event)
1086
+ {
1087
+ if (!yaml_emitter_process_anchor(emitter))
1088
+ return 0;
1089
+ if (!yaml_emitter_process_tag(emitter))
1090
+ return 0;
1091
+
1092
+ if (emitter->flow_level || emitter->canonical
1093
+ || event->data.mapping_start.style == YAML_FLOW_MAPPING_STYLE
1094
+ || yaml_emitter_check_empty_mapping(emitter)) {
1095
+ emitter->state = YAML_EMIT_FLOW_MAPPING_FIRST_KEY_STATE;
1096
+ }
1097
+ else {
1098
+ emitter->state = YAML_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE;
1099
+ }
1100
+
1101
+ return 1;
1102
+ }
1103
+
1104
+ /*
1105
+ * Check if the document content is an empty scalar.
1106
+ */
1107
+
1108
+ static int
1109
+ yaml_emitter_check_empty_document(SHIM(yaml_emitter_t *emitter))
1110
+ {
1111
+ return 0;
1112
+ }
1113
+
1114
+ /*
1115
+ * Check if the next events represent an empty sequence.
1116
+ */
1117
+
1118
+ static int
1119
+ yaml_emitter_check_empty_sequence(yaml_emitter_t *emitter)
1120
+ {
1121
+ if (emitter->events.tail - emitter->events.head < 2)
1122
+ return 0;
1123
+
1124
+ return (emitter->events.head[0].type == YAML_SEQUENCE_START_EVENT
1125
+ && emitter->events.head[1].type == YAML_SEQUENCE_END_EVENT);
1126
+ }
1127
+
1128
+ /*
1129
+ * Check if the next events represent an empty mapping.
1130
+ */
1131
+
1132
+ static int
1133
+ yaml_emitter_check_empty_mapping(yaml_emitter_t *emitter)
1134
+ {
1135
+ if (emitter->events.tail - emitter->events.head < 2)
1136
+ return 0;
1137
+
1138
+ return (emitter->events.head[0].type == YAML_MAPPING_START_EVENT
1139
+ && emitter->events.head[1].type == YAML_MAPPING_END_EVENT);
1140
+ }
1141
+
1142
+ /*
1143
+ * Check if the next node can be expressed as a simple key.
1144
+ */
1145
+
1146
+ static int
1147
+ yaml_emitter_check_simple_key(yaml_emitter_t *emitter)
1148
+ {
1149
+ yaml_event_t *event = emitter->events.head;
1150
+ size_t length = 0;
1151
+
1152
+ switch (event->type)
1153
+ {
1154
+ case YAML_ALIAS_EVENT:
1155
+ length += emitter->anchor_data.anchor_length;
1156
+ break;
1157
+
1158
+ case YAML_SCALAR_EVENT:
1159
+ if (emitter->scalar_data.multiline)
1160
+ return 0;
1161
+ length += emitter->anchor_data.anchor_length
1162
+ + emitter->tag_data.handle_length
1163
+ + emitter->tag_data.suffix_length
1164
+ + emitter->scalar_data.length;
1165
+ break;
1166
+
1167
+ case YAML_SEQUENCE_START_EVENT:
1168
+ if (!yaml_emitter_check_empty_sequence(emitter))
1169
+ return 0;
1170
+ length += emitter->anchor_data.anchor_length
1171
+ + emitter->tag_data.handle_length
1172
+ + emitter->tag_data.suffix_length;
1173
+ break;
1174
+
1175
+ case YAML_MAPPING_START_EVENT:
1176
+ if (!yaml_emitter_check_empty_mapping(emitter))
1177
+ return 0;
1178
+ length += emitter->anchor_data.anchor_length
1179
+ + emitter->tag_data.handle_length
1180
+ + emitter->tag_data.suffix_length;
1181
+ break;
1182
+
1183
+ default:
1184
+ return 0;
1185
+ }
1186
+
1187
+ if (length > 128)
1188
+ return 0;
1189
+
1190
+ return 1;
1191
+ }
1192
+
1193
+ /*
1194
+ * Determine an acceptable scalar style.
1195
+ */
1196
+
1197
+ static int
1198
+ yaml_emitter_select_scalar_style(yaml_emitter_t *emitter, yaml_event_t *event)
1199
+ {
1200
+ yaml_scalar_style_t style = event->data.scalar.style;
1201
+ int no_tag = (!emitter->tag_data.handle && !emitter->tag_data.suffix);
1202
+
1203
+ if (no_tag && !event->data.scalar.plain_implicit
1204
+ && !event->data.scalar.quoted_implicit) {
1205
+ return yaml_emitter_set_emitter_error(emitter,
1206
+ "neither tag nor implicit flags are specified");
1207
+ }
1208
+
1209
+ if (style == YAML_ANY_SCALAR_STYLE)
1210
+ style = YAML_PLAIN_SCALAR_STYLE;
1211
+
1212
+ if (emitter->canonical)
1213
+ style = YAML_DOUBLE_QUOTED_SCALAR_STYLE;
1214
+
1215
+ if (emitter->simple_key_context && emitter->scalar_data.multiline)
1216
+ style = YAML_DOUBLE_QUOTED_SCALAR_STYLE;
1217
+
1218
+ if (style == YAML_PLAIN_SCALAR_STYLE)
1219
+ {
1220
+ if ((emitter->flow_level && !emitter->scalar_data.flow_plain_allowed)
1221
+ || (!emitter->flow_level && !emitter->scalar_data.block_plain_allowed))
1222
+ style = YAML_SINGLE_QUOTED_SCALAR_STYLE;
1223
+ if (!emitter->scalar_data.length
1224
+ && (emitter->flow_level || emitter->simple_key_context))
1225
+ style = YAML_SINGLE_QUOTED_SCALAR_STYLE;
1226
+ if (no_tag && !event->data.scalar.plain_implicit)
1227
+ style = YAML_SINGLE_QUOTED_SCALAR_STYLE;
1228
+ }
1229
+
1230
+ if (style == YAML_SINGLE_QUOTED_SCALAR_STYLE)
1231
+ {
1232
+ if (!emitter->scalar_data.single_quoted_allowed)
1233
+ style = YAML_DOUBLE_QUOTED_SCALAR_STYLE;
1234
+ }
1235
+
1236
+ if (style == YAML_LITERAL_SCALAR_STYLE || style == YAML_FOLDED_SCALAR_STYLE)
1237
+ {
1238
+ if (!emitter->scalar_data.block_allowed
1239
+ || emitter->flow_level || emitter->simple_key_context)
1240
+ style = YAML_DOUBLE_QUOTED_SCALAR_STYLE;
1241
+ }
1242
+
1243
+ if (no_tag && !event->data.scalar.quoted_implicit
1244
+ && style != YAML_PLAIN_SCALAR_STYLE)
1245
+ {
1246
+ emitter->tag_data.handle = (yaml_char_t *)"!";
1247
+ emitter->tag_data.handle_length = 1;
1248
+ }
1249
+
1250
+ emitter->scalar_data.style = style;
1251
+
1252
+ return 1;
1253
+ }
1254
+
1255
+ /*
1256
+ * Write an anchor.
1257
+ */
1258
+
1259
+ static int
1260
+ yaml_emitter_process_anchor(yaml_emitter_t *emitter)
1261
+ {
1262
+ if (!emitter->anchor_data.anchor)
1263
+ return 1;
1264
+
1265
+ if (!yaml_emitter_write_indicator(emitter,
1266
+ (emitter->anchor_data.alias ? "*" : "&"), 1, 0, 0))
1267
+ return 0;
1268
+
1269
+ return yaml_emitter_write_anchor(emitter,
1270
+ emitter->anchor_data.anchor, emitter->anchor_data.anchor_length);
1271
+ }
1272
+
1273
+ /*
1274
+ * Write a tag.
1275
+ */
1276
+
1277
+ static int
1278
+ yaml_emitter_process_tag(yaml_emitter_t *emitter)
1279
+ {
1280
+ if (!emitter->tag_data.handle && !emitter->tag_data.suffix)
1281
+ return 1;
1282
+
1283
+ if (emitter->tag_data.handle)
1284
+ {
1285
+ if (!yaml_emitter_write_tag_handle(emitter, emitter->tag_data.handle,
1286
+ emitter->tag_data.handle_length))
1287
+ return 0;
1288
+ if (emitter->tag_data.suffix) {
1289
+ if (!yaml_emitter_write_tag_content(emitter, emitter->tag_data.suffix,
1290
+ emitter->tag_data.suffix_length, 0))
1291
+ return 0;
1292
+ }
1293
+ }
1294
+ else
1295
+ {
1296
+ if (!yaml_emitter_write_indicator(emitter, "!<", 1, 0, 0))
1297
+ return 0;
1298
+ if (!yaml_emitter_write_tag_content(emitter, emitter->tag_data.suffix,
1299
+ emitter->tag_data.suffix_length, 0))
1300
+ return 0;
1301
+ if (!yaml_emitter_write_indicator(emitter, ">", 0, 0, 0))
1302
+ return 0;
1303
+ }
1304
+
1305
+ return 1;
1306
+ }
1307
+
1308
+ /*
1309
+ * Write a scalar.
1310
+ */
1311
+
1312
+ static int
1313
+ yaml_emitter_process_scalar(yaml_emitter_t *emitter)
1314
+ {
1315
+ switch (emitter->scalar_data.style)
1316
+ {
1317
+ case YAML_PLAIN_SCALAR_STYLE:
1318
+ return yaml_emitter_write_plain_scalar(emitter,
1319
+ emitter->scalar_data.value, emitter->scalar_data.length,
1320
+ !emitter->simple_key_context);
1321
+
1322
+ case YAML_SINGLE_QUOTED_SCALAR_STYLE:
1323
+ return yaml_emitter_write_single_quoted_scalar(emitter,
1324
+ emitter->scalar_data.value, emitter->scalar_data.length,
1325
+ !emitter->simple_key_context);
1326
+
1327
+ case YAML_DOUBLE_QUOTED_SCALAR_STYLE:
1328
+ return yaml_emitter_write_double_quoted_scalar(emitter,
1329
+ emitter->scalar_data.value, emitter->scalar_data.length,
1330
+ !emitter->simple_key_context);
1331
+
1332
+ case YAML_LITERAL_SCALAR_STYLE:
1333
+ return yaml_emitter_write_literal_scalar(emitter,
1334
+ emitter->scalar_data.value, emitter->scalar_data.length);
1335
+
1336
+ case YAML_FOLDED_SCALAR_STYLE:
1337
+ return yaml_emitter_write_folded_scalar(emitter,
1338
+ emitter->scalar_data.value, emitter->scalar_data.length);
1339
+
1340
+ default:
1341
+ assert(1); /* Impossible. */
1342
+ }
1343
+
1344
+ return 0;
1345
+ }
1346
+
1347
+ /*
1348
+ * Check if a %YAML directive is valid.
1349
+ */
1350
+
1351
+ static int
1352
+ yaml_emitter_analyze_version_directive(yaml_emitter_t *emitter,
1353
+ yaml_version_directive_t version_directive)
1354
+ {
1355
+ if (version_directive.major != 1 || (
1356
+ version_directive.minor != 1
1357
+ && version_directive.minor != 2
1358
+ )) {
1359
+ return yaml_emitter_set_emitter_error(emitter,
1360
+ "incompatible %YAML directive");
1361
+ }
1362
+
1363
+ return 1;
1364
+ }
1365
+
1366
+ /*
1367
+ * Check if a %TAG directive is valid.
1368
+ */
1369
+
1370
+ static int
1371
+ yaml_emitter_analyze_tag_directive(yaml_emitter_t *emitter,
1372
+ yaml_tag_directive_t tag_directive)
1373
+ {
1374
+ yaml_string_t handle;
1375
+ yaml_string_t prefix;
1376
+ size_t handle_length;
1377
+ size_t prefix_length;
1378
+
1379
+ handle_length = strlen((char *)tag_directive.handle);
1380
+ prefix_length = strlen((char *)tag_directive.prefix);
1381
+ STRING_ASSIGN(handle, tag_directive.handle, handle_length);
1382
+ STRING_ASSIGN(prefix, tag_directive.prefix, prefix_length);
1383
+
1384
+ if (handle.start == handle.end) {
1385
+ return yaml_emitter_set_emitter_error(emitter,
1386
+ "tag handle must not be empty");
1387
+ }
1388
+
1389
+ if (handle.start[0] != '!') {
1390
+ return yaml_emitter_set_emitter_error(emitter,
1391
+ "tag handle must start with '!'");
1392
+ }
1393
+
1394
+ if (handle.end[-1] != '!') {
1395
+ return yaml_emitter_set_emitter_error(emitter,
1396
+ "tag handle must end with '!'");
1397
+ }
1398
+
1399
+ handle.pointer ++;
1400
+
1401
+ while (handle.pointer < handle.end-1) {
1402
+ if (!IS_ALPHA(handle)) {
1403
+ return yaml_emitter_set_emitter_error(emitter,
1404
+ "tag handle must contain alphanumerical characters only");
1405
+ }
1406
+ MOVE(handle);
1407
+ }
1408
+
1409
+ if (prefix.start == prefix.end) {
1410
+ return yaml_emitter_set_emitter_error(emitter,
1411
+ "tag prefix must not be empty");
1412
+ }
1413
+
1414
+ return 1;
1415
+ }
1416
+
1417
+ /*
1418
+ * Check if an anchor is valid.
1419
+ */
1420
+
1421
+ static int
1422
+ yaml_emitter_analyze_anchor(yaml_emitter_t *emitter,
1423
+ yaml_char_t *anchor, int alias)
1424
+ {
1425
+ size_t anchor_length;
1426
+ yaml_string_t string;
1427
+
1428
+ anchor_length = strlen((char *)anchor);
1429
+ STRING_ASSIGN(string, anchor, anchor_length);
1430
+
1431
+ if (string.start == string.end) {
1432
+ return yaml_emitter_set_emitter_error(emitter, alias ?
1433
+ "alias value must not be empty" :
1434
+ "anchor value must not be empty");
1435
+ }
1436
+
1437
+ while (string.pointer != string.end) {
1438
+ if (!IS_ALPHA(string)) {
1439
+ return yaml_emitter_set_emitter_error(emitter, alias ?
1440
+ "alias value must contain alphanumerical characters only" :
1441
+ "anchor value must contain alphanumerical characters only");
1442
+ }
1443
+ MOVE(string);
1444
+ }
1445
+
1446
+ emitter->anchor_data.anchor = string.start;
1447
+ emitter->anchor_data.anchor_length = string.end - string.start;
1448
+ emitter->anchor_data.alias = alias;
1449
+
1450
+ return 1;
1451
+ }
1452
+
1453
+ /*
1454
+ * Check if a tag is valid.
1455
+ */
1456
+
1457
+ static int
1458
+ yaml_emitter_analyze_tag(yaml_emitter_t *emitter,
1459
+ yaml_char_t *tag)
1460
+ {
1461
+ size_t tag_length;
1462
+ yaml_string_t string;
1463
+ yaml_tag_directive_t *tag_directive;
1464
+
1465
+ tag_length = strlen((char *)tag);
1466
+ STRING_ASSIGN(string, tag, tag_length);
1467
+
1468
+ if (string.start == string.end) {
1469
+ return yaml_emitter_set_emitter_error(emitter,
1470
+ "tag value must not be empty");
1471
+ }
1472
+
1473
+ for (tag_directive = emitter->tag_directives.start;
1474
+ tag_directive != emitter->tag_directives.top; tag_directive ++) {
1475
+ size_t prefix_length = strlen((char *)tag_directive->prefix);
1476
+ if (prefix_length < (size_t)(string.end - string.start)
1477
+ && strncmp((char *)tag_directive->prefix, (char *)string.start,
1478
+ prefix_length) == 0)
1479
+ {
1480
+ emitter->tag_data.handle = tag_directive->handle;
1481
+ emitter->tag_data.handle_length =
1482
+ strlen((char *)tag_directive->handle);
1483
+ emitter->tag_data.suffix = string.start + prefix_length;
1484
+ emitter->tag_data.suffix_length =
1485
+ (string.end - string.start) - prefix_length;
1486
+ return 1;
1487
+ }
1488
+ }
1489
+
1490
+ emitter->tag_data.suffix = string.start;
1491
+ emitter->tag_data.suffix_length = string.end - string.start;
1492
+
1493
+ return 1;
1494
+ }
1495
+
1496
+ /*
1497
+ * Check if a scalar is valid.
1498
+ */
1499
+
1500
+ static int
1501
+ yaml_emitter_analyze_scalar(yaml_emitter_t *emitter,
1502
+ yaml_char_t *value, size_t length)
1503
+ {
1504
+ yaml_string_t string;
1505
+
1506
+ int block_indicators = 0;
1507
+ int flow_indicators = 0;
1508
+ int line_breaks = 0;
1509
+ int special_characters = 0;
1510
+
1511
+ int leading_space = 0;
1512
+ int leading_break = 0;
1513
+ int trailing_space = 0;
1514
+ int trailing_break = 0;
1515
+ int break_space = 0;
1516
+ int space_break = 0;
1517
+
1518
+ int preceded_by_whitespace = 0;
1519
+ int followed_by_whitespace = 0;
1520
+ int previous_space = 0;
1521
+ int previous_break = 0;
1522
+
1523
+ STRING_ASSIGN(string, value, length);
1524
+
1525
+ emitter->scalar_data.value = value;
1526
+ emitter->scalar_data.length = length;
1527
+
1528
+ if (string.start == string.end)
1529
+ {
1530
+ emitter->scalar_data.multiline = 0;
1531
+ emitter->scalar_data.flow_plain_allowed = 0;
1532
+ emitter->scalar_data.block_plain_allowed = 1;
1533
+ emitter->scalar_data.single_quoted_allowed = 1;
1534
+ emitter->scalar_data.block_allowed = 0;
1535
+
1536
+ return 1;
1537
+ }
1538
+
1539
+ if ((CHECK_AT(string, '-', 0)
1540
+ && CHECK_AT(string, '-', 1)
1541
+ && CHECK_AT(string, '-', 2))
1542
+ || (CHECK_AT(string, '.', 0)
1543
+ && CHECK_AT(string, '.', 1)
1544
+ && CHECK_AT(string, '.', 2))) {
1545
+ block_indicators = 1;
1546
+ flow_indicators = 1;
1547
+ }
1548
+
1549
+ preceded_by_whitespace = 1;
1550
+ followed_by_whitespace = IS_BLANKZ_AT(string, WIDTH(string));
1551
+
1552
+ while (string.pointer != string.end)
1553
+ {
1554
+ if (string.start == string.pointer)
1555
+ {
1556
+ if (CHECK(string, '#') || CHECK(string, ',')
1557
+ || CHECK(string, '[') || CHECK(string, ']')
1558
+ || CHECK(string, '{') || CHECK(string, '}')
1559
+ || CHECK(string, '&') || CHECK(string, '*')
1560
+ || CHECK(string, '!') || CHECK(string, '|')
1561
+ || CHECK(string, '>') || CHECK(string, '\'')
1562
+ || CHECK(string, '"') || CHECK(string, '%')
1563
+ || CHECK(string, '@') || CHECK(string, '`')) {
1564
+ flow_indicators = 1;
1565
+ block_indicators = 1;
1566
+ }
1567
+
1568
+ if (CHECK(string, '?') || CHECK(string, ':')) {
1569
+ flow_indicators = 1;
1570
+ if (followed_by_whitespace) {
1571
+ block_indicators = 1;
1572
+ }
1573
+ }
1574
+
1575
+ if (CHECK(string, '-') && followed_by_whitespace) {
1576
+ flow_indicators = 1;
1577
+ block_indicators = 1;
1578
+ }
1579
+ }
1580
+ else
1581
+ {
1582
+ if (CHECK(string, ',') || CHECK(string, '?')
1583
+ || CHECK(string, '[') || CHECK(string, ']')
1584
+ || CHECK(string, '{') || CHECK(string, '}')) {
1585
+ flow_indicators = 1;
1586
+ }
1587
+
1588
+ if (CHECK(string, ':')) {
1589
+ flow_indicators = 1;
1590
+ if (followed_by_whitespace) {
1591
+ block_indicators = 1;
1592
+ }
1593
+ }
1594
+
1595
+ if (CHECK(string, '#') && preceded_by_whitespace) {
1596
+ flow_indicators = 1;
1597
+ block_indicators = 1;
1598
+ }
1599
+ }
1600
+
1601
+ if (!IS_PRINTABLE(string)
1602
+ || (!IS_ASCII(string) && !emitter->unicode)) {
1603
+ special_characters = 1;
1604
+ }
1605
+
1606
+ if (IS_BREAK(string)) {
1607
+ line_breaks = 1;
1608
+ }
1609
+
1610
+ if (IS_SPACE(string))
1611
+ {
1612
+ if (string.start == string.pointer) {
1613
+ leading_space = 1;
1614
+ }
1615
+ if (string.pointer+WIDTH(string) == string.end) {
1616
+ trailing_space = 1;
1617
+ }
1618
+ if (previous_break) {
1619
+ break_space = 1;
1620
+ }
1621
+ previous_space = 1;
1622
+ previous_break = 0;
1623
+ }
1624
+ else if (IS_BREAK(string))
1625
+ {
1626
+ if (string.start == string.pointer) {
1627
+ leading_break = 1;
1628
+ }
1629
+ if (string.pointer+WIDTH(string) == string.end) {
1630
+ trailing_break = 1;
1631
+ }
1632
+ if (previous_space) {
1633
+ space_break = 1;
1634
+ }
1635
+ previous_space = 0;
1636
+ previous_break = 1;
1637
+ }
1638
+ else
1639
+ {
1640
+ previous_space = 0;
1641
+ previous_break = 0;
1642
+ }
1643
+
1644
+ preceded_by_whitespace = IS_BLANKZ(string);
1645
+ MOVE(string);
1646
+ if (string.pointer != string.end) {
1647
+ followed_by_whitespace = IS_BLANKZ_AT(string, WIDTH(string));
1648
+ }
1649
+ }
1650
+
1651
+ emitter->scalar_data.multiline = line_breaks;
1652
+
1653
+ emitter->scalar_data.flow_plain_allowed = 1;
1654
+ emitter->scalar_data.block_plain_allowed = 1;
1655
+ emitter->scalar_data.single_quoted_allowed = 1;
1656
+ emitter->scalar_data.block_allowed = 1;
1657
+
1658
+ if (leading_space || leading_break || trailing_space || trailing_break) {
1659
+ emitter->scalar_data.flow_plain_allowed = 0;
1660
+ emitter->scalar_data.block_plain_allowed = 0;
1661
+ }
1662
+
1663
+ if (trailing_space) {
1664
+ emitter->scalar_data.block_allowed = 0;
1665
+ }
1666
+
1667
+ if (break_space) {
1668
+ emitter->scalar_data.flow_plain_allowed = 0;
1669
+ emitter->scalar_data.block_plain_allowed = 0;
1670
+ emitter->scalar_data.single_quoted_allowed = 0;
1671
+ }
1672
+
1673
+ if (space_break || special_characters) {
1674
+ emitter->scalar_data.flow_plain_allowed = 0;
1675
+ emitter->scalar_data.block_plain_allowed = 0;
1676
+ emitter->scalar_data.single_quoted_allowed = 0;
1677
+ emitter->scalar_data.block_allowed = 0;
1678
+ }
1679
+
1680
+ if (line_breaks) {
1681
+ emitter->scalar_data.flow_plain_allowed = 0;
1682
+ emitter->scalar_data.block_plain_allowed = 0;
1683
+ }
1684
+
1685
+ if (flow_indicators) {
1686
+ emitter->scalar_data.flow_plain_allowed = 0;
1687
+ }
1688
+
1689
+ if (block_indicators) {
1690
+ emitter->scalar_data.block_plain_allowed = 0;
1691
+ }
1692
+
1693
+ return 1;
1694
+ }
1695
+
1696
+ /*
1697
+ * Check if the event data is valid.
1698
+ */
1699
+
1700
+ static int
1701
+ yaml_emitter_analyze_event(yaml_emitter_t *emitter,
1702
+ yaml_event_t *event)
1703
+ {
1704
+ emitter->anchor_data.anchor = NULL;
1705
+ emitter->anchor_data.anchor_length = 0;
1706
+ emitter->tag_data.handle = NULL;
1707
+ emitter->tag_data.handle_length = 0;
1708
+ emitter->tag_data.suffix = NULL;
1709
+ emitter->tag_data.suffix_length = 0;
1710
+ emitter->scalar_data.value = NULL;
1711
+ emitter->scalar_data.length = 0;
1712
+
1713
+ switch (event->type)
1714
+ {
1715
+ case YAML_ALIAS_EVENT:
1716
+ if (!yaml_emitter_analyze_anchor(emitter,
1717
+ event->data.alias.anchor, 1))
1718
+ return 0;
1719
+ return 1;
1720
+
1721
+ case YAML_SCALAR_EVENT:
1722
+ if (event->data.scalar.anchor) {
1723
+ if (!yaml_emitter_analyze_anchor(emitter,
1724
+ event->data.scalar.anchor, 0))
1725
+ return 0;
1726
+ }
1727
+ if (event->data.scalar.tag && (emitter->canonical ||
1728
+ (!event->data.scalar.plain_implicit
1729
+ && !event->data.scalar.quoted_implicit))) {
1730
+ if (!yaml_emitter_analyze_tag(emitter, event->data.scalar.tag))
1731
+ return 0;
1732
+ }
1733
+ if (!yaml_emitter_analyze_scalar(emitter,
1734
+ event->data.scalar.value, event->data.scalar.length))
1735
+ return 0;
1736
+ return 1;
1737
+
1738
+ case YAML_SEQUENCE_START_EVENT:
1739
+ if (event->data.sequence_start.anchor) {
1740
+ if (!yaml_emitter_analyze_anchor(emitter,
1741
+ event->data.sequence_start.anchor, 0))
1742
+ return 0;
1743
+ }
1744
+ if (event->data.sequence_start.tag && (emitter->canonical ||
1745
+ !event->data.sequence_start.implicit)) {
1746
+ if (!yaml_emitter_analyze_tag(emitter,
1747
+ event->data.sequence_start.tag))
1748
+ return 0;
1749
+ }
1750
+ return 1;
1751
+
1752
+ case YAML_MAPPING_START_EVENT:
1753
+ if (event->data.mapping_start.anchor) {
1754
+ if (!yaml_emitter_analyze_anchor(emitter,
1755
+ event->data.mapping_start.anchor, 0))
1756
+ return 0;
1757
+ }
1758
+ if (event->data.mapping_start.tag && (emitter->canonical ||
1759
+ !event->data.mapping_start.implicit)) {
1760
+ if (!yaml_emitter_analyze_tag(emitter,
1761
+ event->data.mapping_start.tag))
1762
+ return 0;
1763
+ }
1764
+ return 1;
1765
+
1766
+ default:
1767
+ return 1;
1768
+ }
1769
+ }
1770
+
1771
+ /*
1772
+ * Write the BOM character.
1773
+ */
1774
+
1775
+ static int
1776
+ yaml_emitter_write_bom(yaml_emitter_t *emitter)
1777
+ {
1778
+ if (!FLUSH(emitter)) return 0;
1779
+
1780
+ *(emitter->buffer.pointer++) = (yaml_char_t) '\xEF';
1781
+ *(emitter->buffer.pointer++) = (yaml_char_t) '\xBB';
1782
+ *(emitter->buffer.pointer++) = (yaml_char_t) '\xBF';
1783
+
1784
+ return 1;
1785
+ }
1786
+
1787
+ static int
1788
+ yaml_emitter_write_indent(yaml_emitter_t *emitter)
1789
+ {
1790
+ int indent = (emitter->indent >= 0) ? emitter->indent : 0;
1791
+
1792
+ if (!emitter->indention || emitter->column > indent
1793
+ || (emitter->column == indent && !emitter->whitespace)) {
1794
+ if (!PUT_BREAK(emitter)) return 0;
1795
+ }
1796
+
1797
+ while (emitter->column < indent) {
1798
+ if (!PUT(emitter, ' ')) return 0;
1799
+ }
1800
+
1801
+ emitter->whitespace = 1;
1802
+ emitter->indention = 1;
1803
+
1804
+ return 1;
1805
+ }
1806
+
1807
+ static int
1808
+ yaml_emitter_write_indicator(yaml_emitter_t *emitter,
1809
+ const char *indicator, int need_whitespace,
1810
+ int is_whitespace, int is_indention)
1811
+ {
1812
+ size_t indicator_length;
1813
+ yaml_string_t string;
1814
+
1815
+ indicator_length = strlen(indicator);
1816
+ STRING_ASSIGN(string, (yaml_char_t *)indicator, indicator_length);
1817
+
1818
+ if (need_whitespace && !emitter->whitespace) {
1819
+ if (!PUT(emitter, ' ')) return 0;
1820
+ }
1821
+
1822
+ while (string.pointer != string.end) {
1823
+ if (!WRITE(emitter, string)) return 0;
1824
+ }
1825
+
1826
+ emitter->whitespace = is_whitespace;
1827
+ emitter->indention = (emitter->indention && is_indention);
1828
+
1829
+ return 1;
1830
+ }
1831
+
1832
+ static int
1833
+ yaml_emitter_write_anchor(yaml_emitter_t *emitter,
1834
+ yaml_char_t *value, size_t length)
1835
+ {
1836
+ yaml_string_t string;
1837
+ STRING_ASSIGN(string, value, length);
1838
+
1839
+ while (string.pointer != string.end) {
1840
+ if (!WRITE(emitter, string)) return 0;
1841
+ }
1842
+
1843
+ emitter->whitespace = 0;
1844
+ emitter->indention = 0;
1845
+
1846
+ return 1;
1847
+ }
1848
+
1849
+ static int
1850
+ yaml_emitter_write_tag_handle(yaml_emitter_t *emitter,
1851
+ yaml_char_t *value, size_t length)
1852
+ {
1853
+ yaml_string_t string;
1854
+ STRING_ASSIGN(string, value, length);
1855
+
1856
+ if (!emitter->whitespace) {
1857
+ if (!PUT(emitter, ' ')) return 0;
1858
+ }
1859
+
1860
+ while (string.pointer != string.end) {
1861
+ if (!WRITE(emitter, string)) return 0;
1862
+ }
1863
+
1864
+ emitter->whitespace = 0;
1865
+ emitter->indention = 0;
1866
+
1867
+ return 1;
1868
+ }
1869
+
1870
+ static int
1871
+ yaml_emitter_write_tag_content(yaml_emitter_t *emitter,
1872
+ yaml_char_t *value, size_t length,
1873
+ int need_whitespace)
1874
+ {
1875
+ yaml_string_t string;
1876
+ STRING_ASSIGN(string, value, length);
1877
+
1878
+ if (need_whitespace && !emitter->whitespace) {
1879
+ if (!PUT(emitter, ' ')) return 0;
1880
+ }
1881
+
1882
+ while (string.pointer != string.end) {
1883
+ if (IS_ALPHA(string)
1884
+ || CHECK(string, ';') || CHECK(string, '/')
1885
+ || CHECK(string, '?') || CHECK(string, ':')
1886
+ || CHECK(string, '@') || CHECK(string, '&')
1887
+ || CHECK(string, '=') || CHECK(string, '+')
1888
+ || CHECK(string, '$') || CHECK(string, ',')
1889
+ || CHECK(string, '_') || CHECK(string, '.')
1890
+ || CHECK(string, '~') || CHECK(string, '*')
1891
+ || CHECK(string, '\'') || CHECK(string, '(')
1892
+ || CHECK(string, ')') || CHECK(string, '[')
1893
+ || CHECK(string, ']')) {
1894
+ if (!WRITE(emitter, string)) return 0;
1895
+ }
1896
+ else {
1897
+ int width = WIDTH(string);
1898
+ unsigned int value;
1899
+ while (width --) {
1900
+ value = *(string.pointer++);
1901
+ if (!PUT(emitter, '%')) return 0;
1902
+ if (!PUT(emitter, (value >> 4)
1903
+ + ((value >> 4) < 10 ? '0' : 'A' - 10)))
1904
+ return 0;
1905
+ if (!PUT(emitter, (value & 0x0F)
1906
+ + ((value & 0x0F) < 10 ? '0' : 'A' - 10)))
1907
+ return 0;
1908
+ }
1909
+ }
1910
+ }
1911
+
1912
+ emitter->whitespace = 0;
1913
+ emitter->indention = 0;
1914
+
1915
+ return 1;
1916
+ }
1917
+
1918
+ static int
1919
+ yaml_emitter_write_plain_scalar(yaml_emitter_t *emitter,
1920
+ yaml_char_t *value, size_t length, int allow_breaks)
1921
+ {
1922
+ yaml_string_t string;
1923
+ int spaces = 0;
1924
+ int breaks = 0;
1925
+
1926
+ STRING_ASSIGN(string, value, length);
1927
+
1928
+ /**
1929
+ * Avoid trailing spaces for empty values in block mode.
1930
+ * In flow mode, we still want the space to prevent ambiguous things
1931
+ * like {a:}.
1932
+ * Currently, the emitter forbids any plain empty scalar in flow mode
1933
+ * (e.g. it outputs {a: ''} instead), so emitter->flow_level will
1934
+ * never be true here.
1935
+ * But if the emitter is ever changed to allow emitting empty values,
1936
+ * the check for flow_level is already here.
1937
+ */
1938
+ if (!emitter->whitespace && (length || emitter->flow_level)) {
1939
+ if (!PUT(emitter, ' ')) return 0;
1940
+ }
1941
+
1942
+ while (string.pointer != string.end)
1943
+ {
1944
+ if (IS_SPACE(string))
1945
+ {
1946
+ if (allow_breaks && !spaces
1947
+ && emitter->column > emitter->best_width
1948
+ && !IS_SPACE_AT(string, 1)) {
1949
+ if (!yaml_emitter_write_indent(emitter)) return 0;
1950
+ MOVE(string);
1951
+ }
1952
+ else {
1953
+ if (!WRITE(emitter, string)) return 0;
1954
+ }
1955
+ spaces = 1;
1956
+ }
1957
+ else if (IS_BREAK(string))
1958
+ {
1959
+ if (!breaks && CHECK(string, '\n')) {
1960
+ if (!PUT_BREAK(emitter)) return 0;
1961
+ }
1962
+ if (!WRITE_BREAK(emitter, string)) return 0;
1963
+ emitter->indention = 1;
1964
+ breaks = 1;
1965
+ }
1966
+ else
1967
+ {
1968
+ if (breaks) {
1969
+ if (!yaml_emitter_write_indent(emitter)) return 0;
1970
+ }
1971
+ if (!WRITE(emitter, string)) return 0;
1972
+ emitter->indention = 0;
1973
+ spaces = 0;
1974
+ breaks = 0;
1975
+ }
1976
+ }
1977
+
1978
+ emitter->whitespace = 0;
1979
+ emitter->indention = 0;
1980
+
1981
+ return 1;
1982
+ }
1983
+
1984
+ static int
1985
+ yaml_emitter_write_single_quoted_scalar(yaml_emitter_t *emitter,
1986
+ yaml_char_t *value, size_t length, int allow_breaks)
1987
+ {
1988
+ yaml_string_t string;
1989
+ int spaces = 0;
1990
+ int breaks = 0;
1991
+
1992
+ STRING_ASSIGN(string, value, length);
1993
+
1994
+ if (!yaml_emitter_write_indicator(emitter, "'", 1, 0, 0))
1995
+ return 0;
1996
+
1997
+ while (string.pointer != string.end)
1998
+ {
1999
+ if (IS_SPACE(string))
2000
+ {
2001
+ if (allow_breaks && !spaces
2002
+ && emitter->column > emitter->best_width
2003
+ && string.pointer != string.start
2004
+ && string.pointer != string.end - 1
2005
+ && !IS_SPACE_AT(string, 1)) {
2006
+ if (!yaml_emitter_write_indent(emitter)) return 0;
2007
+ MOVE(string);
2008
+ }
2009
+ else {
2010
+ if (!WRITE(emitter, string)) return 0;
2011
+ }
2012
+ spaces = 1;
2013
+ }
2014
+ else if (IS_BREAK(string))
2015
+ {
2016
+ if (!breaks && CHECK(string, '\n')) {
2017
+ if (!PUT_BREAK(emitter)) return 0;
2018
+ }
2019
+ if (!WRITE_BREAK(emitter, string)) return 0;
2020
+ emitter->indention = 1;
2021
+ breaks = 1;
2022
+ }
2023
+ else
2024
+ {
2025
+ if (breaks) {
2026
+ if (!yaml_emitter_write_indent(emitter)) return 0;
2027
+ }
2028
+ if (CHECK(string, '\'')) {
2029
+ if (!PUT(emitter, '\'')) return 0;
2030
+ }
2031
+ if (!WRITE(emitter, string)) return 0;
2032
+ emitter->indention = 0;
2033
+ spaces = 0;
2034
+ breaks = 0;
2035
+ }
2036
+ }
2037
+
2038
+ if (breaks)
2039
+ if (!yaml_emitter_write_indent(emitter)) return 0;
2040
+
2041
+ if (!yaml_emitter_write_indicator(emitter, "'", 0, 0, 0))
2042
+ return 0;
2043
+
2044
+ emitter->whitespace = 0;
2045
+ emitter->indention = 0;
2046
+
2047
+ return 1;
2048
+ }
2049
+
2050
+ static int
2051
+ yaml_emitter_write_double_quoted_scalar(yaml_emitter_t *emitter,
2052
+ yaml_char_t *value, size_t length, int allow_breaks)
2053
+ {
2054
+ yaml_string_t string;
2055
+ int spaces = 0;
2056
+
2057
+ STRING_ASSIGN(string, value, length);
2058
+
2059
+ if (!yaml_emitter_write_indicator(emitter, "\"", 1, 0, 0))
2060
+ return 0;
2061
+
2062
+ while (string.pointer != string.end)
2063
+ {
2064
+ if (!IS_PRINTABLE(string) || (!emitter->unicode && !IS_ASCII(string))
2065
+ || IS_BOM(string) || IS_BREAK(string)
2066
+ || CHECK(string, '"') || CHECK(string, '\\'))
2067
+ {
2068
+ unsigned char octet;
2069
+ unsigned int width;
2070
+ unsigned int value;
2071
+ int k;
2072
+
2073
+ octet = string.pointer[0];
2074
+ width = (octet & 0x80) == 0x00 ? 1 :
2075
+ (octet & 0xE0) == 0xC0 ? 2 :
2076
+ (octet & 0xF0) == 0xE0 ? 3 :
2077
+ (octet & 0xF8) == 0xF0 ? 4 : 0;
2078
+ value = (octet & 0x80) == 0x00 ? octet & 0x7F :
2079
+ (octet & 0xE0) == 0xC0 ? octet & 0x1F :
2080
+ (octet & 0xF0) == 0xE0 ? octet & 0x0F :
2081
+ (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
2082
+ for (k = 1; k < (int)width; k ++) {
2083
+ octet = string.pointer[k];
2084
+ value = (value << 6) + (octet & 0x3F);
2085
+ }
2086
+ string.pointer += width;
2087
+
2088
+ if (!PUT(emitter, '\\')) return 0;
2089
+
2090
+ switch (value)
2091
+ {
2092
+ case 0x00:
2093
+ if (!PUT(emitter, '0')) return 0;
2094
+ break;
2095
+
2096
+ case 0x07:
2097
+ if (!PUT(emitter, 'a')) return 0;
2098
+ break;
2099
+
2100
+ case 0x08:
2101
+ if (!PUT(emitter, 'b')) return 0;
2102
+ break;
2103
+
2104
+ case 0x09:
2105
+ if (!PUT(emitter, 't')) return 0;
2106
+ break;
2107
+
2108
+ case 0x0A:
2109
+ if (!PUT(emitter, 'n')) return 0;
2110
+ break;
2111
+
2112
+ case 0x0B:
2113
+ if (!PUT(emitter, 'v')) return 0;
2114
+ break;
2115
+
2116
+ case 0x0C:
2117
+ if (!PUT(emitter, 'f')) return 0;
2118
+ break;
2119
+
2120
+ case 0x0D:
2121
+ if (!PUT(emitter, 'r')) return 0;
2122
+ break;
2123
+
2124
+ case 0x1B:
2125
+ if (!PUT(emitter, 'e')) return 0;
2126
+ break;
2127
+
2128
+ case 0x22:
2129
+ if (!PUT(emitter, '\"')) return 0;
2130
+ break;
2131
+
2132
+ case 0x5C:
2133
+ if (!PUT(emitter, '\\')) return 0;
2134
+ break;
2135
+
2136
+ case 0x85:
2137
+ if (!PUT(emitter, 'N')) return 0;
2138
+ break;
2139
+
2140
+ case 0xA0:
2141
+ if (!PUT(emitter, '_')) return 0;
2142
+ break;
2143
+
2144
+ case 0x2028:
2145
+ if (!PUT(emitter, 'L')) return 0;
2146
+ break;
2147
+
2148
+ case 0x2029:
2149
+ if (!PUT(emitter, 'P')) return 0;
2150
+ break;
2151
+
2152
+ default:
2153
+ if (value <= 0xFF) {
2154
+ if (!PUT(emitter, 'x')) return 0;
2155
+ width = 2;
2156
+ }
2157
+ else if (value <= 0xFFFF) {
2158
+ if (!PUT(emitter, 'u')) return 0;
2159
+ width = 4;
2160
+ }
2161
+ else {
2162
+ if (!PUT(emitter, 'U')) return 0;
2163
+ width = 8;
2164
+ }
2165
+ for (k = (width-1)*4; k >= 0; k -= 4) {
2166
+ int digit = (value >> k) & 0x0F;
2167
+ if (!PUT(emitter, digit + (digit < 10 ? '0' : 'A'-10)))
2168
+ return 0;
2169
+ }
2170
+ }
2171
+ spaces = 0;
2172
+ }
2173
+ else if (IS_SPACE(string))
2174
+ {
2175
+ if (allow_breaks && !spaces
2176
+ && emitter->column > emitter->best_width
2177
+ && string.pointer != string.start
2178
+ && string.pointer != string.end - 1) {
2179
+ if (!yaml_emitter_write_indent(emitter)) return 0;
2180
+ if (IS_SPACE_AT(string, 1)) {
2181
+ if (!PUT(emitter, '\\')) return 0;
2182
+ }
2183
+ MOVE(string);
2184
+ }
2185
+ else {
2186
+ if (!WRITE(emitter, string)) return 0;
2187
+ }
2188
+ spaces = 1;
2189
+ }
2190
+ else
2191
+ {
2192
+ if (!WRITE(emitter, string)) return 0;
2193
+ spaces = 0;
2194
+ }
2195
+ }
2196
+
2197
+ if (!yaml_emitter_write_indicator(emitter, "\"", 0, 0, 0))
2198
+ return 0;
2199
+
2200
+ emitter->whitespace = 0;
2201
+ emitter->indention = 0;
2202
+
2203
+ return 1;
2204
+ }
2205
+
2206
+ static int
2207
+ yaml_emitter_write_block_scalar_hints(yaml_emitter_t *emitter,
2208
+ yaml_string_t string)
2209
+ {
2210
+ char indent_hint[2];
2211
+ const char *chomp_hint = NULL;
2212
+
2213
+ if (IS_SPACE(string) || IS_BREAK(string))
2214
+ {
2215
+ indent_hint[0] = '0' + (char)emitter->best_indent;
2216
+ indent_hint[1] = '\0';
2217
+ if (!yaml_emitter_write_indicator(emitter, indent_hint, 0, 0, 0))
2218
+ return 0;
2219
+ }
2220
+
2221
+ emitter->open_ended = 0;
2222
+
2223
+ string.pointer = string.end;
2224
+ if (string.start == string.pointer)
2225
+ {
2226
+ chomp_hint = "-";
2227
+ }
2228
+ else
2229
+ {
2230
+ do {
2231
+ string.pointer --;
2232
+ } while ((*string.pointer & 0xC0) == 0x80);
2233
+ if (!IS_BREAK(string))
2234
+ {
2235
+ chomp_hint = "-";
2236
+ }
2237
+ else if (string.start == string.pointer)
2238
+ {
2239
+ chomp_hint = "+";
2240
+ emitter->open_ended = 2;
2241
+ }
2242
+ else
2243
+ {
2244
+ do {
2245
+ string.pointer --;
2246
+ } while ((*string.pointer & 0xC0) == 0x80);
2247
+ if (IS_BREAK(string))
2248
+ {
2249
+ chomp_hint = "+";
2250
+ emitter->open_ended = 2;
2251
+ }
2252
+ }
2253
+ }
2254
+
2255
+ if (chomp_hint)
2256
+ {
2257
+ if (!yaml_emitter_write_indicator(emitter, chomp_hint, 0, 0, 0))
2258
+ return 0;
2259
+ }
2260
+
2261
+ return 1;
2262
+ }
2263
+
2264
+ static int
2265
+ yaml_emitter_write_literal_scalar(yaml_emitter_t *emitter,
2266
+ yaml_char_t *value, size_t length)
2267
+ {
2268
+ yaml_string_t string;
2269
+ int breaks = 1;
2270
+
2271
+ STRING_ASSIGN(string, value, length);
2272
+
2273
+ if (!yaml_emitter_write_indicator(emitter, "|", 1, 0, 0))
2274
+ return 0;
2275
+ if (!yaml_emitter_write_block_scalar_hints(emitter, string))
2276
+ return 0;
2277
+ if (!PUT_BREAK(emitter)) return 0;
2278
+ emitter->indention = 1;
2279
+ emitter->whitespace = 1;
2280
+
2281
+ while (string.pointer != string.end)
2282
+ {
2283
+ if (IS_BREAK(string))
2284
+ {
2285
+ if (!WRITE_BREAK(emitter, string)) return 0;
2286
+ emitter->indention = 1;
2287
+ breaks = 1;
2288
+ }
2289
+ else
2290
+ {
2291
+ if (breaks) {
2292
+ if (!yaml_emitter_write_indent(emitter)) return 0;
2293
+ }
2294
+ if (!WRITE(emitter, string)) return 0;
2295
+ emitter->indention = 0;
2296
+ breaks = 0;
2297
+ }
2298
+ }
2299
+
2300
+ return 1;
2301
+ }
2302
+
2303
+ static int
2304
+ yaml_emitter_write_folded_scalar(yaml_emitter_t *emitter,
2305
+ yaml_char_t *value, size_t length)
2306
+ {
2307
+ yaml_string_t string;
2308
+ int breaks = 1;
2309
+ int leading_spaces = 1;
2310
+
2311
+ STRING_ASSIGN(string, value, length);
2312
+
2313
+ if (!yaml_emitter_write_indicator(emitter, ">", 1, 0, 0))
2314
+ return 0;
2315
+ if (!yaml_emitter_write_block_scalar_hints(emitter, string))
2316
+ return 0;
2317
+ if (!PUT_BREAK(emitter)) return 0;
2318
+ emitter->indention = 1;
2319
+ emitter->whitespace = 1;
2320
+
2321
+ while (string.pointer != string.end)
2322
+ {
2323
+ if (IS_BREAK(string))
2324
+ {
2325
+ if (!breaks && !leading_spaces && CHECK(string, '\n')) {
2326
+ int k = 0;
2327
+ while (IS_BREAK_AT(string, k)) {
2328
+ k += WIDTH_AT(string, k);
2329
+ }
2330
+ if (!IS_BLANKZ_AT(string, k)) {
2331
+ if (!PUT_BREAK(emitter)) return 0;
2332
+ }
2333
+ }
2334
+ if (!WRITE_BREAK(emitter, string)) return 0;
2335
+ emitter->indention = 1;
2336
+ breaks = 1;
2337
+ }
2338
+ else
2339
+ {
2340
+ if (breaks) {
2341
+ if (!yaml_emitter_write_indent(emitter)) return 0;
2342
+ leading_spaces = IS_BLANK(string);
2343
+ }
2344
+ if (!breaks && IS_SPACE(string) && !IS_SPACE_AT(string, 1)
2345
+ && emitter->column > emitter->best_width) {
2346
+ if (!yaml_emitter_write_indent(emitter)) return 0;
2347
+ MOVE(string);
2348
+ }
2349
+ else {
2350
+ if (!WRITE(emitter, string)) return 0;
2351
+ }
2352
+ emitter->indention = 0;
2353
+ breaks = 0;
2354
+ }
2355
+ }
2356
+
2357
+ return 1;
2358
+ }