xref: /freebsd-src/contrib/libucl/tests/test_basic.c (revision b04a7a0baf6523245034b8ccd06cd0176b8a18cf)
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;
36c99fb5f9SBaptiste Daroussin 	int ret = 0, inlen, opt, json = 0;
37c99fb5f9SBaptiste Daroussin 
38c99fb5f9SBaptiste Daroussin 	while ((opt = getopt(argc, argv, "j")) != -1) {
39c99fb5f9SBaptiste Daroussin 		switch (opt) {
40c99fb5f9SBaptiste Daroussin 		case 'j':
41c99fb5f9SBaptiste Daroussin 			json = 1;
42c99fb5f9SBaptiste Daroussin 			break;
43c99fb5f9SBaptiste Daroussin 		default: /* '?' */
44c99fb5f9SBaptiste Daroussin 			fprintf (stderr, "Usage: %s [-j] [in] [out]\n",
45c99fb5f9SBaptiste Daroussin 					argv[0]);
46c99fb5f9SBaptiste Daroussin 			exit (EXIT_FAILURE);
47c99fb5f9SBaptiste Daroussin 		}
48c99fb5f9SBaptiste Daroussin 	}
49c99fb5f9SBaptiste Daroussin 
50c99fb5f9SBaptiste Daroussin 	argc -= optind;
51c99fb5f9SBaptiste Daroussin 	argv += optind;
52c99fb5f9SBaptiste Daroussin 
53c99fb5f9SBaptiste Daroussin 	switch (argc) {
54c99fb5f9SBaptiste Daroussin 	case 1:
55c99fb5f9SBaptiste Daroussin 		fname_in = argv[0];
56c99fb5f9SBaptiste Daroussin 		break;
57c99fb5f9SBaptiste Daroussin 	case 2:
58c99fb5f9SBaptiste Daroussin 		fname_in = argv[0];
59c99fb5f9SBaptiste Daroussin 		fname_out = argv[1];
60c99fb5f9SBaptiste Daroussin 		break;
61c99fb5f9SBaptiste Daroussin 	}
62c99fb5f9SBaptiste Daroussin 
63c99fb5f9SBaptiste Daroussin 	if (fname_in != NULL) {
64c99fb5f9SBaptiste Daroussin 		in = fopen (fname_in, "r");
65c99fb5f9SBaptiste Daroussin 		if (in == NULL) {
66c99fb5f9SBaptiste Daroussin 			exit (-errno);
67c99fb5f9SBaptiste Daroussin 		}
68c99fb5f9SBaptiste Daroussin 	}
69c99fb5f9SBaptiste Daroussin 	else {
70c99fb5f9SBaptiste Daroussin 		in = stdin;
71c99fb5f9SBaptiste Daroussin 	}
72c99fb5f9SBaptiste Daroussin 	parser = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE);
73c99fb5f9SBaptiste Daroussin 	ucl_parser_register_variable (parser, "ABI", "unknown");
74c99fb5f9SBaptiste Daroussin 
75c99fb5f9SBaptiste Daroussin 	if (fname_in != NULL) {
76c99fb5f9SBaptiste Daroussin 		ucl_parser_set_filevars (parser, fname_in, true);
77c99fb5f9SBaptiste Daroussin 	}
78c99fb5f9SBaptiste Daroussin 
79c99fb5f9SBaptiste Daroussin 	while (!feof (in)) {
80c99fb5f9SBaptiste Daroussin 		memset (inbuf, 0, sizeof (inbuf));
81*b04a7a0bSBaptiste Daroussin 		if (fread (inbuf, 1, sizeof (inbuf) - 1, in) == 0) {
82*b04a7a0bSBaptiste Daroussin 			break;
83*b04a7a0bSBaptiste Daroussin 		}
84c99fb5f9SBaptiste Daroussin 		inlen = strlen (inbuf);
85c99fb5f9SBaptiste Daroussin 		test_in = malloc (inlen);
86c99fb5f9SBaptiste Daroussin 		memcpy (test_in, inbuf, inlen);
87c99fb5f9SBaptiste Daroussin 		ucl_parser_add_chunk (parser, test_in, inlen);
88c99fb5f9SBaptiste Daroussin 	}
89c99fb5f9SBaptiste Daroussin 	fclose (in);
90c99fb5f9SBaptiste Daroussin 
91c99fb5f9SBaptiste Daroussin 	if (fname_out != NULL) {
92c99fb5f9SBaptiste Daroussin 		out = fopen (fname_out, "w");
93c99fb5f9SBaptiste Daroussin 		if (out == NULL) {
94c99fb5f9SBaptiste Daroussin 			exit (-errno);
95c99fb5f9SBaptiste Daroussin 		}
96c99fb5f9SBaptiste Daroussin 	}
97c99fb5f9SBaptiste Daroussin 	else {
98c99fb5f9SBaptiste Daroussin 		out = stdout;
99c99fb5f9SBaptiste Daroussin 	}
100c99fb5f9SBaptiste Daroussin 	if (ucl_parser_get_error (parser) != NULL) {
101c99fb5f9SBaptiste Daroussin 		fprintf (out, "Error occurred: %s\n", ucl_parser_get_error(parser));
102c99fb5f9SBaptiste Daroussin 		ret = 1;
103c99fb5f9SBaptiste Daroussin 		goto end;
104c99fb5f9SBaptiste Daroussin 	}
105c99fb5f9SBaptiste Daroussin 	obj = ucl_parser_get_object (parser);
106c99fb5f9SBaptiste Daroussin 	if (json) {
107c99fb5f9SBaptiste Daroussin 		emitted = ucl_object_emit (obj, UCL_EMIT_JSON);
108c99fb5f9SBaptiste Daroussin 	}
109c99fb5f9SBaptiste Daroussin 	else {
110c99fb5f9SBaptiste Daroussin 		emitted = ucl_object_emit (obj, UCL_EMIT_CONFIG);
111c99fb5f9SBaptiste Daroussin 	}
112c99fb5f9SBaptiste Daroussin 	ucl_parser_free (parser);
113c99fb5f9SBaptiste Daroussin 	ucl_object_unref (obj);
114c99fb5f9SBaptiste Daroussin 	parser2 = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE);
11597bd480fSBaptiste Daroussin 	ucl_parser_add_string (parser2, emitted, 0);
116c99fb5f9SBaptiste Daroussin 
117c99fb5f9SBaptiste Daroussin 	if (ucl_parser_get_error(parser2) != NULL) {
118c99fb5f9SBaptiste Daroussin 		fprintf (out, "Error occurred: %s\n", ucl_parser_get_error(parser2));
119c99fb5f9SBaptiste Daroussin 		fprintf (out, "%s\n", emitted);
120c99fb5f9SBaptiste Daroussin 		ret = 1;
121c99fb5f9SBaptiste Daroussin 		goto end;
122c99fb5f9SBaptiste Daroussin 	}
123c99fb5f9SBaptiste Daroussin 	if (emitted != NULL) {
124c99fb5f9SBaptiste Daroussin 		free (emitted);
125c99fb5f9SBaptiste Daroussin 	}
126c99fb5f9SBaptiste Daroussin 	obj = ucl_parser_get_object (parser2);
127c99fb5f9SBaptiste Daroussin 	if (json) {
128c99fb5f9SBaptiste Daroussin 		emitted = ucl_object_emit (obj, UCL_EMIT_JSON);
129c99fb5f9SBaptiste Daroussin 	}
130c99fb5f9SBaptiste Daroussin 	else {
131c99fb5f9SBaptiste Daroussin 		emitted = ucl_object_emit (obj, UCL_EMIT_CONFIG);
132c99fb5f9SBaptiste Daroussin 	}
133c99fb5f9SBaptiste Daroussin 
134c99fb5f9SBaptiste Daroussin 	fprintf (out, "%s\n", emitted);
135c99fb5f9SBaptiste Daroussin 	ucl_object_unref (obj);
136c99fb5f9SBaptiste Daroussin 
137c99fb5f9SBaptiste Daroussin end:
138c99fb5f9SBaptiste Daroussin 	if (emitted != NULL) {
139c99fb5f9SBaptiste Daroussin 		free (emitted);
140c99fb5f9SBaptiste Daroussin 	}
141c99fb5f9SBaptiste Daroussin 	if (parser2 != NULL) {
142c99fb5f9SBaptiste Daroussin 		ucl_parser_free (parser2);
143c99fb5f9SBaptiste Daroussin 	}
144c99fb5f9SBaptiste Daroussin 	if (test_in != NULL) {
145c99fb5f9SBaptiste Daroussin 		free (test_in);
146c99fb5f9SBaptiste Daroussin 	}
147c99fb5f9SBaptiste Daroussin 
148c99fb5f9SBaptiste Daroussin 	fclose (out);
149c99fb5f9SBaptiste Daroussin 
150c99fb5f9SBaptiste Daroussin 	return ret;
151c99fb5f9SBaptiste Daroussin }
152