Hello, I have fixed the issues Bruno pointed out in his posting, and committed the following changes.
Regards, Sergey
>From 3457fcf5632d0411821c6ca61b09c945da9b1063 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff <g...@gnu.org.ua> Date: Thu, 25 Jun 2009 10:31:56 +0300 Subject: [PATCH] Provide additional interfaces and documentation for version-etc module. * lib/version-etc.c (version_etc_arn, version_etc_ar): New interfaces. * lib/version-etc.h (version_etc_arn, version_etc_ar): New prototypes. --- ChangeLog | 10 +++++ lib/version-etc.c | 117 +++++++++++++++++++++++++++++++++++++--------------- lib/version-etc.h | 30 ++++++++++++++ 3 files changed, 123 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8aa5ac0..7405482 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2009-06-25 Sergey Poznyakoff <g...@gnu.org.ua> + + Provide additional interfaces and documentation for version-etc + module. + + * lib/version-etc.c (version_etc_arn, version_etc_ar): New + interfaces. + * lib/version-etc.h (version_etc_arn, version_etc_ar): New + prototypes. + 2009-06-24 Bruno Haible <br...@clisp.org> * m4/lib-link.m4 (AC_LIB_HAVE_LINKFLAGS): Fix description of diff --git a/lib/version-etc.c b/lib/version-etc.c index c3b0289..ddac305 100644 --- a/lib/version-etc.c +++ b/lib/version-etc.c @@ -34,26 +34,30 @@ enum { COPYRIGHT_YEAR = 2009 }; -/* Like version_etc, below, but with the NULL-terminated author list - provided via a variable of type va_list. */ -void -version_etc_va (FILE *stream, - const char *command_name, const char *package, - const char *version, va_list authors) -{ - size_t n_authors; +/* The three functions below display the --version information the + standard way. + + If COMMAND_NAME is NULL, the PACKAGE is asumed to be the name of + the program. The formats are therefore: - /* Count the number of authors. */ - { - va_list tmp_authors; + PACKAGE VERSION - va_copy (tmp_authors, authors); + or - n_authors = 0; - while (va_arg (tmp_authors, const char *) != NULL) - ++n_authors; - } + COMMAND_NAME (PACKAGE) VERSION. + The functions differ in the way they are passed author names. */ + +/* Display the --version information the standard way. + + Author names are given in the array AUTHORS. N_AUTHORS is the + number of elements in the array. */ +void +version_etc_arn (FILE *stream, + const char *command_name, const char *package, + const char *version, + const char * const * authors, size_t n_authors) +{ if (command_name) fprintf (stream, "%s (%s) %s\n", command_name, package, version); else @@ -89,57 +93,64 @@ There is NO WARRANTY, to the extent permitted by law.\n\ abort (); case 1: /* TRANSLATORS: %s denotes an author name. */ - vfprintf (stream, _("Written by %s.\n"), authors); + fprintf (stream, _("Written by %s.\n"), authors[0]); break; case 2: /* TRANSLATORS: Each %s denotes an author name. */ - vfprintf (stream, _("Written by %s and %s.\n"), authors); + fprintf (stream, _("Written by %s and %s.\n"), authors[0], authors[1]); break; case 3: /* TRANSLATORS: Each %s denotes an author name. */ - vfprintf (stream, _("Written by %s, %s, and %s.\n"), authors); + fprintf (stream, _("Written by %s, %s, and %s.\n"), + authors[0], authors[1], authors[2]); break; case 4: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ - vfprintf (stream, _("Written by %s, %s, %s,\nand %s.\n"), authors); + fprintf (stream, _("Written by %s, %s, %s,\nand %s.\n"), + authors[0], authors[1], authors[2], authors[3]); break; case 5: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ - vfprintf (stream, _("Written by %s, %s, %s,\n%s, and %s.\n"), authors); + fprintf (stream, _("Written by %s, %s, %s,\n%s, and %s.\n"), + authors[0], authors[1], authors[2], authors[3], authors[4]); break; case 6: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ - vfprintf (stream, _("Written by %s, %s, %s,\n%s, %s, and %s.\n"), - authors); + fprintf (stream, _("Written by %s, %s, %s,\n%s, %s, and %s.\n"), + authors[0], authors[1], authors[2], authors[3], authors[4], + authors[5]); break; case 7: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ - vfprintf (stream, _("Written by %s, %s, %s,\n%s, %s, %s, and %s.\n"), - authors); + fprintf (stream, _("Written by %s, %s, %s,\n%s, %s, %s, and %s.\n"), + authors[0], authors[1], authors[2], authors[3], authors[4], + authors[5], authors[6]); break; case 8: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ - vfprintf (stream, _("\ + fprintf (stream, _("\ Written by %s, %s, %s,\n%s, %s, %s, %s,\nand %s.\n"), - authors); + authors[0], authors[1], authors[2], authors[3], authors[4], + authors[5], authors[6], authors[7]); break; case 9: /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ - vfprintf (stream, _("\ + fprintf (stream, _("\ Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, and %s.\n"), - authors); + authors[0], authors[1], authors[2], authors[3], authors[4], + authors[5], authors[6], authors[7], authors[8]); break; default: /* 10 or more authors. Use an abbreviation, since the human reader @@ -147,12 +158,49 @@ Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, and %s.\n"), /* TRANSLATORS: Each %s denotes an author name. You can use line breaks, estimating that each author name occupies ca. 16 screen columns and that a screen line has ca. 80 columns. */ - vfprintf (stream, _("\ + fprintf (stream, _("\ Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, %s, and others.\n"), - authors); + authors[0], authors[1], authors[2], authors[3], authors[4], + authors[5], authors[6], authors[7], authors[8], authors[9]); break; } - va_end (authors); +} + +/* Display the --version information the standard way. See the initial + comment to this module, for more information. + + Author names are given in the NULL-terminated array AUTHORS. */ +void +version_etc_ar (FILE *stream, + const char *command_name, const char *package, + const char *version, const char * const * authors) +{ + size_t n_authors; + + for (n_authors = 0; authors[n_authors]; n_authors++) + ; + version_etc_arn (stream, command_name, package, version, authors, n_authors); +} + +/* Display the --version information the standard way. See the initial + comment to this module, for more information. + + Author names are given in the NULL-terminated va_list AUTHORS. */ +void +version_etc_va (FILE *stream, + const char *command_name, const char *package, + const char *version, va_list authors) +{ + size_t n_authors; + const char *authtab[10]; + + for (n_authors = 0; + n_authors < 10 + && (authtab[n_authors++] = va_arg (authors, const char *)) != NULL; + n_authors++) + ; + version_etc_arn (stream, command_name, package, version, + authtab, n_authors); } @@ -167,7 +215,7 @@ Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, %s, and others.\n"), COMMAND_NAME (PACKAGE) VERSION. - The author names are passed as separate arguments, with an additional + The authors names are passed as separate arguments, with an additional NULL argument at the end. */ void version_etc (FILE *stream, @@ -178,6 +226,7 @@ version_etc (FILE *stream, va_start (authors, version); version_etc_va (stream, command_name, package, version, authors); + va_end (authors); } void @@ -195,5 +244,5 @@ emit_bug_reporting_address (void) printf (_("%s home page: <http://www.gnu.org/software/%s/>.\n"), PACKAGE_NAME, PACKAGE); fputs (_("General help using GNU software: <http://www.gnu.org/gethelp/>.\n"), - stdout); + stdout); } diff --git a/lib/version-etc.h b/lib/version-etc.h index 33a8e7f..078601c 100644 --- a/lib/version-etc.h +++ b/lib/version-etc.h @@ -24,15 +24,45 @@ extern const char version_etc_copyright[]; +/* The three functions below display the --version information in the + standard way: command and package names, package version, followed + by a short GPLv3+ notice and a list of up to 10 author names. + + If COMMAND_NAME is NULL, the PACKAGE is asumed to be the name of + the program. The formats are therefore: + + PACKAGE VERSION + + or + + COMMAND_NAME (PACKAGE) VERSION. + + The functions differ in the way they are passed author names: */ + +/* N_AUTHORS names are supplied in array AUTHORS */ +extern void version_etc_arn (FILE *stream, + const char *command_name, const char *package, + const char *version, + const char * const * authors, size_t n_authors); + +/* Names are passed in the NULL-terminated array AUTHORS */ +extern void version_etc_ar (FILE *stream, + const char *command_name, const char *package, + const char *version, const char * const * authors); + +/* Names are passed in the NULL-terminated va_list */ extern void version_etc_va (FILE *stream, const char *command_name, const char *package, const char *version, va_list authors); +/* Names are passed as separate arguments, with an additional + NULL argument at the end. */ extern void version_etc (FILE *stream, const char *command_name, const char *package, const char *version, /* const char *author1, ...*/ ...); +/* Display the usual `Report bugs to' stanza */ extern void emit_bug_reporting_address (void); #endif /* VERSION_ETC_H */ -- 1.6.0
>From ffb0da8f73d65580025dfd9bc0705cffe0281d74 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff <g...@gnu.org.ua> Date: Thu, 25 Jun 2009 10:42:21 +0300 Subject: [PATCH] argp-version-etc: new module. * lib/argp-version-etc.c: New file. * lib/argp-version-etc.h: New file. * modules/argp-version-etc: New file. * modules/argp-version-etc-tests: New file. * tests/test-argp-version-etc.c: New test. * tests/test-argp-version-etc-1.sh: New test. --- ChangeLog | 11 ++++++++ lib/argp-version-etc.c | 38 ++++++++++++++++++++++++++++++ lib/argp-version-etc.h | 40 +++++++++++++++++++++++++++++++ modules/argp-version-etc | 21 ++++++++++++++++ modules/argp-version-etc-tests | 14 +++++++++++ tests/test-argp-version-etc-1.sh | 41 ++++++++++++++++++++++++++++++++ tests/test-argp-version-etc.c | 48 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 213 insertions(+), 0 deletions(-) create mode 100644 lib/argp-version-etc.c create mode 100644 lib/argp-version-etc.h create mode 100644 modules/argp-version-etc create mode 100644 modules/argp-version-etc-tests create mode 100755 tests/test-argp-version-etc-1.sh create mode 100644 tests/test-argp-version-etc.c diff --git a/ChangeLog b/ChangeLog index 7405482..11684a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ 2009-06-25 Sergey Poznyakoff <g...@gnu.org.ua> + argp-version-etc: new module. + + * lib/argp-version-etc.c: New file. + * lib/argp-version-etc.h: New file. + * modules/argp-version-etc: New file. + * modules/argp-version-etc-tests: New file. + * tests/test-argp-version-etc.c: New test. + * tests/test-argp-version-etc-1.sh: New test. + +2009-06-25 Sergey Poznyakoff <g...@gnu.org.ua> + Provide additional interfaces and documentation for version-etc module. diff --git a/lib/argp-version-etc.c b/lib/argp-version-etc.c new file mode 100644 index 0000000..e681196 --- /dev/null +++ b/lib/argp-version-etc.c @@ -0,0 +1,38 @@ +/* Version hook for Argp. + Copyright (C) 2009 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <version-etc.h> +#include <argp.h> +#include <argp-version-etc.h> + +static const char *program_canonical_name; +static const char **program_authors; + +static void +version_etc_hook (FILE *stream, struct argp_state *state) +{ + version_etc_ar (stream, program_canonical_name, PACKAGE_NAME, VERSION, + program_authors); +} + +void +argp_version_setup (const char *name, const char * const *authors) +{ + argp_program_version_hook = version_etc_hook; + program_canonical_name = name; + program_authors = authors; +} diff --git a/lib/argp-version-etc.h b/lib/argp-version-etc.h new file mode 100644 index 0000000..2cd4331 --- /dev/null +++ b/lib/argp-version-etc.h @@ -0,0 +1,40 @@ +/* Version hook for Argp. + Copyright (C) 2009 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _ARGP_VERSION_ETC_H +#define _ARGP_VERSION_ETC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Setup standard display of the version information for the `--version' + option. NAME is the canonical program name, and AUTHORS is a NULL- + terminated array of author names. At least one author name must be + given. + + If NAME is NULL, the package name (as given by the PACKAGE macro) + is asumed to be the name of the program. + + This function is intended to be called before argp_parse(). +*/ +extern void argp_version_setup (const char *name, const char * const *authors); + +#ifdef __cplusplus +} +#endif + +#endif /* _ARGP_VERSION_ETC_H */ diff --git a/modules/argp-version-etc b/modules/argp-version-etc new file mode 100644 index 0000000..464fc95 --- /dev/null +++ b/modules/argp-version-etc @@ -0,0 +1,21 @@ +Description: +Version-etc hook for Argp. + +Files: +lib/argp-version-etc.c +lib/argp-version-etc.h + +Depends-on: +argp + +Makefile.am: +lib_SOURCES += argp-version-etc.h argp-version-etc.c + +Include: +"argp-version-etc.h" + +License: +GPL + +Maintainer: +Sergey Poznyakoff diff --git a/modules/argp-version-etc-tests b/modules/argp-version-etc-tests new file mode 100644 index 0000000..eeed143 --- /dev/null +++ b/modules/argp-version-etc-tests @@ -0,0 +1,14 @@ +Files: +tests/test-argp-version-etc.c +tests/test-argp-version-etc-1.sh + +Depends-on: +argp +progname +version-etc-fsf + +Makefile.am: +TESTS += test-argp-version-etc test-argp-version-etc-1.sh +TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@' +check_PROGRAMS += test-argp-version-etc +test_argp_version_etc_LDADD = $(LDADD) @LIBINTL@ diff --git a/tests/test-argp-version-etc-1.sh b/tests/test-argp-version-etc-1.sh new file mode 100755 index 0000000..e0a9575 --- /dev/null +++ b/tests/test-argp-version-etc-1.sh @@ -0,0 +1,41 @@ +#! /bin/sh +# Test suite for argp-version-etc. +# Copyright (C) 2009 Free Software Foundation, Inc. +# This file is part of the GNUlib Library. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +TMP=ave-expected.tmp +LC_ALL=C +export LC_ALL +ERR=0 + +cat > $TMP <<EOT +test-argp-version-etc (dummy) 0 +COPYRIGHT +License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Written by Sergey Poznyakoff. +EOT + +./test-argp-version-etc --version | + sed '2s/Copyright (C) [0-9]\{4,4\} Free Software Foundation, Inc\./COPYRIGHT/' | + diff -c $TMP - || ERR=1 + +rm $TMP + +exit $ERR + diff --git a/tests/test-argp-version-etc.c b/tests/test-argp-version-etc.c new file mode 100644 index 0000000..485a4bd --- /dev/null +++ b/tests/test-argp-version-etc.c @@ -0,0 +1,48 @@ +/* Test suite for argp-version-etc. + Copyright (C) 2009 Free Software Foundation, Inc. + This file is part of the GNUlib Library. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include "argp-version-etc.h" +#include "argp.h" +#include "progname.h" + +static char doc[] = "test for the argp-version-etc module"; + +struct argp test_argp = +{ + NULL, + NULL, + NULL, + doc, + NULL, + NULL, + NULL +}; + +const char *authors[] = +{ + "Sergey Poznyakoff", + NULL +}; + +int +main (int argc, char **argv) +{ + set_program_name (argv[0]); + argp_version_setup ("test-argp-version-etc", authors); + return argp_parse (&test_argp, argc, argv, 0, NULL, NULL); +} -- 1.6.0