[hb-info] Simplify

This commit is contained in:
Behdad Esfahbod 2023-01-22 16:47:50 -07:00
parent eba5762919
commit fe22afe7f9
1 changed files with 59 additions and 70 deletions

View File

@ -57,10 +57,14 @@ _hb_ot_name_get_utf8 (hb_face_t *face,
*text_size = len; *text_size = len;
} }
struct info_t struct info_t :
option_parser_t,
font_options_t
{ {
void add_options (option_parser_t *parser) void add_options ()
{ {
font_options_t::add_options (this);
GOptionEntry misc_entries[] = GOptionEntry misc_entries[] =
{ {
{"direction", 0, 0, G_OPTION_ARG_STRING, &this->direction_str, "Set direction (default: ltr)", "ltr/rtl/ttb/btt"}, {"direction", 0, 0, G_OPTION_ARG_STRING, &this->direction_str, "Set direction (default: ltr)", "ltr/rtl/ttb/btt"},
@ -71,7 +75,7 @@ struct info_t
{nullptr} {nullptr}
}; };
parser->add_group (misc_entries, add_group (misc_entries,
"misc", "misc",
"Miscellaneaous options:", "Miscellaneaous options:",
"Miscellaneaous options affecting queries", "Miscellaneaous options affecting queries",
@ -121,18 +125,46 @@ struct info_t
{nullptr} {nullptr}
}; };
parser->add_group (query_entries, add_group (query_entries,
"query", "query",
"Query options:", "Query options:",
"Options to query the font instance", "Options to query the font instance",
this, this,
true); true);
GOptionEntry entries[] =
{
{"quiet", 'q', G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &this->verbose, "Generate machine-readable output", nullptr},
{G_OPTION_REMAINING, 0, G_OPTION_FLAG_IN_MAIN,
G_OPTION_ARG_CALLBACK, (gpointer) &collect_rest, nullptr, "[FONT-FILE]"},
{nullptr}
};
add_main_group (entries, this);
option_parser_t::add_options ();
} }
static gboolean
collect_rest (const char *name G_GNUC_UNUSED,
const char *arg,
gpointer data,
GError **error)
{
info_t *thiz = (info_t *) data;
if (!thiz->font_file)
{
thiz->font_file = g_strdup (arg);
return true;
}
g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
"Too many arguments on the command line");
return false;
}
protected: protected:
hb_blob_t *blob = nullptr;
hb_face_t *face = nullptr;
hb_font_t *font = nullptr;
hb_bool_t verbose = true; hb_bool_t verbose = true;
hb_bool_t first_item = true; hb_bool_t first_item = true;
@ -199,13 +231,15 @@ struct info_t
language = hb_language_from_string (language_str, -1); language = hb_language_from_string (language_str, -1);
} }
template <typename app_t> int
void operator () (app_t *app) operator () (int argc, char **argv)
{ {
blob = hb_blob_reference (((font_options_t *) app)->blob); add_options ();
face = hb_face_reference (((font_options_t *) app)->face);
font = hb_font_reference (((font_options_t *) app)->font); if (argc == 2)
verbose = !app->quiet; show_all = true;
parse (&argc, &argv);
if (all) if (all)
{ {
@ -287,9 +321,7 @@ struct info_t
#endif #endif
if (list_palettes) _list_palettes (); if (list_palettes) _list_palettes ();
hb_font_destroy (font); return 0;
hb_face_destroy (face);
hb_blob_destroy (blob);
} }
protected: protected:
@ -1260,53 +1292,10 @@ struct main_font_t :
return 0; return 0;
} }
protected:
void add_options ()
{
font_options_type::add_options (this);
consumer_t::add_options (this);
GOptionEntry entries[] =
{
{"quiet", 'q', 0, G_OPTION_ARG_NONE, &this->quiet, "Generate machine-readable output", nullptr},
{G_OPTION_REMAINING, 0, G_OPTION_FLAG_IN_MAIN,
G_OPTION_ARG_CALLBACK, (gpointer) &collect_rest, nullptr, "[FONT-FILE]"},
{nullptr}
};
add_main_group (entries, this);
option_parser_t::add_options ();
}
private:
static gboolean
collect_rest (const char *name G_GNUC_UNUSED,
const char *arg,
gpointer data,
GError **error)
{
main_font_t *thiz = (main_font_t *) data;
if (!thiz->font_file)
{
thiz->font_file = g_strdup (arg);
return true;
}
g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
"Too many arguments on the command line");
return false;
}
public:
hb_bool_t quiet = false;
}; };
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
using main_t = main_font_t<info_t, font_options_t>; return batch_main<info_t> (argc, argv);
return batch_main<main_t> (argc, argv);
} }