Here's the updated patch. It swaps the n_authors and authors arguments, provides additional comments, removes the year-dependency from the test case and adds a call to va_end in version_etc.
Regards, Sergey
2009-06-24 Sergey Poznyakoff <g...@gnu.org.ua> Provide additional interfaces 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. Implement argp-version-etc module. * lib/argp-version-etc.c: New file. * lib/argp-version-etc.h: New file. * tests/test-ave.c: New test program. * tests/test-ave-2.sh: New test program diff --git a/lib/argp-version-etc.c b/lib/argp-version-etc.c new file mode 100644 index 0000000..52cb21b --- /dev/null +++ b/lib/argp-version-etc.c @@ -0,0 +1,22 @@ +#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 **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..fdad84a --- /dev/null +++ b/lib/argp-version-etc.h @@ -0,0 +1,30 @@ +/* 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 + +extern void argp_version_setup (const char *name, const char **authors); + +#ifdef __cplusplus +} +#endif + +#endif /* _ARGP_VERSION_ETC_H */ diff --git a/lib/version-etc.c b/lib/version-etc.c index c3b0289..0454ac5 100644 --- a/lib/version-etc.c +++ b/lib/version-etc.c @@ -34,26 +34,18 @@ enum { COPYRIGHT_YEAR = 2009 }; -/* Like version_etc, below, but with the NULL-terminated author list - provided via a variable of type va_list. */ +/* Display command and package names, package version, + short GPLv3+ notice, and N_AUTHORS names from the + AUTHORS array. + + For more info, see the comment before version_etc + function, below. +*/ void -version_etc_va (FILE *stream, - const char *command_name, const char *package, - const char *version, va_list authors) +version_etc_arn (FILE *stream, + const char *command_name, const char *package, + const char *version, const char *authors[], size_t n_authors) { - size_t n_authors; - - /* Count the number of authors. */ - { - va_list tmp_authors; - - va_copy (tmp_authors, authors); - - n_authors = 0; - while (va_arg (tmp_authors, const char *) != NULL) - ++n_authors; - } - if (command_name) fprintf (stream, "%s (%s) %s\n", command_name, package, version); else @@ -89,57 +81,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 +146,50 @@ 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 command and package names, package version, + short GPLv3+ notice, and the names of authors from the + NULL-terminated list AUTHORS. + + For more info, see the comment before version_etc + function, below. +*/ +void +version_etc_ar (FILE *stream, + const char *command_name, const char *package, + const char *version, const char *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); +} + +/* 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; + 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); } @@ -178,6 +215,7 @@ version_etc (FILE *stream, va_start (authors, version); version_etc_va (stream, command_name, package, version, authors); + va_end (authors); } void diff --git a/lib/version-etc.h b/lib/version-etc.h index 33a8e7f..fa6f340 100644 --- a/lib/version-etc.h +++ b/lib/version-etc.h @@ -24,6 +24,15 @@ extern const char version_etc_copyright[]; +extern void version_etc_arn (FILE *stream, + const char *command_name, const char *package, + const char *version, + const char *authors[], size_t n_authors); + +extern void version_etc_ar (FILE *stream, + const char *command_name, const char *package, + const char *version, const char *authors[]); + extern void version_etc_va (FILE *stream, const char *command_name, const char *package, const char *version, va_list authors); diff --git a/tests/test-ave-2.sh b/tests/test-ave-2.sh new file mode 100755 index 0000000..ec32c1c --- /dev/null +++ b/tests/test-ave-2.sh @@ -0,0 +1,40 @@ +#! /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.$$ +LC_ALL=C +ERR=0 + +cat > $TMP <<EOT +test-ave (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-ave --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-ave.c b/tests/test-ave.c new file mode 100644 index 0000000..ae0bc8b --- /dev/null +++ b/tests/test-ave.c @@ -0,0 +1,46 @@ +/* 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.h" +#include "argp-version-etc.h" + +static char doc[] = "test for the argp-version-etc module"; + +struct argp test_argp = { + NULL, + NULL, + NULL, + doc, + NULL, + NULL, + NULL +}; + +char *authors[] = { + "Sergey Poznyakoff", + NULL +}; + +int +main (int argc, char **argv) +{ + set_program_name (argv[0]); + argp_version_setup ("test-ave", authors); + return argp_parse (&test_argp, argc, argv, 0, NULL, NULL); +}