summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2006-08-16 19:36:46 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2006-08-16 19:36:46 +0000
commitb96f5ea4925854db9eae61f98a7ec44568ecae7d (patch)
tree913918a48168b6e77f64b65f61e9d42b791f1ab2
parentf048f049e7dd531e207c630088d050c376b39feb (diff)
downloadcoreutils-b96f5ea4925854db9eae61f98a7ec44568ecae7d.tar.xz
Fix bugs when printing plurals of numbers that are not
unsigned long int values. * src/system.h (select_plural): New function. * src/md5sum.c (digest_check): Use select_plural to avoid bug. * src/uptime.c (print_uptime): Likewise. * src/dd.c (print_stats): Likewise. Also, don't use ngettext to print a floating point number, as reducing to 0 or 1 doesn't work for some languages. Instead, just use "s" for seconds since it doesn't need a plural form.
-rw-r--r--ChangeLog12
-rw-r--r--src/dd.c19
-rw-r--r--src/md5sum.c4
-rw-r--r--src/system.h8
-rw-r--r--src/uptime.c3
5 files changed, 37 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index ceb5e214d..5a31ecb23 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2006-08-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ Fix bugs when printing plurals of numbers that are not
+ unsigned long int values.
+ * src/system.h (select_plural): New function.
+ * src/md5sum.c (digest_check): Use select_plural to avoid bug.
+ * src/uptime.c (print_uptime): Likewise.
+ * src/dd.c (print_stats): Likewise. Also, don't use ngettext to
+ print a floating point number, as reducing to 0 or 1 doesn't work
+ for some languages. Instead, just use "s" for seconds since it
+ doesn't need a plural form.
+
2006-08-16 Bruno Haible <bruno@clisp.org>
Old versions of gzip would write --help output to stderr, and it
diff --git a/src/dd.c b/src/dd.c
index 577e9a08b..211c73127 100644
--- a/src/dd.c
+++ b/src/dd.c
@@ -550,7 +550,7 @@ print_stats (void)
fprintf (stderr,
ngettext ("%"PRIuMAX" truncated record\n",
"%"PRIuMAX" truncated records\n",
- MIN (r_truncate, ULONG_MAX)),
+ select_plural (r_truncate)),
r_truncate);
if (status_flags & STATUS_NOXFER)
@@ -562,7 +562,7 @@ print_stats (void)
fprintf (stderr,
ngettext ("%"PRIuMAX" byte (%s) copied",
"%"PRIuMAX" bytes (%s) copied",
- MIN (w_bytes, ULONG_MAX)),
+ select_plural (w_bytes)),
w_bytes,
human_readable (w_bytes, hbuf, human_opts, 1, 1));
@@ -581,10 +581,17 @@ print_stats (void)
bytes_per_second = _("Infinity B");
}
- fprintf (stderr,
- ngettext (", %g second, %s/s\n",
- ", %g seconds, %s/s\n", delta_s == 1),
- delta_s, bytes_per_second);
+ /* TRANSLATORS: The two instances of "s" in this string are the SI
+ symbol "s" (meaning second), and should not be translated.
+
+ This format used to be:
+
+ ngettext (", %g second, %s/s\n", ", %g seconds, %s/s\n", delta_s == 1)
+
+ but that was incorrect for languages like Polish. To fix this
+ bug we now use SI symbols even though they're a bit more
+ confusing in English. */
+ fprintf (stderr, _(", %g s, %s/s\n"), delta_s, bytes_per_second);
}
static void
diff --git a/src/md5sum.c b/src/md5sum.c
index 1ecd672b5..a8ce1cf27 100644
--- a/src/md5sum.c
+++ b/src/md5sum.c
@@ -563,7 +563,7 @@ digest_check (const char *checkfile_name)
" listed file could not be read",
"WARNING: %" PRIuMAX " of %" PRIuMAX
" listed files could not be read",
- n_properly_formatted_lines),
+ select_plural (n_properly_formatted_lines)),
n_open_or_read_failures, n_properly_formatted_lines);
if (n_mismatched_checksums != 0)
@@ -575,7 +575,7 @@ digest_check (const char *checkfile_name)
" computed checksum did NOT match",
"WARNING: %" PRIuMAX " of %" PRIuMAX
" computed checksums did NOT match",
- n_computed_checksums),
+ select_plural (n_computed_checksums)),
n_mismatched_checksums, n_computed_checksums);
}
}
diff --git a/src/system.h b/src/system.h
index 423f0fa8b..3f6aed6d2 100644
--- a/src/system.h
+++ b/src/system.h
@@ -383,6 +383,14 @@ static inline unsigned char to_uchar (char ch) { return ch; }
#define _(msgid) gettext (msgid)
#define N_(msgid) msgid
+/* Return a value that pluralizes the same way that N does, in all
+ languages we know of. */
+static inline unsigned long int
+select_plural (uintmax_t n)
+{
+ return (n <= ULONG_MAX ? n : n % 1000 + 1000);
+}
+
#define STREQ(a, b) (strcmp ((a), (b)) == 0)
#if !HAVE_DECL_FREE
diff --git a/src/uptime.c b/src/uptime.c
index da8618e28..bd2b0ec95 100644
--- a/src/uptime.c
+++ b/src/uptime.c
@@ -125,7 +125,8 @@ print_uptime (size_t n, const STRUCT_UTMP *this)
else
{
if (0 < updays)
- printf (ngettext ("%ld day", "%ld days", updays), updays);
+ printf (ngettext ("%ld day", "%ld days", select_plural (updays)),
+ updays);
printf (" %2d:%02d, ", uphours, upmins);
}
printf (ngettext ("%lu user", "%lu users", entries),