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