xref: /freebsd-src/contrib/libucl/tests/test_basic.c (revision 3dcf5eb70598c88befd62f61f81e283e568ec519)
1c99fb5f9SBaptiste Daroussin /* Copyright (c) 2013, Vsevolod Stakhov
2c99fb5f9SBaptiste Daroussin  * All rights reserved.
3c99fb5f9SBaptiste Daroussin  *
4c99fb5f9SBaptiste Daroussin  * Redistribution and use in source and binary forms, with or without
5c99fb5f9SBaptiste Daroussin  * modification, are permitted provided that the following conditions are met:
6c99fb5f9SBaptiste Daroussin  *       * Redistributions of source code must retain the above copyright
7c99fb5f9SBaptiste Daroussin  *         notice, this list of conditions and the following disclaimer.
8c99fb5f9SBaptiste Daroussin  *       * Redistributions in binary form must reproduce the above copyright
9c99fb5f9SBaptiste Daroussin  *         notice, this list of conditions and the following disclaimer in the
10c99fb5f9SBaptiste Daroussin  *         documentation and/or other materials provided with the distribution.
11c99fb5f9SBaptiste Daroussin  *
12c99fb5f9SBaptiste Daroussin  * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
13c99fb5f9SBaptiste Daroussin  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14c99fb5f9SBaptiste Daroussin  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15c99fb5f9SBaptiste Daroussin  * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
16c99fb5f9SBaptiste Daroussin  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
17c99fb5f9SBaptiste Daroussin  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
18c99fb5f9SBaptiste Daroussin  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
19c99fb5f9SBaptiste Daroussin  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20c99fb5f9SBaptiste Daroussin  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
21c99fb5f9SBaptiste Daroussin  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22c99fb5f9SBaptiste Daroussin  */
23c99fb5f9SBaptiste Daroussin 
24c99fb5f9SBaptiste Daroussin #include "ucl.h"
2597bd480fSBaptiste Daroussin #include "ucl_internal.h"
26c99fb5f9SBaptiste Daroussin 
27c99fb5f9SBaptiste Daroussin int
28c99fb5f9SBaptiste Daroussin main (int argc, char **argv)
29c99fb5f9SBaptiste Daroussin {
30c99fb5f9SBaptiste Daroussin 	char inbuf[8192], *test_in = NULL;
31c99fb5f9SBaptiste Daroussin 	struct ucl_parser *parser = NULL, *parser2 = NULL;
32c99fb5f9SBaptiste Daroussin 	ucl_object_t *obj;
33c99fb5f9SBaptiste Daroussin 	FILE *in, *out;
34c99fb5f9SBaptiste Daroussin 	unsigned char *emitted = NULL;
35c99fb5f9SBaptiste Daroussin 	const char *fname_in = NULL, *fname_out = NULL;
36*3dcf5eb7SBaptiste Daroussin 	int ret = 0, inlen, opt, json = 0, compact = 0, yaml = 0;
37c99fb5f9SBaptiste Daroussin 
38*3dcf5eb7SBaptiste Daroussin 	while ((opt = getopt(argc, argv, "jcy")) != -1) {
39c99fb5f9SBaptiste Daroussin 		switch (opt) {
40c99fb5f9SBaptiste Daroussin 		case 'j':
41c99fb5f9SBaptiste Daroussin 			json = 1;
42c99fb5f9SBaptiste Daroussin 			break;
43*3dcf5eb7SBaptiste Daroussin 		case 'c':
44*3dcf5eb7SBaptiste Daroussin 			compact = 1;
45*3dcf5eb7SBaptiste Daroussin 			break;
46*3dcf5eb7SBaptiste Daroussin 		case 'y':
47*3dcf5eb7SBaptiste Daroussin 			yaml = 1;
48*3dcf5eb7SBaptiste Daroussin 			break;
49c99fb5f9SBaptiste Daroussin 		default: /* '?' */
50*3dcf5eb7SBaptiste Daroussin 			fprintf (stderr, "Usage: %s [-jcy] [in] [out]\n",
51c99fb5f9SBaptiste Daroussin 					argv[0]);
52c99fb5f9SBaptiste Daroussin 			exit (EXIT_FAILURE);
53c99fb5f9SBaptiste Daroussin 		}
54c99fb5f9SBaptiste Daroussin 	}
55c99fb5f9SBaptiste Daroussin 
56c99fb5f9SBaptiste Daroussin 	argc -= optind;
57c99fb5f9SBaptiste Daroussin 	argv += optind;
58c99fb5f9SBaptiste Daroussin 
59c99fb5f9SBaptiste Daroussin 	switch (argc) {
60c99fb5f9SBaptiste Daroussin 	case 1:
61c99fb5f9SBaptiste Daroussin 		fname_in = argv[0];
62c99fb5f9SBaptiste Daroussin 		break;
63c99fb5f9SBaptiste Daroussin 	case 2:
64c99fb5f9SBaptiste Daroussin 		fname_in = argv[0];
65c99fb5f9SBaptiste Daroussin 		fname_out = argv[1];
66c99fb5f9SBaptiste Daroussin 		break;
67c99fb5f9SBaptiste Daroussin 	}
68c99fb5f9SBaptiste Daroussin 
69c99fb5f9SBaptiste Daroussin 	if (fname_in != NULL) {
70c99fb5f9SBaptiste Daroussin 		in = fopen (fname_in, "r");
71c99fb5f9SBaptiste Daroussin 		if (in == NULL) {
72c99fb5f9SBaptiste Daroussin 			exit (-errno);
73c99fb5f9SBaptiste Daroussin 		}
74c99fb5f9SBaptiste Daroussin 	}
75c99fb5f9SBaptiste Daroussin 	else {
76c99fb5f9SBaptiste Daroussin 		in = stdin;
77c99fb5f9SBaptiste Daroussin 	}
78c99fb5f9SBaptiste Daroussin 	parser = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE);
79c99fb5f9SBaptiste Daroussin 	ucl_parser_register_variable (parser, "ABI", "unknown");
80c99fb5f9SBaptiste Daroussin 
81c99fb5f9SBaptiste Daroussin 	if (fname_in != NULL) {
82c99fb5f9SBaptiste Daroussin 		ucl_parser_set_filevars (parser, fname_in, true);
83c99fb5f9SBaptiste Daroussin 	}
84c99fb5f9SBaptiste Daroussin 
85c99fb5f9SBaptiste Daroussin 	while (!feof (in)) {
86c99fb5f9SBaptiste Daroussin 		memset (inbuf, 0, sizeof (inbuf));
87b04a7a0bSBaptiste Daroussin 		if (fread (inbuf, 1, sizeof (inbuf) - 1, in) == 0) {
88b04a7a0bSBaptiste Daroussin 			break;
89b04a7a0bSBaptiste Daroussin 		}
90c99fb5f9SBaptiste Daroussin 		inlen = strlen (inbuf);
91c99fb5f9SBaptiste Daroussin 		test_in = malloc (inlen);
92c99fb5f9SBaptiste Daroussin 		memcpy (test_in, inbuf, inlen);
93c99fb5f9SBaptiste Daroussin 		ucl_parser_add_chunk (parser, test_in, inlen);
94c99fb5f9SBaptiste Daroussin 	}
95c99fb5f9SBaptiste Daroussin 	fclose (in);
96c99fb5f9SBaptiste Daroussin 
97c99fb5f9SBaptiste Daroussin 	if (fname_out != NULL) {
98c99fb5f9SBaptiste Daroussin 		out = fopen (fname_out, "w");
99c99fb5f9SBaptiste Daroussin 		if (out == NULL) {
100c99fb5f9SBaptiste Daroussin 			exit (-errno);
101c99fb5f9SBaptiste Daroussin 		}
102c99fb5f9SBaptiste Daroussin 	}
103c99fb5f9SBaptiste Daroussin 	else {
104c99fb5f9SBaptiste Daroussin 		out = stdout;
105c99fb5f9SBaptiste Daroussin 	}
106c99fb5f9SBaptiste Daroussin 	if (ucl_parser_get_error (parser) != NULL) {
107c99fb5f9SBaptiste Daroussin 		fprintf (out, "Error occurred: %s\n", ucl_parser_get_error(parser));
108c99fb5f9SBaptiste Daroussin 		ret = 1;
109c99fb5f9SBaptiste Daroussin 		goto end;
110c99fb5f9SBaptiste Daroussin 	}
111c99fb5f9SBaptiste Daroussin 	obj = ucl_parser_get_object (parser);
112c99fb5f9SBaptiste Daroussin 	if (json) {
113*3dcf5eb7SBaptiste Daroussin 		if (compact) {
114*3dcf5eb7SBaptiste Daroussin 			emitted = ucl_object_emit (obj, UCL_EMIT_JSON_COMPACT);
115*3dcf5eb7SBaptiste Daroussin 		}
116*3dcf5eb7SBaptiste Daroussin 		else {
117c99fb5f9SBaptiste Daroussin 			emitted = ucl_object_emit (obj, UCL_EMIT_JSON);
118c99fb5f9SBaptiste Daroussin 		}
119*3dcf5eb7SBaptiste Daroussin 	}
120*3dcf5eb7SBaptiste Daroussin 	else if (yaml) {
121*3dcf5eb7SBaptiste Daroussin 		emitted = ucl_object_emit (obj, UCL_EMIT_YAML);
122*3dcf5eb7SBaptiste Daroussin 	}
123c99fb5f9SBaptiste Daroussin 	else {
124c99fb5f9SBaptiste Daroussin 		emitted = ucl_object_emit (obj, UCL_EMIT_CONFIG);
125c99fb5f9SBaptiste Daroussin 	}
126c99fb5f9SBaptiste Daroussin 	ucl_parser_free (parser);
127c99fb5f9SBaptiste Daroussin 	ucl_object_unref (obj);
128c99fb5f9SBaptiste Daroussin 	parser2 = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE);
12997bd480fSBaptiste Daroussin 	ucl_parser_add_string (parser2, emitted, 0);
130c99fb5f9SBaptiste Daroussin 
131c99fb5f9SBaptiste Daroussin 	if (ucl_parser_get_error(parser2) != NULL) {
132c99fb5f9SBaptiste Daroussin 		fprintf (out, "Error occurred: %s\n", ucl_parser_get_error(parser2));
133c99fb5f9SBaptiste Daroussin 		fprintf (out, "%s\n", emitted);
134c99fb5f9SBaptiste Daroussin 		ret = 1;
135c99fb5f9SBaptiste Daroussin 		goto end;
136c99fb5f9SBaptiste Daroussin 	}
137c99fb5f9SBaptiste Daroussin 	if (emitted != NULL) {
138c99fb5f9SBaptiste Daroussin 		free (emitted);
139c99fb5f9SBaptiste Daroussin 	}
140c99fb5f9SBaptiste Daroussin 	obj = ucl_parser_get_object (parser2);
141c99fb5f9SBaptiste Daroussin 	if (json) {
142*3dcf5eb7SBaptiste Daroussin 		if (compact) {
143*3dcf5eb7SBaptiste Daroussin 			emitted = ucl_object_emit (obj, UCL_EMIT_JSON_COMPACT);
144*3dcf5eb7SBaptiste Daroussin 		}
145*3dcf5eb7SBaptiste Daroussin 		else {
146c99fb5f9SBaptiste Daroussin 			emitted = ucl_object_emit (obj, UCL_EMIT_JSON);
147c99fb5f9SBaptiste Daroussin 		}
148*3dcf5eb7SBaptiste Daroussin 	}
149*3dcf5eb7SBaptiste Daroussin 	else if (yaml) {
150*3dcf5eb7SBaptiste Daroussin 		emitted = ucl_object_emit (obj, UCL_EMIT_YAML);
151*3dcf5eb7SBaptiste Daroussin 	}
152c99fb5f9SBaptiste Daroussin 	else {
153c99fb5f9SBaptiste Daroussin 		emitted = ucl_object_emit (obj, UCL_EMIT_CONFIG);
154c99fb5f9SBaptiste Daroussin 	}
155c99fb5f9SBaptiste Daroussin 
156c99fb5f9SBaptiste Daroussin 	fprintf (out, "%s\n", emitted);
157c99fb5f9SBaptiste Daroussin 	ucl_object_unref (obj);
158c99fb5f9SBaptiste Daroussin 
159c99fb5f9SBaptiste Daroussin end:
160c99fb5f9SBaptiste Daroussin 	if (emitted != NULL) {
161c99fb5f9SBaptiste Daroussin 		free (emitted);
162c99fb5f9SBaptiste Daroussin 	}
163c99fb5f9SBaptiste Daroussin 	if (parser2 != NULL) {
164c99fb5f9SBaptiste Daroussin 		ucl_parser_free (parser2);
165c99fb5f9SBaptiste Daroussin 	}
166c99fb5f9SBaptiste Daroussin 	if (test_in != NULL) {
167c99fb5f9SBaptiste Daroussin 		free (test_in);
168c99fb5f9SBaptiste Daroussin 	}
169c99fb5f9SBaptiste Daroussin 
170c99fb5f9SBaptiste Daroussin 	fclose (out);
171c99fb5f9SBaptiste Daroussin 
172c99fb5f9SBaptiste Daroussin 	return ret;
173c99fb5f9SBaptiste Daroussin }
174