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