Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/libxo/tests/core/test_08.c
39537 views
1
/*
2
* Copyright (c) 2015, Juniper Networks, Inc.
3
* All rights reserved.
4
* This SOFTWARE is licensed under the LICENSE provided in the
5
* ../Copyright file. By downloading, installing, copying, or otherwise
6
* using the SOFTWARE, you agree to be bound by the terms of that
7
* LICENSE.
8
* Phil Shafer, July 2015
9
*/
10
11
#include <stdio.h>
12
#include <stdlib.h>
13
#include <string.h>
14
#include <unistd.h>
15
#include <errno.h>
16
17
#include "xo.h"
18
#include "xo_encoder.h"
19
20
int
21
main (int argc, char **argv)
22
{
23
struct item {
24
const char *i_title;
25
int i_count;
26
};
27
struct item list[] = {
28
{ "gum", 1412 },
29
{ "rope", 85 },
30
{ "ladder", 0 },
31
{ "bolt", 4123 },
32
{ "water", 17 },
33
{ NULL, 0 }
34
};
35
struct item *ip;
36
int i;
37
38
argc = xo_parse_args(argc, argv);
39
if (argc < 0)
40
return 1;
41
42
for (argc = 1; argv[argc]; argc++) {
43
if (xo_streq(argv[argc], "xml"))
44
xo_set_style(NULL, XO_STYLE_XML);
45
else if (xo_streq(argv[argc], "json"))
46
xo_set_style(NULL, XO_STYLE_JSON);
47
else if (xo_streq(argv[argc], "text"))
48
xo_set_style(NULL, XO_STYLE_TEXT);
49
else if (xo_streq(argv[argc], "html"))
50
xo_set_style(NULL, XO_STYLE_HTML);
51
else if (xo_streq(argv[argc], "pretty"))
52
xo_set_flags(NULL, XOF_PRETTY);
53
else if (xo_streq(argv[argc], "xpath"))
54
xo_set_flags(NULL, XOF_XPATH);
55
else if (xo_streq(argv[argc], "info"))
56
xo_set_flags(NULL, XOF_INFO);
57
else if (xo_streq(argv[argc], "error")) {
58
close(-1);
59
xo_err(1, "error detected");
60
}
61
}
62
63
xo_set_flags(NULL, XOF_KEYS);
64
xo_set_program("test");
65
66
xo_open_container_h(NULL, "top");
67
68
xo_open_container("data");
69
xo_open_container("contents");
70
xo_open_list("item");
71
72
xo_emit("{T:Item/%-10s}{T:Count/%12s}\n");
73
74
for (ip = list; ip->i_title; ip++) {
75
xo_open_instance("item");
76
77
xo_emit("{k:name/%-10s/%s}{n:count/%12u/%u}\n",
78
ip->i_title, ip->i_count);
79
80
xo_close_instance("item");
81
}
82
83
xo_close_list("item");
84
xo_close_container("contents");
85
xo_close_container("data");
86
87
xo_emit("\n\n");
88
89
xo_open_container("data2");
90
xo_open_container("contents");
91
92
xo_emit("{T:Item/%-10s}{T:Count/%12s}\n");
93
94
for (ip = list; ip->i_title; ip++) {
95
xo_open_instance("item");
96
97
xo_emit("{k:name/%-10s/%s}{n:count/%12u/%u}\n",
98
ip->i_title, ip->i_count);
99
}
100
101
xo_close_container("data2");
102
103
xo_emit("\n\n");
104
105
xo_open_container("data3");
106
xo_open_marker("m1");
107
xo_open_container("contents");
108
109
xo_emit("{T:Item/%-10s}{T:Count/%12s}\n");
110
111
for (ip = list; ip->i_title; ip++) {
112
xo_open_instance("item");
113
114
xo_emit("{k:name/%-10s/%s}{n:count/%12u/%u}\n",
115
ip->i_title, ip->i_count);
116
}
117
118
xo_close_container("data3"); /* warn: fails at marker 'm1' */
119
xo_emit("{:test}", "one");
120
121
xo_close_marker("m1");
122
xo_close_container("data3"); /* this one works, post-marker */
123
124
xo_emit("\n\n");
125
126
xo_open_container("data4");
127
xo_open_marker("m1");
128
xo_open_container("contents");
129
130
xo_emit("{T:Item/%-10s}{T:Count/%12s}\n");
131
132
for (ip = list; ip->i_title; ip++) {
133
xo_open_instance("item");
134
135
xo_emit("{k:name/%-10s/%s}{n:count/%12u/%u}\n",
136
ip->i_title, ip->i_count);
137
138
xo_open_marker("m2");
139
for (i = 0; i < 3; i++) {
140
xo_open_instance("sub");
141
xo_emit("{Lwc:/Name}{:name/%d} + 1 = {:next/%d}\n", i, i + 1);
142
xo_close_container("data4"); /* warn: fails at marker 'm2' */
143
}
144
xo_close_marker("m2");
145
xo_emit("{Lwc:/Last}{:last/%d}\n", i);
146
}
147
148
xo_close_container("data4"); /* warn: fails at marker 'm1' */
149
xo_emit("{:test}", "one");
150
151
xo_emit("\n\n");
152
153
xo_close_container_h(NULL, "top");
154
155
xo_finish();
156
157
return 0;
158
}
159
160