summaryrefslogtreecommitdiffstats
path: root/common/argparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/argparse.c')
-rw-r--r--common/argparse.c103
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);