From: Bruno Haible Date: Mon, 6 Oct 2003 20:30:17 +0000 (+0000) Subject: Merge version-etc-2 back into version-etc: Better way to internationalize X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1bd3e749e2f001b333f49fd6d8b358714f2ef09f;p=pspp Merge version-etc-2 back into version-etc: Better way to internationalize the "Written by ..." sentence. --- diff --git a/lib/ChangeLog b/lib/ChangeLog index 8fc63aad66..cc01ef87a8 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,27 @@ +2003-09-25 Jim Meyering + Bruno Haible + + This lets translators provide better translations for the + "Written by ..." part of --version output. + * version-etc.h: Include stdarg.h. + (version_etc_copyright): Declare as readonly. + (version_etc): Make this function variadic with a NULL-terminated list + of author name strings. + (version_etc_va): New declaration. + * version-etc.c: Include stdarg.h, stdlib.h. + (version_etc_copyright): Declare as readonly. + (version_etc_va): New function. Provide a different translatable string + for each possible number of authors < 10. Abbreviate when there are 10 + authors or more. + (version_etc): Make this function variadic. Call version_etc_va. + Suggestion from Gary V. Vaughan. + + * long-options.h (parse_long_options): Change prototype: the authors + string is moved to the end and becomes variadic. + * long-options.c: Include stdarg.h. + (parse_long_options): Make this function variadic, too. + Call version_etc_va, not version_etc. + 2003-10-06 Bruno Haible * fatal-signal.h: New file, from GNU gettext. diff --git a/lib/long-options.c b/lib/long-options.c index 58bc93c1d1..ada070eb00 100644 --- a/lib/long-options.c +++ b/lib/long-options.c @@ -23,11 +23,13 @@ # include #endif +/* Specification. */ #include "long-options.h" +#include #include -#include #include +#include #include "version-etc.h" @@ -47,8 +49,8 @@ parse_long_options (int argc, const char *command_name, const char *package, const char *version, - const char *authors, - void (*usage_func)()) + void (*usage_func)(), + /* const char *author1, ...*/ ...) { int c; int saved_opterr; @@ -67,8 +69,12 @@ parse_long_options (int argc, (*usage_func) (0); case 'v': - version_etc (stdout, command_name, package, version, authors); - exit (0); + { + 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. */ diff --git a/lib/long-options.h b/lib/long-options.h index e89b3512de..50f0c34e10 100644 --- a/lib/long-options.h +++ b/lib/long-options.h @@ -22,5 +22,5 @@ void parse_long_options (int _argc, const char *_command_name, const char *_package, const char *_version, - const char *_authors, - void (*_usage) (int)); + void (*_usage) (int), + /* const char *author1, ...*/ ...); diff --git a/lib/version-etc.c b/lib/version-etc.c index 663aa8dcf0..e32742b179 100644 --- a/lib/version-etc.c +++ b/lib/version-etc.c @@ -21,40 +21,124 @@ # include #endif +/* Specification. */ +#include "version-etc.h" + +#include #include +#include #include "unlocked-io.h" -#include "version-etc.h" #include "gettext.h" #define _(msgid) gettext (msgid) /* Default copyright goes to the FSF. */ -char* version_etc_copyright = +const char* version_etc_copyright = /* Do *not* mark this string for translation. */ "Copyright (C) 2003 Free Software Foundation, Inc."; -/* Display the --version information the standard way. +/* 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; - 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 +#ifdef __va_copy + __va_copy (tmp_authors, authors); +#else + tmp_authors = authors; +#endif - or + n_authors = 0; + while (va_arg (tmp_authors, const char *) != NULL) + ++n_authors; + } - 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); + + 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); @@ -65,3 +149,28 @@ 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); +} diff --git a/lib/version-etc.h b/lib/version-etc.h index e2ef98185d..d505e75eae 100644 --- a/lib/version-etc.h +++ b/lib/version-etc.h @@ -20,12 +20,18 @@ #ifndef VERSION_ETC_H # define VERSION_ETC_H 1 +# include # include -extern char *version_etc_copyright; +extern const char *version_etc_copyright; -void version_etc (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); + +extern void version_etc (FILE *stream, + const char *command_name, const char *package, + const char *version, + /* const char *author1, ...*/ ...); #endif /* VERSION_ETC_H */