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