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