options.hh revision 11e51993ab562d4c7460eb7c43d0e97404e628e7
13bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod/*
23bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * Copyright © 2011  Google, Inc.
33bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod *
43bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod *  This is part of HarfBuzz, a text shaping library.
53bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod *
63bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * Permission is hereby granted, without written agreement and without
73bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this
83bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * software and its documentation for any purpose, provided that the
93bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * above copyright notice and the following two paragraphs appear in
103bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * all copies of this software.
113bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod *
123bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
133bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
143bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
153bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
163bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * DAMAGE.
173bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod *
183bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
193bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
203bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
213bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
223bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
233bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod *
243bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * Google Author(s): Behdad Esfahbod
253bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod */
263bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
273bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod#include "common.hh"
283bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
293bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod#ifndef OPTIONS_HH
303bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod#define OPTIONS_HH
313bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
323bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
33b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodextern bool debug;
34b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
35b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct option_group_t
36b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod{
37b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  virtual void add_options (struct option_parser_t *parser) = 0;
38b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
39b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  virtual void pre_parse (GError **error G_GNUC_UNUSED) {};
40b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  virtual void post_parse (GError **error G_GNUC_UNUSED) {};
41b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
42b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
43b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
44b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct option_parser_t
45b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod{
46b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  option_parser_t (const char *usage) {
47b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    memset (this, 0, sizeof (*this));
48b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    usage_str = usage;
49b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    context = g_option_context_new (usage);
50b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
51b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    add_main_options ();
52b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
53b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  ~option_parser_t (void) {
54b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    g_option_context_free (context);
55b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
56b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
57b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_main_options (void);
58b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
59b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_group (GOptionEntry   *entries,
60b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod		  const gchar    *name,
61b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod		  const gchar    *description,
62b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod		  const gchar    *help_description,
63b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod		  option_group_t *option_group);
64b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
65b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void parse (int *argc, char ***argv);
66b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
67b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  G_GNUC_NORETURN void usage (void) {
68b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    g_printerr ("Usage: %s [OPTION...] %s\n", g_get_prgname (), usage_str);
69b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    exit (1);
70b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
71b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
72b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  const char *usage_str;
73b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  GOptionContext *context;
74b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
75b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
76b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
77109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod#define DEFAULT_MARGIN 18
78109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod#define DEFAULT_FORE "#000000"
79109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod#define DEFAULT_BACK "#FFFFFF"
8011e51993ab562d4c7460eb7c43d0e97404e628e7Behdad Esfahbod#define DEFAULT_FONT_SIZE 36
81109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod
82b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct view_options_t : option_group_t
833bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod{
84b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  view_options_t (option_parser_t *parser) {
85b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    annotate = false;
86109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod    fore = DEFAULT_FORE;
87109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod    back = DEFAULT_BACK;
88b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    line_space = 0;
89109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod    margin.t = margin.r = margin.b = margin.l = DEFAULT_MARGIN;
9011e51993ab562d4c7460eb7c43d0e97404e628e7Behdad Esfahbod    font_size = DEFAULT_FONT_SIZE;
91b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
92b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    add_options (parser);
933bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  }
943bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
95b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_options (option_parser_t *parser);
96bc4b07b05ea9e39eb9f966eb2c3e1c737efa77ffBehdad Esfahbod
97b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  bool annotate;
983bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  const char *fore;
993bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  const char *back;
1003bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  double line_space;
1013bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  struct margin_t {
1023bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod    double t, r, b, l;
1033bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  } margin;
10411e51993ab562d4c7460eb7c43d0e97404e628e7Behdad Esfahbod  double font_size;
105b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
1063bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
107109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod
108b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct shape_options_t : option_group_t
1093bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod{
110b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  shape_options_t (option_parser_t *parser) {
111b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    direction = language = script = NULL;
112b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    features = NULL;
113b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    num_features = 0;
114b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    shapers = NULL;
115b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
116b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    add_options (parser);
1173bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  }
11890e312cb85df7a6dc350cb62138ab950790e3d15Behdad Esfahbod  ~shape_options_t (void) {
11990e312cb85df7a6dc350cb62138ab950790e3d15Behdad Esfahbod    free (features);
12090e312cb85df7a6dc350cb62138ab950790e3d15Behdad Esfahbod    g_free (shapers);
12190e312cb85df7a6dc350cb62138ab950790e3d15Behdad Esfahbod  }
1223bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
123b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_options (option_parser_t *parser);
124bc4b07b05ea9e39eb9f966eb2c3e1c737efa77ffBehdad Esfahbod
1254f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod  void setup_buffer (hb_buffer_t *buffer) {
126516857eb51bbb79ff4adf44e3fefbf460f9ee8f8Behdad Esfahbod    hb_buffer_set_direction (buffer, hb_direction_from_string (direction, -1));
127516857eb51bbb79ff4adf44e3fefbf460f9ee8f8Behdad Esfahbod    hb_buffer_set_script (buffer, hb_script_from_string (script, -1));
128516857eb51bbb79ff4adf44e3fefbf460f9ee8f8Behdad Esfahbod    hb_buffer_set_language (buffer, hb_language_from_string (language, -1));
1294f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod  }
1304f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod
131b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  bool shape (const char *text, int text_len,
132b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod	      hb_font_t *font, hb_buffer_t *buffer) {
133b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    hb_buffer_reset (buffer);
134b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    hb_buffer_add_utf8 (buffer, text, text_len, 0, text_len);
1354f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod    setup_buffer (buffer);
1364f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod    return hb_shape_full (font, buffer, features, num_features, NULL, shapers);
1374f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod  }
1384f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod
1393bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  const char *direction;
1403bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  const char *language;
1413bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  const char *script;
1423bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  hb_feature_t *features;
1433bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  unsigned int num_features;
1443bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  char **shapers;
145b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
1463bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
147109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod
148b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct font_options_t : option_group_t
1493bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod{
150b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  font_options_t (option_parser_t *parser) {
151b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    font_file = NULL;
152b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    face_index = 0;
153b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
154b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    font = NULL;
155b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
156b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    add_options (parser);
157b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
158b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  ~font_options_t (void) {
159b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    hb_font_destroy (font);
1603bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  }
1613bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
162b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_options (option_parser_t *parser);
163b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
164b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  hb_font_t *get_font (void) const;
165bc4b07b05ea9e39eb9f966eb2c3e1c737efa77ffBehdad Esfahbod
1663bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  const char *font_file;
1673bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  int face_index;
1683bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
169b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  private:
170b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  mutable hb_font_t *font;
171b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
172b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
173b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
174b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct text_options_t : option_group_t
175b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod{
176b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  text_options_t (option_parser_t *parser) {
177b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    text = NULL;
178b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    text_file = NULL;
179b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
18055aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod    fp = NULL;
18155aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod    gs = NULL;
182b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    text_len = (unsigned int) -1;
183b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
184b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    add_options (parser);
185b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
186b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  ~text_options_t (void) {
18755aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod    if (gs)
18855aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod      g_string_free (gs, TRUE);
18955aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod    if (fp)
19055aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod      fclose (fp);
191b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
192b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
193b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_options (option_parser_t *parser);
194b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
195b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void post_parse (GError **error G_GNUC_UNUSED) {
196b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    if (text && text_file)
197b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod      g_set_error (error,
198b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod		   G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
199b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod		   "Only one of text and text-file must be set");
200b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
201b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  };
202b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
203b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  const char *get_line (unsigned int *len);
204b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
205b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  const char *text;
206b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  const char *text_file;
207b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
208b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  private:
20955aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod  FILE *fp;
21055aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod  GString *gs;
21155aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod  unsigned int text_len;
212b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
213b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
214b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct output_options_t : option_group_t
215b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod{
216b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  output_options_t (option_parser_t *parser) {
217b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    output_file = NULL;
218b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    output_format = NULL;
219b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
220f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod    fp = NULL;
221f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod
222b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    add_options (parser);
223b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
224f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod  ~output_options_t (void) {
22555aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod    if (fp)
226f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod      fclose (fp);
227f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod  }
228b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
229b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_options (option_parser_t *parser);
230b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
231b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void post_parse (GError **error G_GNUC_UNUSED)
232b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  {
233b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    if (output_file && !output_format) {
234b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod      output_format = strrchr (output_file, '.');
235b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod      if (output_format)
236b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod	  output_format++; /* skip the dot */
237b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    }
238b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
239f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod    if (output_file && 0 == strcmp (output_file, "-"))
240f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod      output_file = NULL; /* STDOUT */
241f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod  }
242f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod
243a75c1b125159f6cfb6b652a9ec40803f7c7e3f71Behdad Esfahbod  FILE *get_file_handle (void);
2443bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
245b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  virtual void init (const font_options_t *font_opts) = 0;
246b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  virtual void consume_line (hb_buffer_t  *buffer,
247b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod			     const char   *text,
248b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod			     unsigned int  text_len) = 0;
249b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  virtual void finish (const font_options_t *font_opts) = 0;
2503bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
251f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod  protected:
252b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  const char *output_file;
253b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  const char *output_format;
254f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod
255f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod  mutable FILE *fp;
256b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
2573bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
2583bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
2593bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod#endif
260