diff options
Diffstat (limited to 'common/argparse.c')
-rw-r--r-- | common/argparse.c | 103 |
1 files changed, 71 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); |