From 2310a3f4747edf100b4c96737426239c893a04a9 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 13 Apr 2015 13:49:42 +0200 Subject: fixing -h and -v command line tool options --- src/util/util.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) (limited to 'src/util/util.c') diff --git a/src/util/util.c b/src/util/util.c index 7beff8348..2973a11c2 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -85,4 +85,113 @@ TALER_config_load (const char *base_dir) return cfg; } + + +/** + * At what offset does the help text start? + */ +#define BORDER 29 + +/** + * Print out details on command line options (implements --help). + * + * @param ctx command line processing context + * @param scls additional closure (points to about text) + * @param option name of the option + * @param value not used (NULL) + * @return #GNUNET_NO (do not continue, not an error) + */ +int +TALER_GETOPT_format_help_ (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, + const char *option, + const char *value) +{ + const char *about = scls; + size_t slen; + unsigned int i; + int j; + size_t ml; + size_t p; + char *scp; + const char *trans; + const struct GNUNET_GETOPT_CommandLineOption *opt; + + if (NULL != about) + { + printf ("%s\n%s\n", + ctx->binaryOptions, + gettext (about)); + printf (_("Arguments mandatory for long options are also mandatory for short options.\n")); + } + opt = ctx->allOptions; + for (i=0;NULL != opt[i].description;i++) + { + if (opt[i].shortName == '\0') + printf (" "); + else + printf (" -%c, ", opt[i].shortName); + printf ("--%s", opt[i].name); + slen = 8 + strlen (opt[i].name); + if (opt[i].argumentHelp != NULL) + { + printf ("=%s", opt[i].argumentHelp); + slen += 1 + strlen (opt[i].argumentHelp); + } + if (slen > BORDER) + { + printf ("\n%*s", BORDER, ""); + slen = BORDER; + } + if (slen < BORDER) + { + printf ("%*s", (int) (BORDER - slen), ""); + slen = BORDER; + } + if (0 < strlen (opt[i].description)) + trans = gettext (opt[i].description); + else + trans = ""; + ml = strlen (trans); + p = 0; +OUTER: + while (ml - p > 78 - slen) + { + for (j = p + 78 - slen; j > p; j--) + { + if (isspace ((unsigned char) trans[j])) + { + scp = GNUNET_malloc (j - p + 1); + memcpy (scp, &trans[p], j - p); + scp[j - p] = '\0'; + printf ("%s\n%*s", scp, BORDER + 2, ""); + GNUNET_free (scp); + p = j + 1; + slen = BORDER + 2; + goto OUTER; + } + } + /* could not find space to break line */ + scp = GNUNET_malloc (78 - slen + 1); + memcpy (scp, &trans[p], 78 - slen); + scp[78 - slen] = '\0'; + printf ("%s\n%*s", scp, BORDER + 2, ""); + GNUNET_free (scp); + slen = BORDER + 2; + p = p + 78 - slen; + } + /* print rest */ + if (p < ml) + printf ("%s\n", &trans[p]); + if (strlen (trans) == 0) + printf ("\n"); + } + printf ("Report bugs to taler@gnu.org.\n" + "Taler home page: http://www.gnu.org/software/taler/\n" + "General help using GNU software: http://www.gnu.org/gethelp/\n"); + return GNUNET_NO; +} + + + /* end of util.c */ -- cgit v1.2.3