nutcracker 0.3.0.12 → 0.4.0.13

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