bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

New module argp-version-etc


From: Sergey Poznyakoff
Subject: New module argp-version-etc
Date: Wed, 24 Jun 2009 16:14:33 +0300

Hello,

The new module argp-version-etc (patch 2) is designed to
facilitate the use of argp and version-etc modules together.
This will ensure uniform version output between several
programs within the same project, and will be useful for
such projects as, for example, GNU Inetutils. 

This new functionality requires some minor changes to the
existing version-etc module (patch 1).

Opinions?

Regards,
Sergey

2009-06-24  Sergey Poznyakoff  <address@hidden>

        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
        prototyples.

diff --git a/lib/version-etc.c b/lib/version-etc.c
index c3b0289..6a51656 100644
--- a/lib/version-etc.c
+++ b/lib/version-etc.c
@@ -34,26 +34,11 @@
 
 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)
+version_etc_arn (FILE *stream,
+                const char *command_name, const char *package,
+                const char *version, size_t n_authors, const char *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 +74,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 +139,43 @@ 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);
+}
+
+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, n_authors, 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,
+                  n_authors, authtab);
 }
 
 
diff --git a/lib/version-etc.h b/lib/version-etc.h
index 33a8e7f..2a6135f 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,
+                            size_t n_authors, const char *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);
2009-06-24  Sergey Poznyakoff  <address@hidden>

        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/tests/test-ave-2.sh b/tests/test-ave-2.sh
new file mode 100755
index 0000000..a470d4d
--- /dev/null
+++ b/tests/test-ave-2.sh
@@ -0,0 +1,38 @@
+#! /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 (C) 2009 Free Software Foundation, Inc.
+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 | 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..a19c62b
--- /dev/null
+++ b/tests/test-ave.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.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);
+}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]