xref: /aosp_15_r20/external/harfbuzz_ng/util/output-options.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
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