aboutsummaryrefslogtreecommitdiffstats
path: root/src/gpg-error.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2016-12-02 21:46:07 +0000
committerWerner Koch <[email protected]>2016-12-02 21:51:19 +0000
commitb462d603f5110842489edce9e01e4ea40ac05cba (patch)
treeb995f838e99e402d4cf35d4f11d85259b98f2f27 /src/gpg-error.c
parentw32-iconv: Remove invalid link to unicode.org in comment. (diff)
downloadlibgpg-error-b462d603f5110842489edce9e01e4ea40ac05cba.tar.gz
libgpg-error-b462d603f5110842489edce9e01e4ea40ac05cba.zip
New option --desc for gpg-error.
* doc/errorref.txt: Remove all tabs. * doc/Makefile.am (install-data-local): New to install errorref.txt. (uninstall-local): New. (errorref.txt.x): New. * src/Makefile.am (gpg_error_CPPFLAGS): Define PKGDATADIR * src/gpg-error.c (print_desc): New. (show_usage): New. (main): Improve option parser. Add new option --desc. Call print_desc. -- Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src/gpg-error.c')
-rw-r--r--src/gpg-error.c208
1 files changed, 163 insertions, 45 deletions
diff --git a/src/gpg-error.c b/src/gpg-error.c
index 117b367..4a09e1d 100644
--- a/src/gpg-error.c
+++ b/src/gpg-error.c
@@ -1,5 +1,5 @@
/* gpg-error.c - Determining gpg-error error codes.
- Copyright (C) 2004 g10 Code GmbH
+ Copyright (C) 2004, 2016 g10 Code GmbH
This file is part of libgpg-error.
@@ -370,12 +370,107 @@ get_err_from_str (char *str, gpg_error_t *err)
}
+static void
+print_desc (const char *symbol)
+{
+ static int initialized;
+ static FILE *fp;
+ char line[512];
+ char *p;
+ int indesc = 0;
+ int blanklines = 0;
+ int last_was_keyword = 0;
+
+ if (!initialized)
+ {
+ initialized = 1;
+ fp = fopen (PKGDATADIR "/errorref.txt", "r");
+ }
+ if (!fp)
+ return;
+ rewind (fp);
+ while (fgets (line, sizeof line, fp))
+ {
+ if (*line == '#')
+ continue;
+ if (*line && line[strlen(line)-1] == '\n')
+ line[strlen(line)-1] = 0;
+
+ if (!strncmp (line, "GPG_ERR_", 8))
+ {
+ if (indesc == 1 && last_was_keyword)
+ continue; /* Skip keywords immediately following a matched
+ * keyword. */
+ last_was_keyword = 1;
+
+ indesc = 0;
+ p = strchr (line, ' ');
+ if (!p)
+ continue;
+ *p = 0;
+ if (!strcmp (line, symbol))
+ {
+ indesc = 1;
+ continue; /* Skip this line. */
+ }
+ }
+ else
+ last_was_keyword = 0;
+ if (!indesc)
+ continue;
+ if (indesc == 1 && !*line)
+ continue; /* Skip leading empty lines in a description. */
+ if (indesc == 1)
+ putchar ('\n'); /* One leading empty line. */
+ indesc = 2;
+ if (!*line)
+ {
+ blanklines++;
+ continue;
+ }
+ for (; blanklines; blanklines--)
+ putchar ('\n');
+ printf ("%s\n", line);
+ }
+ putchar ('\n'); /* One trailing blank line. */
+}
+
+
+
+
+static int
+show_usage (const char *name)
+{
+ if (name)
+ {
+ fprintf (stderr, _("Usage: %s GPG-ERROR [...]\n"),
+ strrchr (name,'/')? (strrchr (name, '/')+1): name);
+ exit (1);
+ }
+
+ fputs ("gpg-error (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stdout);
+ fputs ("Options:\n"
+ " --version Print version\n"
+ " --lib-version Print library version\n"
+ " --help Print this help\n"
+ " --list Print all error codes\n"
+ " --defines Print all error codes as #define lines\n"
+ " --desc Print with error description\n"
+ , stdout);
+ exit (0);
+}
+
+
+
int
main (int argc, char *argv[])
{
- int i = 1;
+ const char *pgmname = argv[0];
+ int last_argc = -1;
+ int i;
int listmode = 0;
+ int desc = 0;
const char *source_sym;
const char *error_sym;
gpg_error_t err;
@@ -383,46 +478,60 @@ main (int argc, char *argv[])
gpgrt_init ();
i18n_init ();
- if (argc == 1)
- {
- fprintf (stderr, _("Usage: %s GPG-ERROR [...]\n"),
- strrchr (argv[0],'/')? (strrchr (argv[0], '/')+1): argv[0]);
- exit (1);
- }
- else if (argc == 2 && !strcmp (argv[1], "--version"))
- {
- fputs ("gpg-error (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stdout);
- exit (0);
- }
- else if (argc == 2 && !strcmp (argv[1], "--help"))
- {
- fputs ("gpg-error (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stdout);
- fputs ("Options:\n"
- " --version Print version\n"
- " --lib-version Print library version\n"
- " --help Print this help\n"
- " --list Print all error codes\n"
- " --defines Print all error codes as #define lines\n"
- , stdout);
- exit (0);
- }
- else if (argc == 2 && !strcmp (argv[1], "--lib-version"))
- {
- printf ("Version from header: %s (0x%06x)\n",
- GPG_ERROR_VERSION, GPG_ERROR_VERSION_NUMBER);
- printf ("Version from binary: %s\n", gpg_error_check_version (NULL));
- printf ("Copyright blurb ...:%s\n", gpg_error_check_version ("\x01\x01"));
- exit (0);
- }
- else if (argc == 2 && !strcmp (argv[1], "--list"))
+
+ if (argc)
{
- listmode = 1;
+ argc--; argv++;
}
- else if (argc == 2 && !strcmp (argv[1], "--defines"))
+ while (argc && last_argc != argc )
{
- listmode = 2;
+ last_argc = argc;
+ if (!strcmp (*argv, "--"))
+ {
+ argc--; argv++;
+ break;
+ }
+ else if (!strcmp (*argv, "--version"))
+ {
+ fputs ("gpg-error (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stdout);
+ exit (0);
+ }
+ else if (!strcmp (*argv, "--help"))
+ {
+ show_usage (NULL);
+ }
+ else if (!strcmp (*argv, "--lib-version"))
+ {
+ argc--; argv++;
+ printf ("Version from header: %s (0x%06x)\n",
+ GPG_ERROR_VERSION, GPG_ERROR_VERSION_NUMBER);
+ printf ("Version from binary: %s\n", gpg_error_check_version (NULL));
+ printf ("Copyright blurb ...:%s\n",
+ gpg_error_check_version ("\x01\x01"));
+ exit (0);
+ }
+ else if (!strcmp (*argv, "--list"))
+ {
+ listmode = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--defines"))
+ {
+ listmode = 2;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--desc"))
+ {
+ desc = 1;
+ argc--; argv++;
+ }
+ else if (!strncmp (*argv, "--", 2))
+ show_usage (pgmname);
}
+ if ((argc && listmode) || (!argc && !listmode))
+ show_usage (pgmname);
+
if (listmode == 1)
{
@@ -434,18 +543,26 @@ main (int argc, char *argv[])
err -= 1;
source_sym = gpg_strsource_sym (err);
if (source_sym)
- printf ("%u = (%u, -) = (%s, -) = (%s, -)\n",
- err, gpg_err_source (err),
- source_sym, gpg_strsource (err));
+ {
+ printf ("%u = (%u, -) = (%s, -) = (%s, -)\n",
+ err, gpg_err_source (err),
+ source_sym, gpg_strsource (err));
+ if (desc)
+ print_desc (source_sym);
+ }
}
for (i=0; i < GPG_ERR_CODE_DIM; i++)
{
err = gpg_err_make (GPG_ERR_SOURCE_UNKNOWN, i);
error_sym = gpg_strerror_sym (err);
if (error_sym)
- printf ("%u = (-, %u) = (-, %s) = (-, %s)\n",
- err, gpg_err_code (err),
- error_sym, gpg_strerror (err));
+ {
+ printf ("%u = (-, %u) = (-, %s) = (-, %s)\n",
+ err, gpg_err_code (err),
+ error_sym, gpg_strerror (err));
+ if (desc)
+ print_desc (error_sym);
+ }
}
}
else if (listmode == 2)
@@ -493,7 +610,7 @@ main (int argc, char *argv[])
}
else /* Standard mode. */
{
- while (i < argc)
+ for (i=0; i < argc; i++)
{
if (get_err_from_number (argv[i], &err)
|| get_err_from_symbol (argv[i], &err)
@@ -506,11 +623,12 @@ main (int argc, char *argv[])
err, gpg_err_source (err), gpg_err_code (err),
source_sym ? source_sym : "-", error_sym ? error_sym:"-",
gpg_strsource (err), gpg_strerror (err));
+ if (desc)
+ print_desc (error_sym);
}
else
fprintf (stderr, _("%s: warning: could not recognize %s\n"),
argv[0], argv[i]);
- i++;
}
}