xref: /freebsd/contrib/libyaml/tests/example-reformatter-alt.c (revision 0f5c86ddb0257f4b7620f1d8e898289be30b19bf)
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