180028Stakawata/* Copyright (c) 2013, Dmitriy V. Reshetnikov 280028Stakawata * Copyright (c) 2013, Vsevolod Stakhov 380028Stakawata * All rights reserved. 4189903Sjkim * 5232076Sjkim * Redistribution and use in source and binary forms, with or without 680028Stakawata * modification, are permitted provided that the following conditions are met: 780028Stakawata * * Redistributions of source code must retain the above copyright 880028Stakawata * notice, this list of conditions and the following disclaimer. 980028Stakawata * * Redistributions in binary form must reproduce the above copyright 1080028Stakawata * notice, this list of conditions and the following disclaimer in the 1180028Stakawata * documentation and/or other materials provided with the distribution. 1280028Stakawata * 1380028Stakawata * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY 1480028Stakawata * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 1580028Stakawata * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 1680028Stakawata * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY 1780028Stakawata * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 1880028Stakawata * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 1980028Stakawata * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 2080028Stakawata * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2180028Stakawata * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 2280028Stakawata * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2380028Stakawata */ 2480028Stakawata 2580028Stakawata#include <stdio.h> 2680028Stakawata#include <errno.h> 2780028Stakawata 2880028Stakawata#include "ucl.h" 29118030Sobrien 30118030Sobrienvoid 31118030Sobrienucl_obj_dump (const ucl_object_t *obj, unsigned int shift) 32118030Sobrien{ 3380028Stakawata int num = shift * 4 + 5; 3480028Stakawata char *pre = (char *) malloc (num * sizeof(char)); 35232082Sjkim const ucl_object_t *cur, *tmp; 36189903Sjkim ucl_object_iter_t it = NULL, it_obj = NULL; 37189903Sjkim 38189903Sjkim pre[--num] = 0x00; 39189903Sjkim while (num--) 4080028Stakawata pre[num] = 0x20; 41189903Sjkim 42189903Sjkim tmp = obj; 43189903Sjkim 44232082Sjkim while ((obj = ucl_iterate_object (tmp, &it, false))) { 45189903Sjkim printf ("%sucl object address: %p\n", pre + 4, obj); 46214630Sjhb if (obj->key != NULL) { 47189903Sjkim printf ("%skey: \"%s\"\n", pre, ucl_object_key (obj)); 48189903Sjkim } 49189903Sjkim printf ("%sref: %hd\n", pre, obj->ref); 50231979Skib printf ("%slen: %u\n", pre, obj->len); 51189903Sjkim printf ("%sprev: %p\n", pre, obj->prev); 52189903Sjkim printf ("%snext: %p\n", pre, obj->next); 53214631Sjhb if (obj->type == UCL_OBJECT) { 54189903Sjkim printf ("%stype: UCL_OBJECT\n", pre); 55197863Sjkim printf ("%svalue: %p\n", pre, obj->value.ov); 56189903Sjkim while ((cur = ucl_iterate_object (obj, &it_obj, true))) { 57189903Sjkim ucl_obj_dump (cur, shift + 2); 58193530Sjkim } 59193530Sjkim } 6080028Stakawata else if (obj->type == UCL_ARRAY) { 6180028Stakawata printf ("%stype: UCL_ARRAY\n", pre); 62189903Sjkim printf ("%svalue: %p\n", pre, obj->value.av); 63189903Sjkim ucl_obj_dump (obj->value.av, shift + 2); 64189903Sjkim } 65189903Sjkim else if (obj->type == UCL_INT) { 66189903Sjkim printf ("%stype: UCL_INT\n", pre); 67189903Sjkim printf ("%svalue: %jd\n", pre, (intmax_t)ucl_object_toint (obj)); 68190341Sjkim } 69190341Sjkim else if (obj->type == UCL_FLOAT) { 70189903Sjkim printf ("%stype: UCL_FLOAT\n", pre); 71189903Sjkim printf ("%svalue: %f\n", pre, ucl_object_todouble (obj)); 72210777Sjkim } 73231979Skib else if (obj->type == UCL_STRING) { 74189903Sjkim printf ("%stype: UCL_STRING\n", pre); 75210777Sjkim printf ("%svalue: \"%s\"\n", pre, ucl_object_tostring (obj)); 76231979Skib } 77189903Sjkim else if (obj->type == UCL_BOOLEAN) { 78189903Sjkim printf ("%stype: UCL_BOOLEAN\n", pre); 79247881Savg printf ("%svalue: %s\n", pre, ucl_object_tostring_forced (obj)); 80247881Savg } 81247881Savg else if (obj->type == UCL_TIME) { 82247881Savg printf ("%stype: UCL_TIME\n", pre); 83232077Sjkim printf ("%svalue: %f\n", pre, ucl_object_todouble (obj)); 84189903Sjkim } 85197863Sjkim else if (obj->type == UCL_USERDATA) { 86189903Sjkim printf ("%stype: UCL_USERDATA\n", pre); 87189903Sjkim printf ("%svalue: %p\n", pre, obj->value.ud); 88189903Sjkim } 89189903Sjkim } 90222813Sattilio 91189903Sjkim free (pre); 92189903Sjkim} 93189903Sjkim 94189903Sjkimint 95189903Sjkimmain(int argc, char **argv) 96189903Sjkim{ 97189903Sjkim const char *fn = NULL; 98189903Sjkim char inbuf[8192]; 99189903Sjkim struct ucl_parser *parser; 100189903Sjkim int k, ret = 0, r = 0; 101189903Sjkim ucl_object_t *obj = NULL; 102189903Sjkim const ucl_object_t *par; 103189903Sjkim FILE *in; 104232082Sjkim 105232082Sjkim if (argc > 1) { 106232082Sjkim fn = argv[1]; 107189903Sjkim } 108189903Sjkim 109189903Sjkim if (fn != NULL) { 110189903Sjkim in = fopen (fn, "r"); 111189903Sjkim if (in == NULL) { 112189903Sjkim exit (-errno); 113189903Sjkim } 114189903Sjkim } 115189903Sjkim else { 116189903Sjkim in = stdin; 117210777Sjkim } 118231979Skib 119210777Sjkim parser = ucl_parser_new (0); 120189903Sjkim while (!feof (in) && r < (int)sizeof (inbuf)) { 121210777Sjkim r += fread (inbuf + r, 1, sizeof (inbuf) - r, in); 122189903Sjkim } 123189903Sjkim ucl_parser_add_chunk (parser, inbuf, r); 124189903Sjkim fclose (in); 125189903Sjkim if (ucl_parser_get_error(parser)) { 126189903Sjkim printf ("Error occured: %s\n", ucl_parser_get_error(parser)); 127189903Sjkim ret = 1; 128189903Sjkim goto end; 129189903Sjkim } 130189903Sjkim 131189903Sjkim obj = ucl_parser_get_object (parser); 132189903Sjkim if (ucl_parser_get_error (parser)) { 133189903Sjkim printf ("Error occured: %s\n", ucl_parser_get_error(parser)); 134189903Sjkim ret = 1; 135189903Sjkim goto end; 136189903Sjkim } 137189903Sjkim 138189903Sjkim if (argc > 2) { 139189903Sjkim for (k = 2; k < argc; k++) { 140189903Sjkim printf ("search for \"%s\"... ", argv[k]); 141189903Sjkim par = ucl_object_find_key (obj, argv[k]); 142189903Sjkim printf ("%sfound\n", (par == NULL )?"not ":""); 143189903Sjkim ucl_obj_dump (par, 0); 144189903Sjkim } 145189903Sjkim } 146189903Sjkim else { 147189903Sjkim ucl_obj_dump (obj, 0); 148189903Sjkim } 149189903Sjkim 150189903Sjkimend: 151189903Sjkim if (parser != NULL) { 152189903Sjkim ucl_parser_free (parser); 153189903Sjkim } 154189903Sjkim if (obj != NULL) { 155189903Sjkim ucl_object_unref (obj); 156189903Sjkim } 157189903Sjkim 158189903Sjkim return ret; 159189903Sjkim} 160189903Sjkim