xref: /freebsd-src/contrib/libucl/utils/objdump.c (revision a0409676120c1e558d0ade943019934e0f15118d)
1c99fb5f9SBaptiste Daroussin /* Copyright (c) 2013, Dmitriy V. Reshetnikov
2c99fb5f9SBaptiste Daroussin  * Copyright (c) 2013, Vsevolod Stakhov
3c99fb5f9SBaptiste Daroussin  * All rights reserved.
4c99fb5f9SBaptiste Daroussin  *
5c99fb5f9SBaptiste Daroussin  * Redistribution and use in source and binary forms, with or without
6c99fb5f9SBaptiste Daroussin  * modification, are permitted provided that the following conditions are met:
7c99fb5f9SBaptiste Daroussin  *       * Redistributions of source code must retain the above copyright
8c99fb5f9SBaptiste Daroussin  *         notice, this list of conditions and the following disclaimer.
9c99fb5f9SBaptiste Daroussin  *       * Redistributions in binary form must reproduce the above copyright
10c99fb5f9SBaptiste Daroussin  *         notice, this list of conditions and the following disclaimer in the
11c99fb5f9SBaptiste Daroussin  *         documentation and/or other materials provided with the distribution.
12c99fb5f9SBaptiste Daroussin  *
13c99fb5f9SBaptiste Daroussin  * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
14c99fb5f9SBaptiste Daroussin  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15c99fb5f9SBaptiste Daroussin  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16c99fb5f9SBaptiste Daroussin  * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
17c99fb5f9SBaptiste Daroussin  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18c99fb5f9SBaptiste Daroussin  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19c99fb5f9SBaptiste Daroussin  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20c99fb5f9SBaptiste Daroussin  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21c99fb5f9SBaptiste Daroussin  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22c99fb5f9SBaptiste Daroussin  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23c99fb5f9SBaptiste Daroussin  */
24c99fb5f9SBaptiste Daroussin 
25*a0409676SBaptiste Daroussin #if defined(_MSC_VER)
26*a0409676SBaptiste Daroussin     #include <BaseTsd.h>
27*a0409676SBaptiste Daroussin 
28*a0409676SBaptiste Daroussin     typedef SSIZE_T ssize_t;
29*a0409676SBaptiste Daroussin #endif
30c99fb5f9SBaptiste Daroussin 
31c99fb5f9SBaptiste Daroussin #include "ucl.h"
32c99fb5f9SBaptiste Daroussin 
33c99fb5f9SBaptiste Daroussin void
ucl_obj_dump(const ucl_object_t * obj,unsigned int shift)34b04a7a0bSBaptiste Daroussin ucl_obj_dump (const ucl_object_t *obj, unsigned int shift)
35c99fb5f9SBaptiste Daroussin {
36c99fb5f9SBaptiste Daroussin 	int num = shift * 4 + 5;
37c99fb5f9SBaptiste Daroussin 	char *pre = (char *) malloc (num * sizeof(char));
38b04a7a0bSBaptiste Daroussin 	const ucl_object_t *cur, *tmp;
39c99fb5f9SBaptiste Daroussin 	ucl_object_iter_t it = NULL, it_obj = NULL;
40c99fb5f9SBaptiste Daroussin 
41c99fb5f9SBaptiste Daroussin 	pre[--num] = 0x00;
42c99fb5f9SBaptiste Daroussin 	while (num--)
43c99fb5f9SBaptiste Daroussin 		pre[num] = 0x20;
44c99fb5f9SBaptiste Daroussin 
45c99fb5f9SBaptiste Daroussin 	tmp = obj;
46c99fb5f9SBaptiste Daroussin 
47d9f0ce31SBaptiste Daroussin 	while ((obj = ucl_object_iterate (tmp, &it, false))) {
48c99fb5f9SBaptiste Daroussin 		printf ("%sucl object address: %p\n", pre + 4, obj);
49c99fb5f9SBaptiste Daroussin 		if (obj->key != NULL) {
50c99fb5f9SBaptiste Daroussin 			printf ("%skey: \"%s\"\n", pre, ucl_object_key (obj));
51c99fb5f9SBaptiste Daroussin 		}
528e3b1ab2SBaptiste Daroussin 		printf ("%sref: %u\n", pre, obj->ref);
53c99fb5f9SBaptiste Daroussin 		printf ("%slen: %u\n", pre, obj->len);
54c99fb5f9SBaptiste Daroussin 		printf ("%sprev: %p\n", pre, obj->prev);
55c99fb5f9SBaptiste Daroussin 		printf ("%snext: %p\n", pre, obj->next);
56c99fb5f9SBaptiste Daroussin 		if (obj->type == UCL_OBJECT) {
57c99fb5f9SBaptiste Daroussin 			printf ("%stype: UCL_OBJECT\n", pre);
58c99fb5f9SBaptiste Daroussin 			printf ("%svalue: %p\n", pre, obj->value.ov);
594bf54857SBaptiste Daroussin 			it_obj = NULL;
60d9f0ce31SBaptiste Daroussin 			while ((cur = ucl_object_iterate (obj, &it_obj, true))) {
61c99fb5f9SBaptiste Daroussin 				ucl_obj_dump (cur, shift + 2);
62c99fb5f9SBaptiste Daroussin 			}
63c99fb5f9SBaptiste Daroussin 		}
64c99fb5f9SBaptiste Daroussin 		else if (obj->type == UCL_ARRAY) {
65c99fb5f9SBaptiste Daroussin 			printf ("%stype: UCL_ARRAY\n", pre);
66c99fb5f9SBaptiste Daroussin 			printf ("%svalue: %p\n", pre, obj->value.av);
678e3b1ab2SBaptiste Daroussin 			it_obj = NULL;
68d9f0ce31SBaptiste Daroussin 			while ((cur = ucl_object_iterate (obj, &it_obj, true))) {
698e3b1ab2SBaptiste Daroussin 				ucl_obj_dump (cur, shift + 2);
708e3b1ab2SBaptiste Daroussin 			}
71c99fb5f9SBaptiste Daroussin 		}
72c99fb5f9SBaptiste Daroussin 		else if (obj->type == UCL_INT) {
73c99fb5f9SBaptiste Daroussin 			printf ("%stype: UCL_INT\n", pre);
74b04a7a0bSBaptiste Daroussin 			printf ("%svalue: %jd\n", pre, (intmax_t)ucl_object_toint (obj));
75c99fb5f9SBaptiste Daroussin 		}
76c99fb5f9SBaptiste Daroussin 		else if (obj->type == UCL_FLOAT) {
77c99fb5f9SBaptiste Daroussin 			printf ("%stype: UCL_FLOAT\n", pre);
78c99fb5f9SBaptiste Daroussin 			printf ("%svalue: %f\n", pre, ucl_object_todouble (obj));
79c99fb5f9SBaptiste Daroussin 		}
80c99fb5f9SBaptiste Daroussin 		else if (obj->type == UCL_STRING) {
81c99fb5f9SBaptiste Daroussin 			printf ("%stype: UCL_STRING\n", pre);
82c99fb5f9SBaptiste Daroussin 			printf ("%svalue: \"%s\"\n", pre, ucl_object_tostring (obj));
83c99fb5f9SBaptiste Daroussin 		}
84c99fb5f9SBaptiste Daroussin 		else if (obj->type == UCL_BOOLEAN) {
85c99fb5f9SBaptiste Daroussin 			printf ("%stype: UCL_BOOLEAN\n", pre);
86c99fb5f9SBaptiste Daroussin 			printf ("%svalue: %s\n", pre, ucl_object_tostring_forced (obj));
87c99fb5f9SBaptiste Daroussin 		}
88c99fb5f9SBaptiste Daroussin 		else if (obj->type == UCL_TIME) {
89c99fb5f9SBaptiste Daroussin 			printf ("%stype: UCL_TIME\n", pre);
90c99fb5f9SBaptiste Daroussin 			printf ("%svalue: %f\n", pre, ucl_object_todouble (obj));
91c99fb5f9SBaptiste Daroussin 		}
92c99fb5f9SBaptiste Daroussin 		else if (obj->type == UCL_USERDATA) {
93c99fb5f9SBaptiste Daroussin 			printf ("%stype: UCL_USERDATA\n", pre);
94c99fb5f9SBaptiste Daroussin 			printf ("%svalue: %p\n", pre, obj->value.ud);
95c99fb5f9SBaptiste Daroussin 		}
96c99fb5f9SBaptiste Daroussin 	}
97c99fb5f9SBaptiste Daroussin 
98c99fb5f9SBaptiste Daroussin 	free (pre);
99c99fb5f9SBaptiste Daroussin }
100c99fb5f9SBaptiste Daroussin 
101c99fb5f9SBaptiste Daroussin int
main(int argc,char ** argv)102c99fb5f9SBaptiste Daroussin main(int argc, char **argv)
103c99fb5f9SBaptiste Daroussin {
104c99fb5f9SBaptiste Daroussin 	const char *fn = NULL;
10539ee7a7aSBaptiste Daroussin 	unsigned char *inbuf;
106c99fb5f9SBaptiste Daroussin 	struct ucl_parser *parser;
107*a0409676SBaptiste Daroussin 	int k, ret = 0;
108*a0409676SBaptiste Daroussin 	ssize_t bufsize, r = 0;
109c99fb5f9SBaptiste Daroussin 	ucl_object_t *obj = NULL;
110b04a7a0bSBaptiste Daroussin 	const ucl_object_t *par;
111c99fb5f9SBaptiste Daroussin 	FILE *in;
112c99fb5f9SBaptiste Daroussin 
113c99fb5f9SBaptiste Daroussin 	if (argc > 1) {
114c99fb5f9SBaptiste Daroussin 		fn = argv[1];
115c99fb5f9SBaptiste Daroussin 	}
116c99fb5f9SBaptiste Daroussin 
117c99fb5f9SBaptiste Daroussin 	if (fn != NULL) {
118c99fb5f9SBaptiste Daroussin 		in = fopen (fn, "r");
119c99fb5f9SBaptiste Daroussin 		if (in == NULL) {
120*a0409676SBaptiste Daroussin 			exit (EXIT_FAILURE);
121c99fb5f9SBaptiste Daroussin 		}
122c99fb5f9SBaptiste Daroussin 	}
123c99fb5f9SBaptiste Daroussin 	else {
124c99fb5f9SBaptiste Daroussin 		in = stdin;
125c99fb5f9SBaptiste Daroussin 	}
126c99fb5f9SBaptiste Daroussin 
127c99fb5f9SBaptiste Daroussin 	parser = ucl_parser_new (0);
12839ee7a7aSBaptiste Daroussin 	inbuf = malloc (BUFSIZ);
12939ee7a7aSBaptiste Daroussin 	bufsize = BUFSIZ;
13039ee7a7aSBaptiste Daroussin 	r = 0;
13139ee7a7aSBaptiste Daroussin 
13239ee7a7aSBaptiste Daroussin 	while (!feof (in) && !ferror (in)) {
13339ee7a7aSBaptiste Daroussin 		if (r == bufsize) {
13439ee7a7aSBaptiste Daroussin 			inbuf = realloc (inbuf, bufsize * 2);
13539ee7a7aSBaptiste Daroussin 			bufsize *= 2;
13639ee7a7aSBaptiste Daroussin 			if (inbuf == NULL) {
13739ee7a7aSBaptiste Daroussin 				perror ("realloc");
13839ee7a7aSBaptiste Daroussin 				exit (EXIT_FAILURE);
139c99fb5f9SBaptiste Daroussin 			}
14039ee7a7aSBaptiste Daroussin 		}
14139ee7a7aSBaptiste Daroussin 		r += fread (inbuf + r, 1, bufsize - r, in);
14239ee7a7aSBaptiste Daroussin 	}
14339ee7a7aSBaptiste Daroussin 
14439ee7a7aSBaptiste Daroussin 	if (ferror (in)) {
14539ee7a7aSBaptiste Daroussin 		fprintf (stderr, "Failed to read the input file.\n");
14639ee7a7aSBaptiste Daroussin 		exit (EXIT_FAILURE);
14739ee7a7aSBaptiste Daroussin 	}
14839ee7a7aSBaptiste Daroussin 
149c99fb5f9SBaptiste Daroussin 	ucl_parser_add_chunk (parser, inbuf, r);
150c99fb5f9SBaptiste Daroussin 	fclose (in);
151c99fb5f9SBaptiste Daroussin 	if (ucl_parser_get_error(parser)) {
152*a0409676SBaptiste Daroussin 		printf ("Error occurred: %s\n", ucl_parser_get_error(parser));
153c99fb5f9SBaptiste Daroussin 		ret = 1;
154c99fb5f9SBaptiste Daroussin 		goto end;
155c99fb5f9SBaptiste Daroussin 	}
156c99fb5f9SBaptiste Daroussin 
157c99fb5f9SBaptiste Daroussin 	obj = ucl_parser_get_object (parser);
158c99fb5f9SBaptiste Daroussin 	if (ucl_parser_get_error (parser)) {
159*a0409676SBaptiste Daroussin 		printf ("Error occurred: %s\n", ucl_parser_get_error(parser));
160c99fb5f9SBaptiste Daroussin 		ret = 1;
161c99fb5f9SBaptiste Daroussin 		goto end;
162c99fb5f9SBaptiste Daroussin 	}
163c99fb5f9SBaptiste Daroussin 
164c99fb5f9SBaptiste Daroussin 	if (argc > 2) {
165c99fb5f9SBaptiste Daroussin 		for (k = 2; k < argc; k++) {
166c99fb5f9SBaptiste Daroussin 			printf ("search for \"%s\"... ", argv[k]);
167d9f0ce31SBaptiste Daroussin 			par = ucl_object_lookup (obj, argv[k]);
168c99fb5f9SBaptiste Daroussin 			printf ("%sfound\n", (par == NULL )?"not ":"");
169c99fb5f9SBaptiste Daroussin 			ucl_obj_dump (par, 0);
170c99fb5f9SBaptiste Daroussin 		}
171c99fb5f9SBaptiste Daroussin 	}
172c99fb5f9SBaptiste Daroussin 	else {
173c99fb5f9SBaptiste Daroussin 		ucl_obj_dump (obj, 0);
174c99fb5f9SBaptiste Daroussin 	}
175c99fb5f9SBaptiste Daroussin 
176c99fb5f9SBaptiste Daroussin end:
177c99fb5f9SBaptiste Daroussin 	if (parser != NULL) {
178c99fb5f9SBaptiste Daroussin 		ucl_parser_free (parser);
179c99fb5f9SBaptiste Daroussin 	}
180c99fb5f9SBaptiste Daroussin 	if (obj != NULL) {
181c99fb5f9SBaptiste Daroussin 		ucl_object_unref (obj);
182c99fb5f9SBaptiste Daroussin 	}
183c99fb5f9SBaptiste Daroussin 
184c99fb5f9SBaptiste Daroussin 	return ret;
185c99fb5f9SBaptiste Daroussin }
186