1*0f5c86ddSBaptiste Daroussin
2*0f5c86ddSBaptiste Daroussin #include "yaml_private.h"
3*0f5c86ddSBaptiste Daroussin
4*0f5c86ddSBaptiste Daroussin /*
5*0f5c86ddSBaptiste Daroussin * API functions.
6*0f5c86ddSBaptiste Daroussin */
7*0f5c86ddSBaptiste Daroussin
8*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
9*0f5c86ddSBaptiste Daroussin yaml_emitter_open(yaml_emitter_t *emitter);
10*0f5c86ddSBaptiste Daroussin
11*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
12*0f5c86ddSBaptiste Daroussin yaml_emitter_close(yaml_emitter_t *emitter);
13*0f5c86ddSBaptiste Daroussin
14*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
15*0f5c86ddSBaptiste Daroussin yaml_emitter_dump(yaml_emitter_t *emitter, yaml_document_t *document);
16*0f5c86ddSBaptiste Daroussin
17*0f5c86ddSBaptiste Daroussin /*
18*0f5c86ddSBaptiste Daroussin * Clean up functions.
19*0f5c86ddSBaptiste Daroussin */
20*0f5c86ddSBaptiste Daroussin
21*0f5c86ddSBaptiste Daroussin static void
22*0f5c86ddSBaptiste Daroussin yaml_emitter_delete_document_and_anchors(yaml_emitter_t *emitter);
23*0f5c86ddSBaptiste Daroussin
24*0f5c86ddSBaptiste Daroussin /*
25*0f5c86ddSBaptiste Daroussin * Anchor functions.
26*0f5c86ddSBaptiste Daroussin */
27*0f5c86ddSBaptiste Daroussin
28*0f5c86ddSBaptiste Daroussin static void
29*0f5c86ddSBaptiste Daroussin yaml_emitter_anchor_node(yaml_emitter_t *emitter, int index);
30*0f5c86ddSBaptiste Daroussin
31*0f5c86ddSBaptiste Daroussin static yaml_char_t *
32*0f5c86ddSBaptiste Daroussin yaml_emitter_generate_anchor(yaml_emitter_t *emitter, int anchor_id);
33*0f5c86ddSBaptiste Daroussin
34*0f5c86ddSBaptiste Daroussin
35*0f5c86ddSBaptiste Daroussin /*
36*0f5c86ddSBaptiste Daroussin * Serialize functions.
37*0f5c86ddSBaptiste Daroussin */
38*0f5c86ddSBaptiste Daroussin
39*0f5c86ddSBaptiste Daroussin static int
40*0f5c86ddSBaptiste Daroussin yaml_emitter_dump_node(yaml_emitter_t *emitter, int index);
41*0f5c86ddSBaptiste Daroussin
42*0f5c86ddSBaptiste Daroussin static int
43*0f5c86ddSBaptiste Daroussin yaml_emitter_dump_alias(yaml_emitter_t *emitter, yaml_char_t *anchor);
44*0f5c86ddSBaptiste Daroussin
45*0f5c86ddSBaptiste Daroussin static int
46*0f5c86ddSBaptiste Daroussin yaml_emitter_dump_scalar(yaml_emitter_t *emitter, yaml_node_t *node,
47*0f5c86ddSBaptiste Daroussin yaml_char_t *anchor);
48*0f5c86ddSBaptiste Daroussin
49*0f5c86ddSBaptiste Daroussin static int
50*0f5c86ddSBaptiste Daroussin yaml_emitter_dump_sequence(yaml_emitter_t *emitter, yaml_node_t *node,
51*0f5c86ddSBaptiste Daroussin yaml_char_t *anchor);
52*0f5c86ddSBaptiste Daroussin
53*0f5c86ddSBaptiste Daroussin static int
54*0f5c86ddSBaptiste Daroussin yaml_emitter_dump_mapping(yaml_emitter_t *emitter, yaml_node_t *node,
55*0f5c86ddSBaptiste Daroussin yaml_char_t *anchor);
56*0f5c86ddSBaptiste Daroussin
57*0f5c86ddSBaptiste Daroussin /*
58*0f5c86ddSBaptiste Daroussin * Issue a STREAM-START event.
59*0f5c86ddSBaptiste Daroussin */
60*0f5c86ddSBaptiste Daroussin
61*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_emitter_open(yaml_emitter_t * emitter)62*0f5c86ddSBaptiste Daroussin yaml_emitter_open(yaml_emitter_t *emitter)
63*0f5c86ddSBaptiste Daroussin {
64*0f5c86ddSBaptiste Daroussin yaml_event_t event;
65*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
66*0f5c86ddSBaptiste Daroussin
67*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object is required. */
68*0f5c86ddSBaptiste Daroussin assert(!emitter->opened); /* Emitter should not be opened yet. */
69*0f5c86ddSBaptiste Daroussin
70*0f5c86ddSBaptiste Daroussin STREAM_START_EVENT_INIT(event, YAML_ANY_ENCODING, mark, mark);
71*0f5c86ddSBaptiste Daroussin
72*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_emit(emitter, &event)) {
73*0f5c86ddSBaptiste Daroussin return 0;
74*0f5c86ddSBaptiste Daroussin }
75*0f5c86ddSBaptiste Daroussin
76*0f5c86ddSBaptiste Daroussin emitter->opened = 1;
77*0f5c86ddSBaptiste Daroussin
78*0f5c86ddSBaptiste Daroussin return 1;
79*0f5c86ddSBaptiste Daroussin }
80*0f5c86ddSBaptiste Daroussin
81*0f5c86ddSBaptiste Daroussin /*
82*0f5c86ddSBaptiste Daroussin * Issue a STREAM-END event.
83*0f5c86ddSBaptiste Daroussin */
84*0f5c86ddSBaptiste Daroussin
85*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_emitter_close(yaml_emitter_t * emitter)86*0f5c86ddSBaptiste Daroussin yaml_emitter_close(yaml_emitter_t *emitter)
87*0f5c86ddSBaptiste Daroussin {
88*0f5c86ddSBaptiste Daroussin yaml_event_t event;
89*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
90*0f5c86ddSBaptiste Daroussin
91*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object is required. */
92*0f5c86ddSBaptiste Daroussin assert(emitter->opened); /* Emitter should be opened. */
93*0f5c86ddSBaptiste Daroussin
94*0f5c86ddSBaptiste Daroussin if (emitter->closed) return 1;
95*0f5c86ddSBaptiste Daroussin
96*0f5c86ddSBaptiste Daroussin STREAM_END_EVENT_INIT(event, mark, mark);
97*0f5c86ddSBaptiste Daroussin
98*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_emit(emitter, &event)) {
99*0f5c86ddSBaptiste Daroussin return 0;
100*0f5c86ddSBaptiste Daroussin }
101*0f5c86ddSBaptiste Daroussin
102*0f5c86ddSBaptiste Daroussin emitter->closed = 1;
103*0f5c86ddSBaptiste Daroussin
104*0f5c86ddSBaptiste Daroussin return 1;
105*0f5c86ddSBaptiste Daroussin }
106*0f5c86ddSBaptiste Daroussin
107*0f5c86ddSBaptiste Daroussin /*
108*0f5c86ddSBaptiste Daroussin * Dump a YAML document.
109*0f5c86ddSBaptiste Daroussin */
110*0f5c86ddSBaptiste Daroussin
111*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_emitter_dump(yaml_emitter_t * emitter,yaml_document_t * document)112*0f5c86ddSBaptiste Daroussin yaml_emitter_dump(yaml_emitter_t *emitter, yaml_document_t *document)
113*0f5c86ddSBaptiste Daroussin {
114*0f5c86ddSBaptiste Daroussin yaml_event_t event;
115*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
116*0f5c86ddSBaptiste Daroussin
117*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object is required. */
118*0f5c86ddSBaptiste Daroussin assert(document); /* Non-NULL emitter object is expected. */
119*0f5c86ddSBaptiste Daroussin
120*0f5c86ddSBaptiste Daroussin emitter->document = document;
121*0f5c86ddSBaptiste Daroussin
122*0f5c86ddSBaptiste Daroussin if (!emitter->opened) {
123*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_open(emitter)) goto error;
124*0f5c86ddSBaptiste Daroussin }
125*0f5c86ddSBaptiste Daroussin
126*0f5c86ddSBaptiste Daroussin if (STACK_EMPTY(emitter, document->nodes)) {
127*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_close(emitter)) goto error;
128*0f5c86ddSBaptiste Daroussin yaml_emitter_delete_document_and_anchors(emitter);
129*0f5c86ddSBaptiste Daroussin return 1;
130*0f5c86ddSBaptiste Daroussin }
131*0f5c86ddSBaptiste Daroussin
132*0f5c86ddSBaptiste Daroussin assert(emitter->opened); /* Emitter should be opened. */
133*0f5c86ddSBaptiste Daroussin
134*0f5c86ddSBaptiste Daroussin emitter->anchors = (yaml_anchors_t*)yaml_malloc(sizeof(*(emitter->anchors))
135*0f5c86ddSBaptiste Daroussin * (document->nodes.top - document->nodes.start));
136*0f5c86ddSBaptiste Daroussin if (!emitter->anchors) goto error;
137*0f5c86ddSBaptiste Daroussin memset(emitter->anchors, 0, sizeof(*(emitter->anchors))
138*0f5c86ddSBaptiste Daroussin * (document->nodes.top - document->nodes.start));
139*0f5c86ddSBaptiste Daroussin
140*0f5c86ddSBaptiste Daroussin DOCUMENT_START_EVENT_INIT(event, document->version_directive,
141*0f5c86ddSBaptiste Daroussin document->tag_directives.start, document->tag_directives.end,
142*0f5c86ddSBaptiste Daroussin document->start_implicit, mark, mark);
143*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_emit(emitter, &event)) goto error;
144*0f5c86ddSBaptiste Daroussin
145*0f5c86ddSBaptiste Daroussin yaml_emitter_anchor_node(emitter, 1);
146*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_dump_node(emitter, 1)) goto error;
147*0f5c86ddSBaptiste Daroussin
148*0f5c86ddSBaptiste Daroussin DOCUMENT_END_EVENT_INIT(event, document->end_implicit, mark, mark);
149*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_emit(emitter, &event)) goto error;
150*0f5c86ddSBaptiste Daroussin
151*0f5c86ddSBaptiste Daroussin yaml_emitter_delete_document_and_anchors(emitter);
152*0f5c86ddSBaptiste Daroussin
153*0f5c86ddSBaptiste Daroussin return 1;
154*0f5c86ddSBaptiste Daroussin
155*0f5c86ddSBaptiste Daroussin error:
156*0f5c86ddSBaptiste Daroussin
157*0f5c86ddSBaptiste Daroussin yaml_emitter_delete_document_and_anchors(emitter);
158*0f5c86ddSBaptiste Daroussin
159*0f5c86ddSBaptiste Daroussin return 0;
160*0f5c86ddSBaptiste Daroussin }
161*0f5c86ddSBaptiste Daroussin
162*0f5c86ddSBaptiste Daroussin /*
163*0f5c86ddSBaptiste Daroussin * Clean up the emitter object after a document is dumped.
164*0f5c86ddSBaptiste Daroussin */
165*0f5c86ddSBaptiste Daroussin
166*0f5c86ddSBaptiste Daroussin static void
yaml_emitter_delete_document_and_anchors(yaml_emitter_t * emitter)167*0f5c86ddSBaptiste Daroussin yaml_emitter_delete_document_and_anchors(yaml_emitter_t *emitter)
168*0f5c86ddSBaptiste Daroussin {
169*0f5c86ddSBaptiste Daroussin int index;
170*0f5c86ddSBaptiste Daroussin
171*0f5c86ddSBaptiste Daroussin if (!emitter->anchors) {
172*0f5c86ddSBaptiste Daroussin yaml_document_delete(emitter->document);
173*0f5c86ddSBaptiste Daroussin emitter->document = NULL;
174*0f5c86ddSBaptiste Daroussin return;
175*0f5c86ddSBaptiste Daroussin }
176*0f5c86ddSBaptiste Daroussin
177*0f5c86ddSBaptiste Daroussin for (index = 0; emitter->document->nodes.start + index
178*0f5c86ddSBaptiste Daroussin < emitter->document->nodes.top; index ++) {
179*0f5c86ddSBaptiste Daroussin yaml_node_t node = emitter->document->nodes.start[index];
180*0f5c86ddSBaptiste Daroussin if (!emitter->anchors[index].serialized) {
181*0f5c86ddSBaptiste Daroussin yaml_free(node.tag);
182*0f5c86ddSBaptiste Daroussin if (node.type == YAML_SCALAR_NODE) {
183*0f5c86ddSBaptiste Daroussin yaml_free(node.data.scalar.value);
184*0f5c86ddSBaptiste Daroussin }
185*0f5c86ddSBaptiste Daroussin }
186*0f5c86ddSBaptiste Daroussin if (node.type == YAML_SEQUENCE_NODE) {
187*0f5c86ddSBaptiste Daroussin STACK_DEL(emitter, node.data.sequence.items);
188*0f5c86ddSBaptiste Daroussin }
189*0f5c86ddSBaptiste Daroussin if (node.type == YAML_MAPPING_NODE) {
190*0f5c86ddSBaptiste Daroussin STACK_DEL(emitter, node.data.mapping.pairs);
191*0f5c86ddSBaptiste Daroussin }
192*0f5c86ddSBaptiste Daroussin }
193*0f5c86ddSBaptiste Daroussin
194*0f5c86ddSBaptiste Daroussin STACK_DEL(emitter, emitter->document->nodes);
195*0f5c86ddSBaptiste Daroussin yaml_free(emitter->anchors);
196*0f5c86ddSBaptiste Daroussin
197*0f5c86ddSBaptiste Daroussin emitter->anchors = NULL;
198*0f5c86ddSBaptiste Daroussin emitter->last_anchor_id = 0;
199*0f5c86ddSBaptiste Daroussin emitter->document = NULL;
200*0f5c86ddSBaptiste Daroussin }
201*0f5c86ddSBaptiste Daroussin
202*0f5c86ddSBaptiste Daroussin /*
203*0f5c86ddSBaptiste Daroussin * Check the references of a node and assign the anchor id if needed.
204*0f5c86ddSBaptiste Daroussin */
205*0f5c86ddSBaptiste Daroussin
206*0f5c86ddSBaptiste Daroussin static void
yaml_emitter_anchor_node(yaml_emitter_t * emitter,int index)207*0f5c86ddSBaptiste Daroussin yaml_emitter_anchor_node(yaml_emitter_t *emitter, int index)
208*0f5c86ddSBaptiste Daroussin {
209*0f5c86ddSBaptiste Daroussin yaml_node_t *node = emitter->document->nodes.start + index - 1;
210*0f5c86ddSBaptiste Daroussin yaml_node_item_t *item;
211*0f5c86ddSBaptiste Daroussin yaml_node_pair_t *pair;
212*0f5c86ddSBaptiste Daroussin
213*0f5c86ddSBaptiste Daroussin emitter->anchors[index-1].references ++;
214*0f5c86ddSBaptiste Daroussin
215*0f5c86ddSBaptiste Daroussin if (emitter->anchors[index-1].references == 1) {
216*0f5c86ddSBaptiste Daroussin switch (node->type) {
217*0f5c86ddSBaptiste Daroussin case YAML_SEQUENCE_NODE:
218*0f5c86ddSBaptiste Daroussin for (item = node->data.sequence.items.start;
219*0f5c86ddSBaptiste Daroussin item < node->data.sequence.items.top; item ++) {
220*0f5c86ddSBaptiste Daroussin yaml_emitter_anchor_node(emitter, *item);
221*0f5c86ddSBaptiste Daroussin }
222*0f5c86ddSBaptiste Daroussin break;
223*0f5c86ddSBaptiste Daroussin case YAML_MAPPING_NODE:
224*0f5c86ddSBaptiste Daroussin for (pair = node->data.mapping.pairs.start;
225*0f5c86ddSBaptiste Daroussin pair < node->data.mapping.pairs.top; pair ++) {
226*0f5c86ddSBaptiste Daroussin yaml_emitter_anchor_node(emitter, pair->key);
227*0f5c86ddSBaptiste Daroussin yaml_emitter_anchor_node(emitter, pair->value);
228*0f5c86ddSBaptiste Daroussin }
229*0f5c86ddSBaptiste Daroussin break;
230*0f5c86ddSBaptiste Daroussin default:
231*0f5c86ddSBaptiste Daroussin break;
232*0f5c86ddSBaptiste Daroussin }
233*0f5c86ddSBaptiste Daroussin }
234*0f5c86ddSBaptiste Daroussin
235*0f5c86ddSBaptiste Daroussin else if (emitter->anchors[index-1].references == 2) {
236*0f5c86ddSBaptiste Daroussin emitter->anchors[index-1].anchor = (++ emitter->last_anchor_id);
237*0f5c86ddSBaptiste Daroussin }
238*0f5c86ddSBaptiste Daroussin }
239*0f5c86ddSBaptiste Daroussin
240*0f5c86ddSBaptiste Daroussin /*
241*0f5c86ddSBaptiste Daroussin * Generate a textual representation for an anchor.
242*0f5c86ddSBaptiste Daroussin */
243*0f5c86ddSBaptiste Daroussin
244*0f5c86ddSBaptiste Daroussin #define ANCHOR_TEMPLATE "id%03d"
245*0f5c86ddSBaptiste Daroussin #define ANCHOR_TEMPLATE_LENGTH 16
246*0f5c86ddSBaptiste Daroussin
247*0f5c86ddSBaptiste Daroussin static yaml_char_t *
yaml_emitter_generate_anchor(SHIM (yaml_emitter_t * emitter),int anchor_id)248*0f5c86ddSBaptiste Daroussin yaml_emitter_generate_anchor(SHIM(yaml_emitter_t *emitter), int anchor_id)
249*0f5c86ddSBaptiste Daroussin {
250*0f5c86ddSBaptiste Daroussin yaml_char_t *anchor = YAML_MALLOC(ANCHOR_TEMPLATE_LENGTH);
251*0f5c86ddSBaptiste Daroussin
252*0f5c86ddSBaptiste Daroussin if (!anchor) return NULL;
253*0f5c86ddSBaptiste Daroussin
254*0f5c86ddSBaptiste Daroussin sprintf((char *)anchor, ANCHOR_TEMPLATE, anchor_id);
255*0f5c86ddSBaptiste Daroussin
256*0f5c86ddSBaptiste Daroussin return anchor;
257*0f5c86ddSBaptiste Daroussin }
258*0f5c86ddSBaptiste Daroussin
259*0f5c86ddSBaptiste Daroussin /*
260*0f5c86ddSBaptiste Daroussin * Serialize a node.
261*0f5c86ddSBaptiste Daroussin */
262*0f5c86ddSBaptiste Daroussin
263*0f5c86ddSBaptiste Daroussin static int
yaml_emitter_dump_node(yaml_emitter_t * emitter,int index)264*0f5c86ddSBaptiste Daroussin yaml_emitter_dump_node(yaml_emitter_t *emitter, int index)
265*0f5c86ddSBaptiste Daroussin {
266*0f5c86ddSBaptiste Daroussin yaml_node_t *node = emitter->document->nodes.start + index - 1;
267*0f5c86ddSBaptiste Daroussin int anchor_id = emitter->anchors[index-1].anchor;
268*0f5c86ddSBaptiste Daroussin yaml_char_t *anchor = NULL;
269*0f5c86ddSBaptiste Daroussin
270*0f5c86ddSBaptiste Daroussin if (anchor_id) {
271*0f5c86ddSBaptiste Daroussin anchor = yaml_emitter_generate_anchor(emitter, anchor_id);
272*0f5c86ddSBaptiste Daroussin if (!anchor) return 0;
273*0f5c86ddSBaptiste Daroussin }
274*0f5c86ddSBaptiste Daroussin
275*0f5c86ddSBaptiste Daroussin if (emitter->anchors[index-1].serialized) {
276*0f5c86ddSBaptiste Daroussin return yaml_emitter_dump_alias(emitter, anchor);
277*0f5c86ddSBaptiste Daroussin }
278*0f5c86ddSBaptiste Daroussin
279*0f5c86ddSBaptiste Daroussin emitter->anchors[index-1].serialized = 1;
280*0f5c86ddSBaptiste Daroussin
281*0f5c86ddSBaptiste Daroussin switch (node->type) {
282*0f5c86ddSBaptiste Daroussin case YAML_SCALAR_NODE:
283*0f5c86ddSBaptiste Daroussin return yaml_emitter_dump_scalar(emitter, node, anchor);
284*0f5c86ddSBaptiste Daroussin case YAML_SEQUENCE_NODE:
285*0f5c86ddSBaptiste Daroussin return yaml_emitter_dump_sequence(emitter, node, anchor);
286*0f5c86ddSBaptiste Daroussin case YAML_MAPPING_NODE:
287*0f5c86ddSBaptiste Daroussin return yaml_emitter_dump_mapping(emitter, node, anchor);
288*0f5c86ddSBaptiste Daroussin default:
289*0f5c86ddSBaptiste Daroussin assert(0); /* Could not happen. */
290*0f5c86ddSBaptiste Daroussin break;
291*0f5c86ddSBaptiste Daroussin }
292*0f5c86ddSBaptiste Daroussin
293*0f5c86ddSBaptiste Daroussin return 0; /* Could not happen. */
294*0f5c86ddSBaptiste Daroussin }
295*0f5c86ddSBaptiste Daroussin
296*0f5c86ddSBaptiste Daroussin /*
297*0f5c86ddSBaptiste Daroussin * Serialize an alias.
298*0f5c86ddSBaptiste Daroussin */
299*0f5c86ddSBaptiste Daroussin
300*0f5c86ddSBaptiste Daroussin static int
yaml_emitter_dump_alias(yaml_emitter_t * emitter,yaml_char_t * anchor)301*0f5c86ddSBaptiste Daroussin yaml_emitter_dump_alias(yaml_emitter_t *emitter, yaml_char_t *anchor)
302*0f5c86ddSBaptiste Daroussin {
303*0f5c86ddSBaptiste Daroussin yaml_event_t event;
304*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
305*0f5c86ddSBaptiste Daroussin
306*0f5c86ddSBaptiste Daroussin ALIAS_EVENT_INIT(event, anchor, mark, mark);
307*0f5c86ddSBaptiste Daroussin
308*0f5c86ddSBaptiste Daroussin return yaml_emitter_emit(emitter, &event);
309*0f5c86ddSBaptiste Daroussin }
310*0f5c86ddSBaptiste Daroussin
311*0f5c86ddSBaptiste Daroussin /*
312*0f5c86ddSBaptiste Daroussin * Serialize a scalar.
313*0f5c86ddSBaptiste Daroussin */
314*0f5c86ddSBaptiste Daroussin
315*0f5c86ddSBaptiste Daroussin static int
yaml_emitter_dump_scalar(yaml_emitter_t * emitter,yaml_node_t * node,yaml_char_t * anchor)316*0f5c86ddSBaptiste Daroussin yaml_emitter_dump_scalar(yaml_emitter_t *emitter, yaml_node_t *node,
317*0f5c86ddSBaptiste Daroussin yaml_char_t *anchor)
318*0f5c86ddSBaptiste Daroussin {
319*0f5c86ddSBaptiste Daroussin yaml_event_t event;
320*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
321*0f5c86ddSBaptiste Daroussin
322*0f5c86ddSBaptiste Daroussin int plain_implicit = (strcmp((char *)node->tag,
323*0f5c86ddSBaptiste Daroussin YAML_DEFAULT_SCALAR_TAG) == 0);
324*0f5c86ddSBaptiste Daroussin int quoted_implicit = (strcmp((char *)node->tag,
325*0f5c86ddSBaptiste Daroussin YAML_DEFAULT_SCALAR_TAG) == 0);
326*0f5c86ddSBaptiste Daroussin
327*0f5c86ddSBaptiste Daroussin SCALAR_EVENT_INIT(event, anchor, node->tag, node->data.scalar.value,
328*0f5c86ddSBaptiste Daroussin node->data.scalar.length, plain_implicit, quoted_implicit,
329*0f5c86ddSBaptiste Daroussin node->data.scalar.style, mark, mark);
330*0f5c86ddSBaptiste Daroussin
331*0f5c86ddSBaptiste Daroussin return yaml_emitter_emit(emitter, &event);
332*0f5c86ddSBaptiste Daroussin }
333*0f5c86ddSBaptiste Daroussin
334*0f5c86ddSBaptiste Daroussin /*
335*0f5c86ddSBaptiste Daroussin * Serialize a sequence.
336*0f5c86ddSBaptiste Daroussin */
337*0f5c86ddSBaptiste Daroussin
338*0f5c86ddSBaptiste Daroussin static int
yaml_emitter_dump_sequence(yaml_emitter_t * emitter,yaml_node_t * node,yaml_char_t * anchor)339*0f5c86ddSBaptiste Daroussin yaml_emitter_dump_sequence(yaml_emitter_t *emitter, yaml_node_t *node,
340*0f5c86ddSBaptiste Daroussin yaml_char_t *anchor)
341*0f5c86ddSBaptiste Daroussin {
342*0f5c86ddSBaptiste Daroussin yaml_event_t event;
343*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
344*0f5c86ddSBaptiste Daroussin
345*0f5c86ddSBaptiste Daroussin int implicit = (strcmp((char *)node->tag, YAML_DEFAULT_SEQUENCE_TAG) == 0);
346*0f5c86ddSBaptiste Daroussin
347*0f5c86ddSBaptiste Daroussin yaml_node_item_t *item;
348*0f5c86ddSBaptiste Daroussin
349*0f5c86ddSBaptiste Daroussin SEQUENCE_START_EVENT_INIT(event, anchor, node->tag, implicit,
350*0f5c86ddSBaptiste Daroussin node->data.sequence.style, mark, mark);
351*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_emit(emitter, &event)) return 0;
352*0f5c86ddSBaptiste Daroussin
353*0f5c86ddSBaptiste Daroussin for (item = node->data.sequence.items.start;
354*0f5c86ddSBaptiste Daroussin item < node->data.sequence.items.top; item ++) {
355*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_dump_node(emitter, *item)) return 0;
356*0f5c86ddSBaptiste Daroussin }
357*0f5c86ddSBaptiste Daroussin
358*0f5c86ddSBaptiste Daroussin SEQUENCE_END_EVENT_INIT(event, mark, mark);
359*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_emit(emitter, &event)) return 0;
360*0f5c86ddSBaptiste Daroussin
361*0f5c86ddSBaptiste Daroussin return 1;
362*0f5c86ddSBaptiste Daroussin }
363*0f5c86ddSBaptiste Daroussin
364*0f5c86ddSBaptiste Daroussin /*
365*0f5c86ddSBaptiste Daroussin * Serialize a mapping.
366*0f5c86ddSBaptiste Daroussin */
367*0f5c86ddSBaptiste Daroussin
368*0f5c86ddSBaptiste Daroussin static int
yaml_emitter_dump_mapping(yaml_emitter_t * emitter,yaml_node_t * node,yaml_char_t * anchor)369*0f5c86ddSBaptiste Daroussin yaml_emitter_dump_mapping(yaml_emitter_t *emitter, yaml_node_t *node,
370*0f5c86ddSBaptiste Daroussin yaml_char_t *anchor)
371*0f5c86ddSBaptiste Daroussin {
372*0f5c86ddSBaptiste Daroussin yaml_event_t event;
373*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
374*0f5c86ddSBaptiste Daroussin
375*0f5c86ddSBaptiste Daroussin int implicit = (strcmp((char *)node->tag, YAML_DEFAULT_MAPPING_TAG) == 0);
376*0f5c86ddSBaptiste Daroussin
377*0f5c86ddSBaptiste Daroussin yaml_node_pair_t *pair;
378*0f5c86ddSBaptiste Daroussin
379*0f5c86ddSBaptiste Daroussin MAPPING_START_EVENT_INIT(event, anchor, node->tag, implicit,
380*0f5c86ddSBaptiste Daroussin node->data.mapping.style, mark, mark);
381*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_emit(emitter, &event)) return 0;
382*0f5c86ddSBaptiste Daroussin
383*0f5c86ddSBaptiste Daroussin for (pair = node->data.mapping.pairs.start;
384*0f5c86ddSBaptiste Daroussin pair < node->data.mapping.pairs.top; pair ++) {
385*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_dump_node(emitter, pair->key)) return 0;
386*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_dump_node(emitter, pair->value)) return 0;
387*0f5c86ddSBaptiste Daroussin }
388*0f5c86ddSBaptiste Daroussin
389*0f5c86ddSBaptiste Daroussin MAPPING_END_EVENT_INIT(event, mark, mark);
390*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_emit(emitter, &event)) return 0;
391*0f5c86ddSBaptiste Daroussin
392*0f5c86ddSBaptiste Daroussin return 1;
393*0f5c86ddSBaptiste Daroussin }
394*0f5c86ddSBaptiste Daroussin
395