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; 36*3dcf5eb7SBaptiste Daroussin int ret = 0, inlen, opt, json = 0, compact = 0, yaml = 0; 37c99fb5f9SBaptiste Daroussin 38*3dcf5eb7SBaptiste Daroussin while ((opt = getopt(argc, argv, "jcy")) != -1) { 39c99fb5f9SBaptiste Daroussin switch (opt) { 40c99fb5f9SBaptiste Daroussin case 'j': 41c99fb5f9SBaptiste Daroussin json = 1; 42c99fb5f9SBaptiste Daroussin break; 43*3dcf5eb7SBaptiste Daroussin case 'c': 44*3dcf5eb7SBaptiste Daroussin compact = 1; 45*3dcf5eb7SBaptiste Daroussin break; 46*3dcf5eb7SBaptiste Daroussin case 'y': 47*3dcf5eb7SBaptiste Daroussin yaml = 1; 48*3dcf5eb7SBaptiste Daroussin break; 49c99fb5f9SBaptiste Daroussin default: /* '?' */ 50*3dcf5eb7SBaptiste Daroussin fprintf (stderr, "Usage: %s [-jcy] [in] [out]\n", 51c99fb5f9SBaptiste Daroussin argv[0]); 52c99fb5f9SBaptiste Daroussin exit (EXIT_FAILURE); 53c99fb5f9SBaptiste Daroussin } 54c99fb5f9SBaptiste Daroussin } 55c99fb5f9SBaptiste Daroussin 56c99fb5f9SBaptiste Daroussin argc -= optind; 57c99fb5f9SBaptiste Daroussin argv += optind; 58c99fb5f9SBaptiste Daroussin 59c99fb5f9SBaptiste Daroussin switch (argc) { 60c99fb5f9SBaptiste Daroussin case 1: 61c99fb5f9SBaptiste Daroussin fname_in = argv[0]; 62c99fb5f9SBaptiste Daroussin break; 63c99fb5f9SBaptiste Daroussin case 2: 64c99fb5f9SBaptiste Daroussin fname_in = argv[0]; 65c99fb5f9SBaptiste Daroussin fname_out = argv[1]; 66c99fb5f9SBaptiste Daroussin break; 67c99fb5f9SBaptiste Daroussin } 68c99fb5f9SBaptiste Daroussin 69c99fb5f9SBaptiste Daroussin if (fname_in != NULL) { 70c99fb5f9SBaptiste Daroussin in = fopen (fname_in, "r"); 71c99fb5f9SBaptiste Daroussin if (in == NULL) { 72c99fb5f9SBaptiste Daroussin exit (-errno); 73c99fb5f9SBaptiste Daroussin } 74c99fb5f9SBaptiste Daroussin } 75c99fb5f9SBaptiste Daroussin else { 76c99fb5f9SBaptiste Daroussin in = stdin; 77c99fb5f9SBaptiste Daroussin } 78c99fb5f9SBaptiste Daroussin parser = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE); 79c99fb5f9SBaptiste Daroussin ucl_parser_register_variable (parser, "ABI", "unknown"); 80c99fb5f9SBaptiste Daroussin 81c99fb5f9SBaptiste Daroussin if (fname_in != NULL) { 82c99fb5f9SBaptiste Daroussin ucl_parser_set_filevars (parser, fname_in, true); 83c99fb5f9SBaptiste Daroussin } 84c99fb5f9SBaptiste Daroussin 85c99fb5f9SBaptiste Daroussin while (!feof (in)) { 86c99fb5f9SBaptiste Daroussin memset (inbuf, 0, sizeof (inbuf)); 87b04a7a0bSBaptiste Daroussin if (fread (inbuf, 1, sizeof (inbuf) - 1, in) == 0) { 88b04a7a0bSBaptiste Daroussin break; 89b04a7a0bSBaptiste Daroussin } 90c99fb5f9SBaptiste Daroussin inlen = strlen (inbuf); 91c99fb5f9SBaptiste Daroussin test_in = malloc (inlen); 92c99fb5f9SBaptiste Daroussin memcpy (test_in, inbuf, inlen); 93c99fb5f9SBaptiste Daroussin ucl_parser_add_chunk (parser, test_in, inlen); 94c99fb5f9SBaptiste Daroussin } 95c99fb5f9SBaptiste Daroussin fclose (in); 96c99fb5f9SBaptiste Daroussin 97c99fb5f9SBaptiste Daroussin if (fname_out != NULL) { 98c99fb5f9SBaptiste Daroussin out = fopen (fname_out, "w"); 99c99fb5f9SBaptiste Daroussin if (out == NULL) { 100c99fb5f9SBaptiste Daroussin exit (-errno); 101c99fb5f9SBaptiste Daroussin } 102c99fb5f9SBaptiste Daroussin } 103c99fb5f9SBaptiste Daroussin else { 104c99fb5f9SBaptiste Daroussin out = stdout; 105c99fb5f9SBaptiste Daroussin } 106c99fb5f9SBaptiste Daroussin if (ucl_parser_get_error (parser) != NULL) { 107c99fb5f9SBaptiste Daroussin fprintf (out, "Error occurred: %s\n", ucl_parser_get_error(parser)); 108c99fb5f9SBaptiste Daroussin ret = 1; 109c99fb5f9SBaptiste Daroussin goto end; 110c99fb5f9SBaptiste Daroussin } 111c99fb5f9SBaptiste Daroussin obj = ucl_parser_get_object (parser); 112c99fb5f9SBaptiste Daroussin if (json) { 113*3dcf5eb7SBaptiste Daroussin if (compact) { 114*3dcf5eb7SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_JSON_COMPACT); 115*3dcf5eb7SBaptiste Daroussin } 116*3dcf5eb7SBaptiste Daroussin else { 117c99fb5f9SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_JSON); 118c99fb5f9SBaptiste Daroussin } 119*3dcf5eb7SBaptiste Daroussin } 120*3dcf5eb7SBaptiste Daroussin else if (yaml) { 121*3dcf5eb7SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_YAML); 122*3dcf5eb7SBaptiste Daroussin } 123c99fb5f9SBaptiste Daroussin else { 124c99fb5f9SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_CONFIG); 125c99fb5f9SBaptiste Daroussin } 126c99fb5f9SBaptiste Daroussin ucl_parser_free (parser); 127c99fb5f9SBaptiste Daroussin ucl_object_unref (obj); 128c99fb5f9SBaptiste Daroussin parser2 = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE); 12997bd480fSBaptiste Daroussin ucl_parser_add_string (parser2, emitted, 0); 130c99fb5f9SBaptiste Daroussin 131c99fb5f9SBaptiste Daroussin if (ucl_parser_get_error(parser2) != NULL) { 132c99fb5f9SBaptiste Daroussin fprintf (out, "Error occurred: %s\n", ucl_parser_get_error(parser2)); 133c99fb5f9SBaptiste Daroussin fprintf (out, "%s\n", emitted); 134c99fb5f9SBaptiste Daroussin ret = 1; 135c99fb5f9SBaptiste Daroussin goto end; 136c99fb5f9SBaptiste Daroussin } 137c99fb5f9SBaptiste Daroussin if (emitted != NULL) { 138c99fb5f9SBaptiste Daroussin free (emitted); 139c99fb5f9SBaptiste Daroussin } 140c99fb5f9SBaptiste Daroussin obj = ucl_parser_get_object (parser2); 141c99fb5f9SBaptiste Daroussin if (json) { 142*3dcf5eb7SBaptiste Daroussin if (compact) { 143*3dcf5eb7SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_JSON_COMPACT); 144*3dcf5eb7SBaptiste Daroussin } 145*3dcf5eb7SBaptiste Daroussin else { 146c99fb5f9SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_JSON); 147c99fb5f9SBaptiste Daroussin } 148*3dcf5eb7SBaptiste Daroussin } 149*3dcf5eb7SBaptiste Daroussin else if (yaml) { 150*3dcf5eb7SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_YAML); 151*3dcf5eb7SBaptiste Daroussin } 152c99fb5f9SBaptiste Daroussin else { 153c99fb5f9SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_CONFIG); 154c99fb5f9SBaptiste Daroussin } 155c99fb5f9SBaptiste Daroussin 156c99fb5f9SBaptiste Daroussin fprintf (out, "%s\n", emitted); 157c99fb5f9SBaptiste Daroussin ucl_object_unref (obj); 158c99fb5f9SBaptiste Daroussin 159c99fb5f9SBaptiste Daroussin end: 160c99fb5f9SBaptiste Daroussin if (emitted != NULL) { 161c99fb5f9SBaptiste Daroussin free (emitted); 162c99fb5f9SBaptiste Daroussin } 163c99fb5f9SBaptiste Daroussin if (parser2 != NULL) { 164c99fb5f9SBaptiste Daroussin ucl_parser_free (parser2); 165c99fb5f9SBaptiste Daroussin } 166c99fb5f9SBaptiste Daroussin if (test_in != NULL) { 167c99fb5f9SBaptiste Daroussin free (test_in); 168c99fb5f9SBaptiste Daroussin } 169c99fb5f9SBaptiste Daroussin 170c99fb5f9SBaptiste Daroussin fclose (out); 171c99fb5f9SBaptiste Daroussin 172c99fb5f9SBaptiste Daroussin return ret; 173c99fb5f9SBaptiste Daroussin } 174