1c99fb5f9SBaptiste Daroussin /* Copyright (c) 2013, Vsevolod Stakhov 2c99fb5f9SBaptiste Daroussin * All rights reserved. 3c99fb5f9SBaptiste Daroussin * 4c99fb5f9SBaptiste Daroussin * Redistribution and use in source and binary forms, with or without 5c99fb5f9SBaptiste Daroussin * modification, are permitted provided that the following conditions are met: 6c99fb5f9SBaptiste Daroussin * * Redistributions of source code must retain the above copyright 7c99fb5f9SBaptiste Daroussin * notice, this list of conditions and the following disclaimer. 8c99fb5f9SBaptiste Daroussin * * Redistributions in binary form must reproduce the above copyright 9c99fb5f9SBaptiste Daroussin * notice, this list of conditions and the following disclaimer in the 10c99fb5f9SBaptiste Daroussin * documentation and/or other materials provided with the distribution. 11c99fb5f9SBaptiste Daroussin * 12c99fb5f9SBaptiste Daroussin * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY 13c99fb5f9SBaptiste Daroussin * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 14c99fb5f9SBaptiste Daroussin * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 15c99fb5f9SBaptiste Daroussin * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY 16c99fb5f9SBaptiste Daroussin * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 17c99fb5f9SBaptiste Daroussin * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 18c99fb5f9SBaptiste Daroussin * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 19c99fb5f9SBaptiste Daroussin * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 20c99fb5f9SBaptiste Daroussin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 21c99fb5f9SBaptiste Daroussin * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 22c99fb5f9SBaptiste Daroussin */ 23c99fb5f9SBaptiste Daroussin 24c99fb5f9SBaptiste Daroussin #include "ucl.h" 2597bd480fSBaptiste Daroussin #include "ucl_internal.h" 26c99fb5f9SBaptiste Daroussin 27c99fb5f9SBaptiste Daroussin int 28c99fb5f9SBaptiste Daroussin main (int argc, char **argv) 29c99fb5f9SBaptiste Daroussin { 30c99fb5f9SBaptiste Daroussin char inbuf[8192], *test_in = NULL; 31c99fb5f9SBaptiste Daroussin struct ucl_parser *parser = NULL, *parser2 = NULL; 32c99fb5f9SBaptiste Daroussin ucl_object_t *obj; 33c99fb5f9SBaptiste Daroussin FILE *in, *out; 34c99fb5f9SBaptiste Daroussin unsigned char *emitted = NULL; 35c99fb5f9SBaptiste Daroussin const char *fname_in = NULL, *fname_out = NULL; 36c99fb5f9SBaptiste Daroussin int ret = 0, inlen, opt, json = 0; 37c99fb5f9SBaptiste Daroussin 38c99fb5f9SBaptiste Daroussin while ((opt = getopt(argc, argv, "j")) != -1) { 39c99fb5f9SBaptiste Daroussin switch (opt) { 40c99fb5f9SBaptiste Daroussin case 'j': 41c99fb5f9SBaptiste Daroussin json = 1; 42c99fb5f9SBaptiste Daroussin break; 43c99fb5f9SBaptiste Daroussin default: /* '?' */ 44c99fb5f9SBaptiste Daroussin fprintf (stderr, "Usage: %s [-j] [in] [out]\n", 45c99fb5f9SBaptiste Daroussin argv[0]); 46c99fb5f9SBaptiste Daroussin exit (EXIT_FAILURE); 47c99fb5f9SBaptiste Daroussin } 48c99fb5f9SBaptiste Daroussin } 49c99fb5f9SBaptiste Daroussin 50c99fb5f9SBaptiste Daroussin argc -= optind; 51c99fb5f9SBaptiste Daroussin argv += optind; 52c99fb5f9SBaptiste Daroussin 53c99fb5f9SBaptiste Daroussin switch (argc) { 54c99fb5f9SBaptiste Daroussin case 1: 55c99fb5f9SBaptiste Daroussin fname_in = argv[0]; 56c99fb5f9SBaptiste Daroussin break; 57c99fb5f9SBaptiste Daroussin case 2: 58c99fb5f9SBaptiste Daroussin fname_in = argv[0]; 59c99fb5f9SBaptiste Daroussin fname_out = argv[1]; 60c99fb5f9SBaptiste Daroussin break; 61c99fb5f9SBaptiste Daroussin } 62c99fb5f9SBaptiste Daroussin 63c99fb5f9SBaptiste Daroussin if (fname_in != NULL) { 64c99fb5f9SBaptiste Daroussin in = fopen (fname_in, "r"); 65c99fb5f9SBaptiste Daroussin if (in == NULL) { 66c99fb5f9SBaptiste Daroussin exit (-errno); 67c99fb5f9SBaptiste Daroussin } 68c99fb5f9SBaptiste Daroussin } 69c99fb5f9SBaptiste Daroussin else { 70c99fb5f9SBaptiste Daroussin in = stdin; 71c99fb5f9SBaptiste Daroussin } 72c99fb5f9SBaptiste Daroussin parser = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE); 73c99fb5f9SBaptiste Daroussin ucl_parser_register_variable (parser, "ABI", "unknown"); 74c99fb5f9SBaptiste Daroussin 75c99fb5f9SBaptiste Daroussin if (fname_in != NULL) { 76c99fb5f9SBaptiste Daroussin ucl_parser_set_filevars (parser, fname_in, true); 77c99fb5f9SBaptiste Daroussin } 78c99fb5f9SBaptiste Daroussin 79c99fb5f9SBaptiste Daroussin while (!feof (in)) { 80c99fb5f9SBaptiste Daroussin memset (inbuf, 0, sizeof (inbuf)); 81*b04a7a0bSBaptiste Daroussin if (fread (inbuf, 1, sizeof (inbuf) - 1, in) == 0) { 82*b04a7a0bSBaptiste Daroussin break; 83*b04a7a0bSBaptiste Daroussin } 84c99fb5f9SBaptiste Daroussin inlen = strlen (inbuf); 85c99fb5f9SBaptiste Daroussin test_in = malloc (inlen); 86c99fb5f9SBaptiste Daroussin memcpy (test_in, inbuf, inlen); 87c99fb5f9SBaptiste Daroussin ucl_parser_add_chunk (parser, test_in, inlen); 88c99fb5f9SBaptiste Daroussin } 89c99fb5f9SBaptiste Daroussin fclose (in); 90c99fb5f9SBaptiste Daroussin 91c99fb5f9SBaptiste Daroussin if (fname_out != NULL) { 92c99fb5f9SBaptiste Daroussin out = fopen (fname_out, "w"); 93c99fb5f9SBaptiste Daroussin if (out == NULL) { 94c99fb5f9SBaptiste Daroussin exit (-errno); 95c99fb5f9SBaptiste Daroussin } 96c99fb5f9SBaptiste Daroussin } 97c99fb5f9SBaptiste Daroussin else { 98c99fb5f9SBaptiste Daroussin out = stdout; 99c99fb5f9SBaptiste Daroussin } 100c99fb5f9SBaptiste Daroussin if (ucl_parser_get_error (parser) != NULL) { 101c99fb5f9SBaptiste Daroussin fprintf (out, "Error occurred: %s\n", ucl_parser_get_error(parser)); 102c99fb5f9SBaptiste Daroussin ret = 1; 103c99fb5f9SBaptiste Daroussin goto end; 104c99fb5f9SBaptiste Daroussin } 105c99fb5f9SBaptiste Daroussin obj = ucl_parser_get_object (parser); 106c99fb5f9SBaptiste Daroussin if (json) { 107c99fb5f9SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_JSON); 108c99fb5f9SBaptiste Daroussin } 109c99fb5f9SBaptiste Daroussin else { 110c99fb5f9SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_CONFIG); 111c99fb5f9SBaptiste Daroussin } 112c99fb5f9SBaptiste Daroussin ucl_parser_free (parser); 113c99fb5f9SBaptiste Daroussin ucl_object_unref (obj); 114c99fb5f9SBaptiste Daroussin parser2 = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE); 11597bd480fSBaptiste Daroussin ucl_parser_add_string (parser2, emitted, 0); 116c99fb5f9SBaptiste Daroussin 117c99fb5f9SBaptiste Daroussin if (ucl_parser_get_error(parser2) != NULL) { 118c99fb5f9SBaptiste Daroussin fprintf (out, "Error occurred: %s\n", ucl_parser_get_error(parser2)); 119c99fb5f9SBaptiste Daroussin fprintf (out, "%s\n", emitted); 120c99fb5f9SBaptiste Daroussin ret = 1; 121c99fb5f9SBaptiste Daroussin goto end; 122c99fb5f9SBaptiste Daroussin } 123c99fb5f9SBaptiste Daroussin if (emitted != NULL) { 124c99fb5f9SBaptiste Daroussin free (emitted); 125c99fb5f9SBaptiste Daroussin } 126c99fb5f9SBaptiste Daroussin obj = ucl_parser_get_object (parser2); 127c99fb5f9SBaptiste Daroussin if (json) { 128c99fb5f9SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_JSON); 129c99fb5f9SBaptiste Daroussin } 130c99fb5f9SBaptiste Daroussin else { 131c99fb5f9SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_CONFIG); 132c99fb5f9SBaptiste Daroussin } 133c99fb5f9SBaptiste Daroussin 134c99fb5f9SBaptiste Daroussin fprintf (out, "%s\n", emitted); 135c99fb5f9SBaptiste Daroussin ucl_object_unref (obj); 136c99fb5f9SBaptiste Daroussin 137c99fb5f9SBaptiste Daroussin end: 138c99fb5f9SBaptiste Daroussin if (emitted != NULL) { 139c99fb5f9SBaptiste Daroussin free (emitted); 140c99fb5f9SBaptiste Daroussin } 141c99fb5f9SBaptiste Daroussin if (parser2 != NULL) { 142c99fb5f9SBaptiste Daroussin ucl_parser_free (parser2); 143c99fb5f9SBaptiste Daroussin } 144c99fb5f9SBaptiste Daroussin if (test_in != NULL) { 145c99fb5f9SBaptiste Daroussin free (test_in); 146c99fb5f9SBaptiste Daroussin } 147c99fb5f9SBaptiste Daroussin 148c99fb5f9SBaptiste Daroussin fclose (out); 149c99fb5f9SBaptiste Daroussin 150c99fb5f9SBaptiste Daroussin return ret; 151c99fb5f9SBaptiste Daroussin } 152