diff --git a/util/face-options.hh b/util/face-options.hh index 21dbd79eb..c4284b50a 100644 --- a/util/face-options.hh +++ b/util/face-options.hh @@ -167,6 +167,7 @@ face_options_t::add_options (option_parser_t *parser) this); parser->add_environ("HB_FACE_LOADER=face-loader; Overrides the default face loader."); + parser->add_exit_code (RETURN_VALUE_FACE_LOAD_FAILED, "Failed loading font face."); } #endif diff --git a/util/font-options.hh b/util/font-options.hh index 52c4f3df4..848187909 100644 --- a/util/font-options.hh +++ b/util/font-options.hh @@ -369,6 +369,7 @@ font_options_t::add_options (option_parser_t *parser) #endif parser->add_environ("HB_FONT_FUNCS=font-funcs; Overrides the default font-funcs."); + parser->add_exit_code (RETURN_VALUE_FONT_FUNCS_FAILED, "Failed setting font functions."); } #endif diff --git a/util/main-font-text.hh b/util/main-font-text.hh index 751515fa7..01219dc2f 100644 --- a/util/main-font-text.hh +++ b/util/main-font-text.hh @@ -43,6 +43,7 @@ struct main_font_text_t : int operator () (int argc, char **argv) { add_options (); + add_exit_code (RETURN_VALUE_OPERATION_FAILED, "Operation failed."); parse (&argc, &argv); diff --git a/util/options.hh b/util/options.hh index 3fa2fdb17..e4700429a 100644 --- a/util/options.hh +++ b/util/options.hh @@ -28,6 +28,7 @@ #define OPTIONS_HH #include "hb.hh" +#include "hb-map.hh" #include #include @@ -90,6 +91,7 @@ struct option_parser_t option_parser_t (const char *parameter_string = nullptr) : context (g_option_context_new (parameter_string)), environs (g_ptr_array_new ()), + exit_codes (g_ptr_array_new ()), to_free (g_ptr_array_new ()) {} @@ -97,6 +99,7 @@ struct option_parser_t ~option_parser_t () { + g_ptr_array_free (exit_codes, TRUE); g_ptr_array_free (environs, TRUE); g_option_context_free (context); @@ -165,17 +168,28 @@ struct option_parser_t { GString *s = g_string_new (description); + // Exit codes + assert (exit_codes->len); + g_string_append_printf (s, "\n\n*Exit Codes*\n"); + for (unsigned i = 0; i < exit_codes->len; i++) + if (exit_codes->pdata[i]) + g_string_append_printf (s, "\n %u: %s\n", i, (const char *) exit_codes->pdata[i]); + // Environment variables if any if (environs->len) { - g_string_append_printf (s, "\n\n*Environment*\n\n"); + g_string_append_printf (s, "\n\n*Environment*\n"); for (unsigned i = 0; i < environs->len; i++) - g_string_append_printf (s, " %s\n\n", (char *)environs->pdata[i]); + { + g_string_append_printf (s, "\n %s\n", (char *)environs->pdata[i]); + } } + // See also g_string_append_printf (s, "\n\n*See also*\n"); g_string_append_printf (s, " hb-view(1), hb-shape(1), hb-subset(1), hb-info(1)"); + // Footer g_string_append_printf (s, "\n\nFind more information or report bugs at \n"); g_option_context_set_description (context, s->str); @@ -187,6 +201,13 @@ struct option_parser_t g_ptr_array_add (environs, (void *) environment); } + void add_exit_code (unsigned code, const char *description) + { + while (exit_codes->len <= code) + g_ptr_array_add (exit_codes, nullptr); + exit_codes->pdata[code] = (void *) description; + } + void free_later (char *p) { g_ptr_array_add (to_free, p); } @@ -197,6 +218,7 @@ struct option_parser_t protected: const char *description = nullptr; GPtrArray *environs; + GPtrArray *exit_codes; GPtrArray *to_free; }; @@ -231,6 +253,9 @@ option_parser_t::parse (int *argc, char ***argv, bool ignore_error) { setlocale (LC_ALL, ""); + add_exit_code (RETURN_VALUE_SUCCESS, "Success."); + add_exit_code (RETURN_VALUE_OPTION_PARSING_FAILED, "Option parsing failed."); + set_full_description (); GError *parse_error = nullptr;