[Top][All Lists]
[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. */
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, (continued)
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Paul Eggert, 2003/09/22
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Bruno Haible, 2003/09/23
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Paul Eggert, 2003/09/23
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Bruno Haible, 2003/09/23
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Paul Eggert, 2003/09/23
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Bruno Haible, 2003/09/25
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Jim Meyering, 2003/09/25
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Jim Meyering, 2003/09/21
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Bruno Haible, 2003/09/22
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Jim Meyering, 2003/09/22
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch,
Bruno Haible <=
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Gary V. Vaughan, 2003/09/23
- Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Paul Eggert, 2003/09/17
Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Gary V . Vaughan, 2003/09/16
Re: [Bug-gnulib] 4-gary-version-etc-full-author-string.patch, Karl Berry, 2003/09/23