From 798daaa1ddf73f64cf840fbdc1f4c5b9c4b4ec13 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Mon, 18 Nov 2013 13:46:52 +0100 Subject: [PATCH] Add strusage macro replacement feature. * common/argparse.c (writechar): New. (writestrings): Add macro replacement feature. (show_help): Remove specialized @EMAIL@ replacement. * configure.ac (GNUPG_NAME, GPG_NAME, GPGSM_NAME): Define. (GPG_AGENT_NAME, DIRMNGR_NAME, G13_NAME, GPGCONF_NAME): Define. (GPGTAR_NAME, GPG_AGENT_INFO_NAME, GPG_AGENT_SOCK_NAME): Define. (GPG_AGENT_SSH_SOCK_NAME, DIRMNGR_INFO_NAME): Define. (DIRMNGR_SOCK_NAME): Define. Signed-off-by: Werner Koch --- common/argparse.c | 103 ++++++++++++++++++++++++++++++++-------------- configure.ac | 26 ++++++++++++ 2 files changed, 97 insertions(+), 32 deletions(-) diff --git a/common/argparse.c b/common/argparse.c index 6a9092059..c9930eaa5 100644 --- a/common/argparse.c +++ b/common/argparse.c @@ -185,6 +185,19 @@ argparse_register_outfnc (int (*fnc)(int, const char *)) } +static void +writechar (int is_error, int c) +{ + char tmp[2]; + + tmp[0] = c; + tmp[1] = 0; + if (custom_outfnc) + custom_outfnc (is_error? 2:1, tmp); + else + fputs (tmp, is_error? stderr : stdout); +} + /* Write STRING and all following const char * arguments either to stdout or, if IS_ERROR is set, to stderr. The list of strings must be terminated by a NULL. */ @@ -201,11 +214,64 @@ writestrings (int is_error, const char *string, ...) va_start (arg_ptr, string); do { - if (custom_outfnc) - custom_outfnc (is_error? 2:1, s); + const char *s2, *s3; + + /* Check whether to substitute a macro. */ + if (s && (s2 = strchr (s, '@')) && s2[1] >= 'A' && s2[1] <= 'Z' + && (s3 = (strchr (s2+1, '@')))) + { + /* Might be. */ + static struct { + const char *name; + const char *value; + } macros[] = { +# ifdef PACKAGE_BUGREPORT + { "EMAIL", PACKAGE_BUGREPORT }, +# else + { "EMAIL", "bug@example.org" }, +# endif + { "GNUPG", GNUPG_NAME }, + { "GPG", GPG_NAME }, + { "GPGSM", GPGSM_NAME }, + { "GPG_AGENT", GPG_AGENT_NAME }, + { "SCDAEMON", SCDAEMON_NAME }, + { "DIRMNGR", DIRMNGR_NAME }, + { "G13", G13_NAME }, + { "GPGCONF", GPGCONF_NAME }, + { "GPGTAR", GPGTAR_NAME } + }; + int idx; + + s2++; + for (idx=0; idx < DIM (macros); idx++) + if (strlen (macros[idx].name) == (s3 - s2) + && !memcmp (macros[idx].name, s2, (s3 - s2))) + break; + s2--; + if (idx < DIM (macros)) /* Found. Print and substitute. */ + { + for (; s < s2; s++, count++) + writechar (is_error, *s); + count += writestrings (is_error, macros[idx].value, NULL); + s3++; + } + else /* Not found. Print macro as is. */ + { + for (; s < s3; s++, count++) + writechar (is_error, *s); + } + /* Now recurse so that remaining macros are also + substituted. */ + count += writestrings (is_error, s3, NULL); + } else - fputs (s, is_error? stderr : stdout); - count += strlen (s); + { + if (custom_outfnc) + custom_outfnc (is_error? 2:1, s); + else + fputs (s, is_error? stderr : stdout); + count += strlen (s); + } } while ((s = va_arg (arg_ptr, const char *))); va_end (arg_ptr); @@ -1222,35 +1288,8 @@ show_help (ARGPARSE_OPTS *opts, unsigned int flags) } if ( (s=strusage(19)) ) { - /* bug reports to ... */ - char *s2; - writestrings (0, "\n", NULL); - s2 = strstr (s, "@EMAIL@"); - if (s2) - { - if (s2-s) - { - const char *s3; - - for (s3=s; s3 < s2; s3++) - { - tmp[0] = *s3; - tmp[1] = 0; - writestrings (0, tmp, NULL); - } - } -#ifdef PACKAGE_BUGREPORT - writestrings (0, PACKAGE_BUGREPORT, NULL); -#else - writestrings (0, "bug@example.org", NULL); -#endif - s2 += 7; - if (*s2) - writestrings (0, s2, NULL); - } - else - writestrings (0, s, NULL); + writestrings (0, s, NULL); } flushstrings (0); exit(0); diff --git a/configure.ac b/configure.ac index e20a70c0a..fa841c4c9 100644 --- a/configure.ac +++ b/configure.ac @@ -1574,6 +1574,32 @@ if test "$build_g13" = yes ; then fi +# +# Define Name strings +# +AC_DEFINE_UNQUOTED(GNUPG_NAME, "GnuPG", [The name of the project]) +AC_DEFINE_UNQUOTED(GPG_NAME, "gpg", [The name of the OpenPGP tool]) +AC_DEFINE_UNQUOTED(GPGSM_NAME, "gpgsm", [The name of the S/MIME tool]) +AC_DEFINE_UNQUOTED(GPG_AGENT_NAME, "gpg-agent", [The name of the agent]) +AC_DEFINE_UNQUOTED(SCDAEMON_NAME, "scdaemon", [The name of the scdaemon]) +AC_DEFINE_UNQUOTED(DIRMNGR_NAME, "dirmngr", [The name of the dirmngr]) +AC_DEFINE_UNQUOTED(G13_NAME, "g13", [The name of the g13 tool]) +AC_DEFINE_UNQUOTED(GPGCONF_NAME, "gpgconf", [The name of the gpgconf tool]) +AC_DEFINE_UNQUOTED(GPGTAR_NAME, "gpgtar", [The name of the gpgtar tool]) + +AC_DEFINE_UNQUOTED(GPG_AGENT_INFO_NAME, "GPG_AGENT_INFO", + [The name of the agent info envvar]) +AC_DEFINE_UNQUOTED(GPG_AGENT_SOCK_NAME, "S.gpg-agent", + [The name of the agent socket]) +AC_DEFINE_UNQUOTED(GPG_AGENT_SSH_SOCK_NAME, "S.gpg-agent.ssh", + [The name of the agent socket for ssh]) +AC_DEFINE_UNQUOTED(DIRMNGR_INFO_NAME, "DIRMNGR_INFO", + [The name of the dirmngr info envvar]) +AC_DEFINE_UNQUOTED(DIRMNGR_SOCK_NAME, "S.dirmngr", + [The name of the dirmngr socket]) + +AC_DEFINE_UNQUOTED(GPGEXT_GPG, "gpg", [The standard binary file suffix]) + # # Provide information about the build.