bug-gnulib
[Top][All Lists]
Advanced

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

Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch


From: Bruno Haible
Subject: Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch
Date: Tue, 23 Sep 2003 13:39:03 +0200
User-agent: KMail/1.5

Gary V. Vaughan wrote:
> The function could then collect and count the AUTHORS and select an
> appropriate msgid at runtime, or botch together a good approximation if
> some package with 30 authors uses it...

Here is a patch for it. I think it adresses all concerns:

- Translators don't have excess work to do.
- It internationalizes well, even in languages where commas and "and"
  are placed differently.
- The code is simple, small, robust.
- Line breaking does occur, but not at spaces within author names.

Any objections?

Bruno


*** version-etc.h       18 Jun 2003 05:52:19 -0000      1.6
--- version-etc.h       23 Sep 2003 11:33:32 -0000
***************
*** 20,31 ****
  #ifndef VERSION_ETC_H
  # define VERSION_ETC_H 1
  
  # include <stdio.h>
  
  extern char *version_etc_copyright;
  
! void version_etc (FILE *stream,
!                 const char *command_name, const char *package,
!                 const char *version, const char *authors);
  
  #endif /* VERSION_ETC_H */
--- 20,37 ----
  #ifndef VERSION_ETC_H
  # define VERSION_ETC_H 1
  
+ # include <stdarg.h>
  # include <stdio.h>
  
  extern char *version_etc_copyright;
  
! extern void version_etc_va (FILE *stream,
!                           const char *command_name, const char *package,
!                           const char *version, va_list authors);
! 
! extern void version_etc (FILE *stream,
!                        const char *command_name, const char *package,
!                        const char *version,
!                        /* const char *author1, ...*/ ...);
  
  #endif /* VERSION_ETC_H */
*** version-etc.c       6 Jan 2003 13:20:08 -0000       1.12
--- version-etc.c       23 Sep 2003 11:33:32 -0000
***************
*** 21,29 ****
  # include <config.h>
  #endif
  
  #include <stdio.h>
  #include "unlocked-io.h"
- #include "version-etc.h"
  
  #include "gettext.h"
  #define _(msgid) gettext (msgid)
--- 21,33 ----
  # include <config.h>
  #endif
  
+ /* Specification.  */
+ #include "version-etc.h"
+ 
+ #include <stdarg.h>
  #include <stdio.h>
+ #include <stdlib.h>
  #include "unlocked-io.h"
  
  #include "gettext.h"
  #define _(msgid) gettext (msgid)
***************
*** 35,60 ****
    "Copyright (C) 2003 Free Software Foundation, Inc.";
  
  
! /* 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:
! 
!    PACKAGE VERSION
! 
!    or
! 
!    COMMAND_NAME (PACKAGE) VERSION.  */
  void
! version_etc (FILE *stream,
!            const char *command_name, const char *package,
!            const char *version, const char *authors)
  {
    if (command_name)
      fprintf (stream, "%s (%s) %s\n", command_name, package, version);
    else
      fprintf (stream, "%s %s\n", package, version);
!   fprintf (stream, _("Written by %s.\n"), authors);
    putc ('\n', stream);
  
    fputs (version_etc_copyright, stream);
--- 39,144 ----
    "Copyright (C) 2003 Free Software Foundation, Inc.";
  
  
! /* 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)
  {
+   unsigned int n_authors;
+ 
+   /* Count the number of authors.  */
+   {
+     va_list tmp_authors;
+ 
+ #ifdef __va_copy
+     __va_copy (tmp_authors, authors);
+ #else
+     tmp_authors = authors;
+ #endif
+ 
+     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
      fprintf (stream, "%s %s\n", package, version);
! 
!   switch (n_authors)
!     {
!     case 0:
!       /* The caller must provide at least one author name.  */
!       abort ();
!     case 1:
!       /* TRANSLATORS: %s denotes an author name.  */
!       vfprintf (stream, _("Written by %s.\n"), authors);
!       break;
!     case 2:
!       /* TRANSLATORS: Each %s denotes an author name.  */
!       vfprintf (stream, _("Written by %s and %s.\n"), authors);
!       break;
!     case 3:
!       /* TRANSLATORS: Each %s denotes an author name.  */
!       vfprintf (stream, _("Written by %s, %s, and %s.\n"), authors);
!       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);
!       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);
!       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);
!       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);
!       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, _("\
! Written by %s, %s, %s,\n%s, %s, %s, %s,\nand %s.\n"),
!               authors);
!       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, _("\
! Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, and %s.\n"),
!               authors);
!       break;
!     default:
!       /* 10 or more authors.  Use an abbreviation, since the human reader
!        will probably not want to read the entire list anyway.  */
!       /* 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, %s,\n%s, %s, and others.\n"),
!               authors);
!       break;
!     }
!   va_end (authors);
    putc ('\n', stream);
  
    fputs (version_etc_copyright, stream);
***************
*** 64,67 ****
--- 148,176 ----
  This is free software; see the source for copying conditions.  There is NO\n\
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR 
PURPOSE.\n"),
         stream);
+ }
+ 
+ 
+ /* 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:
+ 
+    PACKAGE VERSION
+ 
+    or
+ 
+    COMMAND_NAME (PACKAGE) VERSION.
+ 
+    The author names are passed as separate arguments, with an additional
+    NULL argument at the end.  */
+ void
+ version_etc (FILE *stream,
+            const char *command_name, const char *package,
+            const char *version, /* const char *author1, ...*/ ...)
+ {
+   va_list authors;
+ 
+   va_start (authors, version);
+   version_etc_va (stream, command_name, package, version, authors);
  }
*** long-options.h      18 Jun 2003 05:52:19 -0000      1.13
--- long-options.h      23 Sep 2003 11:33:32 -0000
***************
*** 22,26 ****
                         const char *_command_name,
                         const char *_package,
                         const char *_version,
!                        const char *_authors,
!                        void (*_usage) (int));
--- 22,26 ----
                         const char *_command_name,
                         const char *_package,
                         const char *_version,
!                        void (*_usage) (int),
!                        /* const char *author1, ...*/ ...);
*** long-options.c      9 Sep 2003 20:06:56 -0000       1.18
--- long-options.c      23 Sep 2003 11:33:32 -0000
***************
*** 23,33 ****
  # include <config.h>
  #endif
  
  #include "long-options.h"
  
  #include <stdio.h>
- #include <getopt.h>
  #include <stdlib.h>
  
  #include "version-etc.h"
  
--- 23,35 ----
  # include <config.h>
  #endif
  
+ /* Specification.  */
  #include "long-options.h"
  
+ #include <stdarg.h>
  #include <stdio.h>
  #include <stdlib.h>
+ #include <getopt.h>
  
  #include "version-etc.h"
  
***************
*** 47,54 ****
                    const char *command_name,
                    const char *package,
                    const char *version,
!                   const char *authors,
!                   void (*usage_func)())
  {
    int c;
    int saved_opterr;
--- 49,56 ----
                    const char *command_name,
                    const char *package,
                    const char *version,
!                   void (*usage_func)(),
!                   /* const char *author1, ...*/ ...)
  {
    int c;
    int saved_opterr;
***************
*** 67,74 ****
          (*usage_func) (0);
  
        case 'v':
!         version_etc (stdout, command_name, package, version, authors);
!         exit (0);
  
        default:
          /* Don't process any other long-named options.  */
--- 69,80 ----
          (*usage_func) (0);
  
        case 'v':
!         {
!           va_list authors;
!           va_start (authors, usage_func);
!           version_etc_va (stdout, command_name, package, version, authors);
!           exit (0);
!         }
  
        default:
          /* Don't process any other long-named options.  */





reply via email to

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