1*0f5c86ddSBaptiste Daroussin
2*0f5c86ddSBaptiste Daroussin #include <yaml.h>
3*0f5c86ddSBaptiste Daroussin
4*0f5c86ddSBaptiste Daroussin #include <stdlib.h>
5*0f5c86ddSBaptiste Daroussin #include <stdio.h>
6*0f5c86ddSBaptiste Daroussin
7*0f5c86ddSBaptiste Daroussin int
main(int argc,char * argv[])8*0f5c86ddSBaptiste Daroussin main(int argc, char *argv[])
9*0f5c86ddSBaptiste Daroussin {
10*0f5c86ddSBaptiste Daroussin int help = 0;
11*0f5c86ddSBaptiste Daroussin int canonical = 0;
12*0f5c86ddSBaptiste Daroussin int unicode = 0;
13*0f5c86ddSBaptiste Daroussin int k;
14*0f5c86ddSBaptiste Daroussin int done = 0;
15*0f5c86ddSBaptiste Daroussin
16*0f5c86ddSBaptiste Daroussin yaml_parser_t parser;
17*0f5c86ddSBaptiste Daroussin yaml_emitter_t emitter;
18*0f5c86ddSBaptiste Daroussin yaml_document_t document;
19*0f5c86ddSBaptiste Daroussin
20*0f5c86ddSBaptiste Daroussin /* Clear the objects. */
21*0f5c86ddSBaptiste Daroussin
22*0f5c86ddSBaptiste Daroussin memset(&parser, 0, sizeof(parser));
23*0f5c86ddSBaptiste Daroussin memset(&emitter, 0, sizeof(emitter));
24*0f5c86ddSBaptiste Daroussin memset(&document, 0, sizeof(document));
25*0f5c86ddSBaptiste Daroussin
26*0f5c86ddSBaptiste Daroussin /* Analyze command line options. */
27*0f5c86ddSBaptiste Daroussin
28*0f5c86ddSBaptiste Daroussin for (k = 1; k < argc; k ++)
29*0f5c86ddSBaptiste Daroussin {
30*0f5c86ddSBaptiste Daroussin if (strcmp(argv[k], "-h") == 0
31*0f5c86ddSBaptiste Daroussin || strcmp(argv[k], "--help") == 0) {
32*0f5c86ddSBaptiste Daroussin help = 1;
33*0f5c86ddSBaptiste Daroussin }
34*0f5c86ddSBaptiste Daroussin
35*0f5c86ddSBaptiste Daroussin else if (strcmp(argv[k], "-c") == 0
36*0f5c86ddSBaptiste Daroussin || strcmp(argv[k], "--canonical") == 0) {
37*0f5c86ddSBaptiste Daroussin canonical = 1;
38*0f5c86ddSBaptiste Daroussin }
39*0f5c86ddSBaptiste Daroussin
40*0f5c86ddSBaptiste Daroussin else if (strcmp(argv[k], "-u") == 0
41*0f5c86ddSBaptiste Daroussin || strcmp(argv[k], "--unicode") == 0) {
42*0f5c86ddSBaptiste Daroussin unicode = 1;
43*0f5c86ddSBaptiste Daroussin }
44*0f5c86ddSBaptiste Daroussin
45*0f5c86ddSBaptiste Daroussin else {
46*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Unrecognized option: %s\n"
47*0f5c86ddSBaptiste Daroussin "Try `%s --help` for more information.\n",
48*0f5c86ddSBaptiste Daroussin argv[k], argv[0]);
49*0f5c86ddSBaptiste Daroussin return 1;
50*0f5c86ddSBaptiste Daroussin }
51*0f5c86ddSBaptiste Daroussin }
52*0f5c86ddSBaptiste Daroussin
53*0f5c86ddSBaptiste Daroussin /* Display the help string. */
54*0f5c86ddSBaptiste Daroussin
55*0f5c86ddSBaptiste Daroussin if (help)
56*0f5c86ddSBaptiste Daroussin {
57*0f5c86ddSBaptiste Daroussin printf("%s [--canonical] [--unicode] <input >output\n"
58*0f5c86ddSBaptiste Daroussin "or\n%s -h | --help\nReformat a YAML stream\n\nOptions:\n"
59*0f5c86ddSBaptiste Daroussin "-h, --help\t\tdisplay this help and exit\n"
60*0f5c86ddSBaptiste Daroussin "-c, --canonical\t\toutput in the canonical YAML format\n"
61*0f5c86ddSBaptiste Daroussin "-u, --unicode\t\toutput unescaped non-ASCII characters\n",
62*0f5c86ddSBaptiste Daroussin argv[0], argv[0]);
63*0f5c86ddSBaptiste Daroussin return 0;
64*0f5c86ddSBaptiste Daroussin }
65*0f5c86ddSBaptiste Daroussin
66*0f5c86ddSBaptiste Daroussin /* Initialize the parser and emitter objects. */
67*0f5c86ddSBaptiste Daroussin
68*0f5c86ddSBaptiste Daroussin if (!yaml_parser_initialize(&parser))
69*0f5c86ddSBaptiste Daroussin goto parser_error;
70*0f5c86ddSBaptiste Daroussin
71*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_initialize(&emitter))
72*0f5c86ddSBaptiste Daroussin goto emitter_error;
73*0f5c86ddSBaptiste Daroussin
74*0f5c86ddSBaptiste Daroussin /* Set the parser parameters. */
75*0f5c86ddSBaptiste Daroussin
76*0f5c86ddSBaptiste Daroussin yaml_parser_set_input_file(&parser, stdin);
77*0f5c86ddSBaptiste Daroussin
78*0f5c86ddSBaptiste Daroussin /* Set the emitter parameters. */
79*0f5c86ddSBaptiste Daroussin
80*0f5c86ddSBaptiste Daroussin yaml_emitter_set_output_file(&emitter, stdout);
81*0f5c86ddSBaptiste Daroussin
82*0f5c86ddSBaptiste Daroussin yaml_emitter_set_canonical(&emitter, canonical);
83*0f5c86ddSBaptiste Daroussin yaml_emitter_set_unicode(&emitter, unicode);
84*0f5c86ddSBaptiste Daroussin
85*0f5c86ddSBaptiste Daroussin /* The main loop. */
86*0f5c86ddSBaptiste Daroussin
87*0f5c86ddSBaptiste Daroussin while (!done)
88*0f5c86ddSBaptiste Daroussin {
89*0f5c86ddSBaptiste Daroussin /* Get the next event. */
90*0f5c86ddSBaptiste Daroussin
91*0f5c86ddSBaptiste Daroussin if (!yaml_parser_load(&parser, &document))
92*0f5c86ddSBaptiste Daroussin goto parser_error;
93*0f5c86ddSBaptiste Daroussin
94*0f5c86ddSBaptiste Daroussin /* Check if this is the stream end. */
95*0f5c86ddSBaptiste Daroussin
96*0f5c86ddSBaptiste Daroussin if (!yaml_document_get_root_node(&document)) {
97*0f5c86ddSBaptiste Daroussin done = 1;
98*0f5c86ddSBaptiste Daroussin }
99*0f5c86ddSBaptiste Daroussin
100*0f5c86ddSBaptiste Daroussin /* Emit the event. */
101*0f5c86ddSBaptiste Daroussin
102*0f5c86ddSBaptiste Daroussin if (!yaml_emitter_dump(&emitter, &document))
103*0f5c86ddSBaptiste Daroussin goto emitter_error;
104*0f5c86ddSBaptiste Daroussin }
105*0f5c86ddSBaptiste Daroussin
106*0f5c86ddSBaptiste Daroussin yaml_parser_delete(&parser);
107*0f5c86ddSBaptiste Daroussin yaml_emitter_delete(&emitter);
108*0f5c86ddSBaptiste Daroussin
109*0f5c86ddSBaptiste Daroussin return 0;
110*0f5c86ddSBaptiste Daroussin
111*0f5c86ddSBaptiste Daroussin parser_error:
112*0f5c86ddSBaptiste Daroussin
113*0f5c86ddSBaptiste Daroussin /* Display a parser error message. */
114*0f5c86ddSBaptiste Daroussin
115*0f5c86ddSBaptiste Daroussin switch (parser.error)
116*0f5c86ddSBaptiste Daroussin {
117*0f5c86ddSBaptiste Daroussin case YAML_MEMORY_ERROR:
118*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Memory error: Not enough memory for parsing\n");
119*0f5c86ddSBaptiste Daroussin break;
120*0f5c86ddSBaptiste Daroussin
121*0f5c86ddSBaptiste Daroussin case YAML_READER_ERROR:
122*0f5c86ddSBaptiste Daroussin if (parser.problem_value != -1) {
123*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Reader error: %s: #%X at %zd\n", parser.problem,
124*0f5c86ddSBaptiste Daroussin parser.problem_value, parser.problem_offset);
125*0f5c86ddSBaptiste Daroussin }
126*0f5c86ddSBaptiste Daroussin else {
127*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Reader error: %s at %lu\n", parser.problem,
128*0f5c86ddSBaptiste Daroussin parser.problem_offset);
129*0f5c86ddSBaptiste Daroussin }
130*0f5c86ddSBaptiste Daroussin break;
131*0f5c86ddSBaptiste Daroussin
132*0f5c86ddSBaptiste Daroussin case YAML_SCANNER_ERROR:
133*0f5c86ddSBaptiste Daroussin if (parser.context) {
134*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n"
135*0f5c86ddSBaptiste Daroussin "%s at line %lu, column %lu\n", parser.context,
136*0f5c86ddSBaptiste Daroussin parser.context_mark.line+1, parser.context_mark.column+1,
137*0f5c86ddSBaptiste Daroussin parser.problem, parser.problem_mark.line+1,
138*0f5c86ddSBaptiste Daroussin parser.problem_mark.column+1);
139*0f5c86ddSBaptiste Daroussin }
140*0f5c86ddSBaptiste Daroussin else {
141*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n",
142*0f5c86ddSBaptiste Daroussin parser.problem, parser.problem_mark.line+1,
143*0f5c86ddSBaptiste Daroussin parser.problem_mark.column+1);
144*0f5c86ddSBaptiste Daroussin }
145*0f5c86ddSBaptiste Daroussin break;
146*0f5c86ddSBaptiste Daroussin
147*0f5c86ddSBaptiste Daroussin case YAML_PARSER_ERROR:
148*0f5c86ddSBaptiste Daroussin if (parser.context) {
149*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Parser error: %s at line %lu, column %lu\n"
150*0f5c86ddSBaptiste Daroussin "%s at line %lu, column %lu\n", parser.context,
151*0f5c86ddSBaptiste Daroussin parser.context_mark.line+1, parser.context_mark.column+1,
152*0f5c86ddSBaptiste Daroussin parser.problem, parser.problem_mark.line+1,
153*0f5c86ddSBaptiste Daroussin parser.problem_mark.column+1);
154*0f5c86ddSBaptiste Daroussin }
155*0f5c86ddSBaptiste Daroussin else {
156*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Parser error: %s at line %lu, column %lu\n",
157*0f5c86ddSBaptiste Daroussin parser.problem, parser.problem_mark.line+1,
158*0f5c86ddSBaptiste Daroussin parser.problem_mark.column+1);
159*0f5c86ddSBaptiste Daroussin }
160*0f5c86ddSBaptiste Daroussin break;
161*0f5c86ddSBaptiste Daroussin
162*0f5c86ddSBaptiste Daroussin case YAML_COMPOSER_ERROR:
163*0f5c86ddSBaptiste Daroussin if (parser.context) {
164*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Composer error: %s at line %lu, column %lu\n"
165*0f5c86ddSBaptiste Daroussin "%s at line %lu, column %lu\n", parser.context,
166*0f5c86ddSBaptiste Daroussin parser.context_mark.line+1, parser.context_mark.column+1,
167*0f5c86ddSBaptiste Daroussin parser.problem, parser.problem_mark.line+1,
168*0f5c86ddSBaptiste Daroussin parser.problem_mark.column+1);
169*0f5c86ddSBaptiste Daroussin }
170*0f5c86ddSBaptiste Daroussin else {
171*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Composer error: %s at line %lu, column %lu\n",
172*0f5c86ddSBaptiste Daroussin parser.problem, parser.problem_mark.line+1,
173*0f5c86ddSBaptiste Daroussin parser.problem_mark.column+1);
174*0f5c86ddSBaptiste Daroussin }
175*0f5c86ddSBaptiste Daroussin break;
176*0f5c86ddSBaptiste Daroussin
177*0f5c86ddSBaptiste Daroussin default:
178*0f5c86ddSBaptiste Daroussin /* Couldn't happen. */
179*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Internal error\n");
180*0f5c86ddSBaptiste Daroussin break;
181*0f5c86ddSBaptiste Daroussin }
182*0f5c86ddSBaptiste Daroussin
183*0f5c86ddSBaptiste Daroussin yaml_parser_delete(&parser);
184*0f5c86ddSBaptiste Daroussin yaml_emitter_delete(&emitter);
185*0f5c86ddSBaptiste Daroussin
186*0f5c86ddSBaptiste Daroussin return 1;
187*0f5c86ddSBaptiste Daroussin
188*0f5c86ddSBaptiste Daroussin emitter_error:
189*0f5c86ddSBaptiste Daroussin
190*0f5c86ddSBaptiste Daroussin /* Display an emitter error message. */
191*0f5c86ddSBaptiste Daroussin
192*0f5c86ddSBaptiste Daroussin switch (emitter.error)
193*0f5c86ddSBaptiste Daroussin {
194*0f5c86ddSBaptiste Daroussin case YAML_MEMORY_ERROR:
195*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Memory error: Not enough memory for emitting\n");
196*0f5c86ddSBaptiste Daroussin break;
197*0f5c86ddSBaptiste Daroussin
198*0f5c86ddSBaptiste Daroussin case YAML_WRITER_ERROR:
199*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Writer error: %s\n", emitter.problem);
200*0f5c86ddSBaptiste Daroussin break;
201*0f5c86ddSBaptiste Daroussin
202*0f5c86ddSBaptiste Daroussin case YAML_EMITTER_ERROR:
203*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Emitter error: %s\n", emitter.problem);
204*0f5c86ddSBaptiste Daroussin break;
205*0f5c86ddSBaptiste Daroussin
206*0f5c86ddSBaptiste Daroussin default:
207*0f5c86ddSBaptiste Daroussin /* Couldn't happen. */
208*0f5c86ddSBaptiste Daroussin fprintf(stderr, "Internal error\n");
209*0f5c86ddSBaptiste Daroussin break;
210*0f5c86ddSBaptiste Daroussin }
211*0f5c86ddSBaptiste Daroussin
212*0f5c86ddSBaptiste Daroussin yaml_parser_delete(&parser);
213*0f5c86ddSBaptiste Daroussin yaml_emitter_delete(&emitter);
214*0f5c86ddSBaptiste Daroussin
215*0f5c86ddSBaptiste Daroussin return 1;
216*0f5c86ddSBaptiste Daroussin }
217*0f5c86ddSBaptiste Daroussin
218