1262395Sbapt/* Copyright (c) 2013, Dmitriy V. Reshetnikov
2262395Sbapt * Copyright (c) 2013, Vsevolod Stakhov
3262395Sbapt * All rights reserved.
4262395Sbapt *
5262395Sbapt * Redistribution and use in source and binary forms, with or without
6262395Sbapt * modification, are permitted provided that the following conditions are met:
7262395Sbapt *       * Redistributions of source code must retain the above copyright
8262395Sbapt *         notice, this list of conditions and the following disclaimer.
9262395Sbapt *       * Redistributions in binary form must reproduce the above copyright
10262395Sbapt *         notice, this list of conditions and the following disclaimer in the
11262395Sbapt *         documentation and/or other materials provided with the distribution.
12262395Sbapt *
13262395Sbapt * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
14262395Sbapt * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15262395Sbapt * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16262395Sbapt * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
17262395Sbapt * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18262395Sbapt * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19262395Sbapt * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20262395Sbapt * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21262395Sbapt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22262395Sbapt * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23262395Sbapt */
24262395Sbapt
25262395Sbapt#include <stdio.h>
26262395Sbapt#include <errno.h>
27262395Sbapt
28262395Sbapt#include "ucl.h"
29262395Sbapt
30262395Sbaptvoid
31268896Sbaptucl_obj_dump (const ucl_object_t *obj, unsigned int shift)
32262395Sbapt{
33262395Sbapt	int num = shift * 4 + 5;
34262395Sbapt	char *pre = (char *) malloc (num * sizeof(char));
35268896Sbapt	const ucl_object_t *cur, *tmp;
36262395Sbapt	ucl_object_iter_t it = NULL, it_obj = NULL;
37262395Sbapt
38262395Sbapt	pre[--num] = 0x00;
39262395Sbapt	while (num--)
40262395Sbapt		pre[num] = 0x20;
41262395Sbapt
42262395Sbapt	tmp = obj;
43262395Sbapt
44262395Sbapt	while ((obj = ucl_iterate_object (tmp, &it, false))) {
45262395Sbapt		printf ("%sucl object address: %p\n", pre + 4, obj);
46262395Sbapt		if (obj->key != NULL) {
47262395Sbapt			printf ("%skey: \"%s\"\n", pre, ucl_object_key (obj));
48262395Sbapt		}
49262395Sbapt		printf ("%sref: %hd\n", pre, obj->ref);
50262395Sbapt		printf ("%slen: %u\n", pre, obj->len);
51262395Sbapt		printf ("%sprev: %p\n", pre, obj->prev);
52262395Sbapt		printf ("%snext: %p\n", pre, obj->next);
53262395Sbapt		if (obj->type == UCL_OBJECT) {
54262395Sbapt			printf ("%stype: UCL_OBJECT\n", pre);
55262395Sbapt			printf ("%svalue: %p\n", pre, obj->value.ov);
56262395Sbapt			while ((cur = ucl_iterate_object (obj, &it_obj, true))) {
57262395Sbapt				ucl_obj_dump (cur, shift + 2);
58262395Sbapt			}
59262395Sbapt		}
60262395Sbapt		else if (obj->type == UCL_ARRAY) {
61262395Sbapt			printf ("%stype: UCL_ARRAY\n", pre);
62262395Sbapt			printf ("%svalue: %p\n", pre, obj->value.av);
63262395Sbapt			ucl_obj_dump (obj->value.av, shift + 2);
64262395Sbapt		}
65262395Sbapt		else if (obj->type == UCL_INT) {
66262395Sbapt			printf ("%stype: UCL_INT\n", pre);
67268896Sbapt			printf ("%svalue: %jd\n", pre, (intmax_t)ucl_object_toint (obj));
68262395Sbapt		}
69262395Sbapt		else if (obj->type == UCL_FLOAT) {
70262395Sbapt			printf ("%stype: UCL_FLOAT\n", pre);
71262395Sbapt			printf ("%svalue: %f\n", pre, ucl_object_todouble (obj));
72262395Sbapt		}
73262395Sbapt		else if (obj->type == UCL_STRING) {
74262395Sbapt			printf ("%stype: UCL_STRING\n", pre);
75262395Sbapt			printf ("%svalue: \"%s\"\n", pre, ucl_object_tostring (obj));
76262395Sbapt		}
77262395Sbapt		else if (obj->type == UCL_BOOLEAN) {
78262395Sbapt			printf ("%stype: UCL_BOOLEAN\n", pre);
79262395Sbapt			printf ("%svalue: %s\n", pre, ucl_object_tostring_forced (obj));
80262395Sbapt		}
81262395Sbapt		else if (obj->type == UCL_TIME) {
82262395Sbapt			printf ("%stype: UCL_TIME\n", pre);
83262395Sbapt			printf ("%svalue: %f\n", pre, ucl_object_todouble (obj));
84262395Sbapt		}
85262395Sbapt		else if (obj->type == UCL_USERDATA) {
86262395Sbapt			printf ("%stype: UCL_USERDATA\n", pre);
87262395Sbapt			printf ("%svalue: %p\n", pre, obj->value.ud);
88262395Sbapt		}
89262395Sbapt	}
90262395Sbapt
91262395Sbapt	free (pre);
92262395Sbapt}
93262395Sbapt
94262395Sbaptint
95262395Sbaptmain(int argc, char **argv)
96262395Sbapt{
97262395Sbapt	const char *fn = NULL;
98262395Sbapt	char inbuf[8192];
99262395Sbapt	struct ucl_parser *parser;
100262395Sbapt	int k, ret = 0, r = 0;
101262395Sbapt	ucl_object_t *obj = NULL;
102268896Sbapt	const ucl_object_t *par;
103262395Sbapt	FILE *in;
104262395Sbapt
105262395Sbapt	if (argc > 1) {
106262395Sbapt		fn = argv[1];
107262395Sbapt	}
108262395Sbapt
109262395Sbapt	if (fn != NULL) {
110262395Sbapt		in = fopen (fn, "r");
111262395Sbapt		if (in == NULL) {
112262395Sbapt			exit (-errno);
113262395Sbapt		}
114262395Sbapt	}
115262395Sbapt	else {
116262395Sbapt		in = stdin;
117262395Sbapt	}
118262395Sbapt
119262395Sbapt	parser = ucl_parser_new (0);
120262395Sbapt	while (!feof (in) && r < (int)sizeof (inbuf)) {
121262395Sbapt		r += fread (inbuf + r, 1, sizeof (inbuf) - r, in);
122262395Sbapt	}
123262395Sbapt	ucl_parser_add_chunk (parser, inbuf, r);
124262395Sbapt	fclose (in);
125262395Sbapt	if (ucl_parser_get_error(parser)) {
126262395Sbapt		printf ("Error occured: %s\n", ucl_parser_get_error(parser));
127262395Sbapt		ret = 1;
128262395Sbapt		goto end;
129262395Sbapt	}
130262395Sbapt
131262395Sbapt	obj = ucl_parser_get_object (parser);
132268896Sbapt	if (ucl_parser_get_error (parser)) {
133262395Sbapt		printf ("Error occured: %s\n", ucl_parser_get_error(parser));
134262395Sbapt		ret = 1;
135262395Sbapt		goto end;
136262395Sbapt	}
137262395Sbapt
138262395Sbapt	if (argc > 2) {
139262395Sbapt		for (k = 2; k < argc; k++) {
140262395Sbapt			printf ("search for \"%s\"... ", argv[k]);
141262395Sbapt			par = ucl_object_find_key (obj, argv[k]);
142262395Sbapt			printf ("%sfound\n", (par == NULL )?"not ":"");
143262395Sbapt			ucl_obj_dump (par, 0);
144262395Sbapt		}
145262395Sbapt	}
146262395Sbapt	else {
147262395Sbapt		ucl_obj_dump (obj, 0);
148262395Sbapt	}
149262395Sbapt
150262395Sbaptend:
151262395Sbapt	if (parser != NULL) {
152262395Sbapt		ucl_parser_free (parser);
153262395Sbapt	}
154262395Sbapt	if (obj != NULL) {
155262395Sbapt		ucl_object_unref (obj);
156262395Sbapt	}
157262395Sbapt
158262395Sbapt	return ret;
159262395Sbapt}
160