xref: /freebsd/contrib/libyaml/src/dumper.c (revision 0f5c86ddb0257f4b7620f1d8e898289be30b19bf)
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