1*2d1272b8SAndroid Build Coastguard Worker /* 2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2011 Google, Inc. 3*2d1272b8SAndroid Build Coastguard Worker * 4*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library. 5*2d1272b8SAndroid Build Coastguard Worker * 6*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without 7*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this 8*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the 9*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in 10*2d1272b8SAndroid Build Coastguard Worker * all copies of this software. 11*2d1272b8SAndroid Build Coastguard Worker * 12*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 13*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 14*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 15*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 16*2d1272b8SAndroid Build Coastguard Worker * DAMAGE. 17*2d1272b8SAndroid Build Coastguard Worker * 18*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 19*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 20*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 21*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 22*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 23*2d1272b8SAndroid Build Coastguard Worker * 24*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod 25*2d1272b8SAndroid Build Coastguard Worker */ 26*2d1272b8SAndroid Build Coastguard Worker 27*2d1272b8SAndroid Build Coastguard Worker #ifndef OUTPUT_OPTIONS_HH 28*2d1272b8SAndroid Build Coastguard Worker #define OUTPUT_OPTIONS_HH 29*2d1272b8SAndroid Build Coastguard Worker 30*2d1272b8SAndroid Build Coastguard Worker #include "options.hh" 31*2d1272b8SAndroid Build Coastguard Worker 32*2d1272b8SAndroid Build Coastguard Worker template <bool default_stdout = true> 33*2d1272b8SAndroid Build Coastguard Worker struct output_options_t 34*2d1272b8SAndroid Build Coastguard Worker { ~output_options_toutput_options_t35*2d1272b8SAndroid Build Coastguard Worker ~output_options_t () 36*2d1272b8SAndroid Build Coastguard Worker { 37*2d1272b8SAndroid Build Coastguard Worker g_free (output_file); 38*2d1272b8SAndroid Build Coastguard Worker g_free (output_format); 39*2d1272b8SAndroid Build Coastguard Worker if (out_fp && out_fp != stdout) 40*2d1272b8SAndroid Build Coastguard Worker fclose (out_fp); 41*2d1272b8SAndroid Build Coastguard Worker } 42*2d1272b8SAndroid Build Coastguard Worker add_optionsoutput_options_t43*2d1272b8SAndroid Build Coastguard Worker void add_options (option_parser_t *parser, 44*2d1272b8SAndroid Build Coastguard Worker const char **supported_formats = nullptr) 45*2d1272b8SAndroid Build Coastguard Worker { 46*2d1272b8SAndroid Build Coastguard Worker const char *text = nullptr; 47*2d1272b8SAndroid Build Coastguard Worker 48*2d1272b8SAndroid Build Coastguard Worker if (supported_formats) 49*2d1272b8SAndroid Build Coastguard Worker { 50*2d1272b8SAndroid Build Coastguard Worker char *items = g_strjoinv ("/", const_cast<char **> (supported_formats)); 51*2d1272b8SAndroid Build Coastguard Worker text = g_strdup_printf ("Set output format\n\n Supported output formats are: %s", items); 52*2d1272b8SAndroid Build Coastguard Worker g_free (items); 53*2d1272b8SAndroid Build Coastguard Worker parser->free_later ((char *) text); 54*2d1272b8SAndroid Build Coastguard Worker } 55*2d1272b8SAndroid Build Coastguard Worker 56*2d1272b8SAndroid Build Coastguard Worker GOptionEntry entries[] = 57*2d1272b8SAndroid Build Coastguard Worker { 58*2d1272b8SAndroid Build Coastguard Worker {"output-file", 'o', 0, G_OPTION_ARG_STRING, &this->output_file, "Set output file-name (default: stdout)","filename"}, 59*2d1272b8SAndroid Build Coastguard Worker {"output-format", 'O', supported_formats ? 0 : G_OPTION_FLAG_HIDDEN, 60*2d1272b8SAndroid Build Coastguard Worker G_OPTION_ARG_STRING, &this->output_format, text, "format"}, 61*2d1272b8SAndroid Build Coastguard Worker {nullptr} 62*2d1272b8SAndroid Build Coastguard Worker }; 63*2d1272b8SAndroid Build Coastguard Worker parser->add_group (entries, 64*2d1272b8SAndroid Build Coastguard Worker "output", 65*2d1272b8SAndroid Build Coastguard Worker "Output destination & format options:", 66*2d1272b8SAndroid Build Coastguard Worker "Options for the destination & form of the output", 67*2d1272b8SAndroid Build Coastguard Worker this); 68*2d1272b8SAndroid Build Coastguard Worker } 69*2d1272b8SAndroid Build Coastguard Worker post_parseoutput_options_t70*2d1272b8SAndroid Build Coastguard Worker void post_parse (GError **error) 71*2d1272b8SAndroid Build Coastguard Worker { 72*2d1272b8SAndroid Build Coastguard Worker if (output_format) 73*2d1272b8SAndroid Build Coastguard Worker explicit_output_format = true; 74*2d1272b8SAndroid Build Coastguard Worker 75*2d1272b8SAndroid Build Coastguard Worker if (output_file && !output_format) 76*2d1272b8SAndroid Build Coastguard Worker { 77*2d1272b8SAndroid Build Coastguard Worker output_format = strrchr (output_file, '.'); 78*2d1272b8SAndroid Build Coastguard Worker if (output_format) 79*2d1272b8SAndroid Build Coastguard Worker { 80*2d1272b8SAndroid Build Coastguard Worker output_format++; /* skip the dot */ 81*2d1272b8SAndroid Build Coastguard Worker output_format = g_strdup (output_format); 82*2d1272b8SAndroid Build Coastguard Worker } 83*2d1272b8SAndroid Build Coastguard Worker } 84*2d1272b8SAndroid Build Coastguard Worker 85*2d1272b8SAndroid Build Coastguard Worker if (output_file && 0 != strcmp (output_file, "-")) 86*2d1272b8SAndroid Build Coastguard Worker out_fp = fopen (output_file, "wb"); 87*2d1272b8SAndroid Build Coastguard Worker else 88*2d1272b8SAndroid Build Coastguard Worker { 89*2d1272b8SAndroid Build Coastguard Worker if (!default_stdout && !output_file) 90*2d1272b8SAndroid Build Coastguard Worker { 91*2d1272b8SAndroid Build Coastguard Worker g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED, 92*2d1272b8SAndroid Build Coastguard Worker "No output file was specified"); 93*2d1272b8SAndroid Build Coastguard Worker return; 94*2d1272b8SAndroid Build Coastguard Worker } 95*2d1272b8SAndroid Build Coastguard Worker 96*2d1272b8SAndroid Build Coastguard Worker #if defined(_WIN32) || defined(__CYGWIN__) 97*2d1272b8SAndroid Build Coastguard Worker setmode (fileno (stdout), O_BINARY); 98*2d1272b8SAndroid Build Coastguard Worker #endif 99*2d1272b8SAndroid Build Coastguard Worker out_fp = stdout; 100*2d1272b8SAndroid Build Coastguard Worker } 101*2d1272b8SAndroid Build Coastguard Worker if (!out_fp) 102*2d1272b8SAndroid Build Coastguard Worker { 103*2d1272b8SAndroid Build Coastguard Worker g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED, 104*2d1272b8SAndroid Build Coastguard Worker "Cannot open output file `%s': %s", 105*2d1272b8SAndroid Build Coastguard Worker g_filename_display_name (output_file), strerror (errno)); 106*2d1272b8SAndroid Build Coastguard Worker return; 107*2d1272b8SAndroid Build Coastguard Worker } 108*2d1272b8SAndroid Build Coastguard Worker } 109*2d1272b8SAndroid Build Coastguard Worker 110*2d1272b8SAndroid Build Coastguard Worker char *output_file = nullptr; 111*2d1272b8SAndroid Build Coastguard Worker char *output_format = nullptr; 112*2d1272b8SAndroid Build Coastguard Worker 113*2d1272b8SAndroid Build Coastguard Worker bool explicit_output_format = false; 114*2d1272b8SAndroid Build Coastguard Worker FILE *out_fp = nullptr; 115*2d1272b8SAndroid Build Coastguard Worker }; 116*2d1272b8SAndroid Build Coastguard Worker 117*2d1272b8SAndroid Build Coastguard Worker #endif 118