aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/util')
-rw-r--r--src/util/util.c109
1 files changed, 109 insertions, 0 deletions
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 */