Hi Jim,

Jim Meyering wrote on Sunday:
> +2007-07-22  Jim Meyering  <[EMAIL PROTECTED]>
> +
> +     Make some invalid-integer diagnostics easier to translate properly.
> +     * src/system.h (OPT_STR): Define.
> +     (opt_str): New function.
> +     * src/od.c (main): Declare new local, oi.
> +     Set it via the call to getopt_long.
> +     Use its value to build the option string we pass to STRTOL_FATAL_ERROR.
> +     * src/pr.c (first_last_page): Use the not-translated string, "--pages"
> +     in diagnostics about invalid arguments.
> +     * src/sort.c (specify_sort_size): Add a parameter.  Update callers.
> +     (main): Use new macro to pass required string to specify_sort_size.

Looks all fine to me (except that I usually avoid strncpy, because it wastes
time filling in zero bytes).

I am committing your patch to xstrtol.h, with updated variable names and
comments. Also, a corresponding change to the 'human' module. Find attached
the corresponding coreutils change (untested but obvious).


2007-07-25  Jim Meyering  <[EMAIL PROTECTED]>
            Bruno Haible  <[EMAIL PROTECTED]>

        * lib/xstrtol.h (_STRTOL_ERROR): Change third argument from a
        localized noun to an option name.
        (STRTOL_FATAL_ERROR, STRTOL_FAIL_WARN): Likewise.
        * lib/human.h (human_options): Insert a third argument.
        * lib/human.h (human_options): Likewise. Pass it to STRTOL_FATAL_ERROR.

*** lib/xstrtol.h       19 Oct 2006 07:51:14 -0000      1.22
--- lib/xstrtol.h       25 Jul 2007 22:38:02 -0000
***************
*** 1,6 ****
  /* A more useful interface to strtol.
  
!    Copyright (C) 1995, 1996, 1998, 1999, 2001, 2002, 2003, 2004, 2006
     Free Software Foundation, Inc.
  
     This program is free software; you can redistribute it and/or modify
--- 1,6 ----
  /* A more useful interface to strtol.
  
!    Copyright (C) 1995, 1996, 1998, 1999, 2001-2004, 2006-2007
     Free Software Foundation, Inc.
  
     This program is free software; you can redistribute it and/or modify
***************
*** 50,56 ****
  _DECLARE_XSTRTOL (xstrtoimax, intmax_t)
  _DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
  
! # define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err)     \
    do                                                                  \
      {                                                                 \
        switch ((Err))                                                  \
--- 50,63 ----
  _DECLARE_XSTRTOL (xstrtoimax, intmax_t)
  _DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
  
! /* Signal an error for an out-of-range integer argument, through the error()
!    function.
!    EXIT_CODE is the exit code (0 for a non-fatal error).
!    STR is the value of the given argument value.
!    OPTION is the option that takes the argument (usually starting with one
!    or two minus signs).
!    ERR is the error code returned by one of the xstrto* functions.  */
! # define _STRTOL_ERROR(Exit_code, Str, Option, Err)                   \
    do                                                                  \
      {                                                                 \
        switch ((Err))                                                  \
***************
*** 59,87 ****
          abort ();                                                     \
                                                                        \
        case LONGINT_INVALID:                                           \
!         error ((Exit_code), 0, gettext ("invalid %s `%s'"),           \
!                (Argument_type_string), (Str));                        \
          break;                                                        \
                                                                        \
        case LONGINT_INVALID_SUFFIX_CHAR:                               \
        case LONGINT_INVALID_SUFFIX_CHAR | LONGINT_OVERFLOW:            \
          error ((Exit_code), 0,                                        \
!                gettext ("invalid character following %s in `%s'"),    \
!                (Argument_type_string), (Str));                        \
          break;                                                        \
                                                                        \
        case LONGINT_OVERFLOW:                                          \
!         error ((Exit_code), 0, gettext ("%s `%s' too large"),         \
!                (Argument_type_string), (Str));                        \
          break;                                                        \
        }                                                               \
      }                                                                 \
    while (0)
  
! # define STRTOL_FATAL_ERROR(Str, Argument_type_string, Err)           \
!   _STRTOL_ERROR (exit_failure, Str, Argument_type_string, Err)
  
! # define STRTOL_FAIL_WARN(Str, Argument_type_string, Err)             \
!   _STRTOL_ERROR (0, Str, Argument_type_string, Err)
  
  #endif /* not XSTRTOL_H_ */
--- 66,94 ----
          abort ();                                                     \
                                                                        \
        case LONGINT_INVALID:                                           \
!         error ((Exit_code), 0, gettext ("invalid %s argument `%s'"),  \
!                (Option), (Str));                                      \
          break;                                                        \
                                                                        \
        case LONGINT_INVALID_SUFFIX_CHAR:                               \
        case LONGINT_INVALID_SUFFIX_CHAR | LONGINT_OVERFLOW:            \
          error ((Exit_code), 0,                                        \
!                gettext ("invalid character following %s argument in `%s'"), \
!                (Option), (Str));                                      \
          break;                                                        \
                                                                        \
        case LONGINT_OVERFLOW:                                          \
!         error ((Exit_code), 0, gettext ("%s argument `%s' too large"), \
!                (Option), (Str));                                      \
          break;                                                        \
        }                                                               \
      }                                                                 \
    while (0)
  
! # define STRTOL_FATAL_ERROR(Str, Option, Err)                         \
!   _STRTOL_ERROR (exit_failure, Str, Option, Err)
  
! # define STRTOL_FAIL_WARN(Str, Option, Err)                           \
!   _STRTOL_ERROR (0, Str, Option, Err)
  
  #endif /* not XSTRTOL_H_ */
*** NEWS        14 Jul 2007 16:25:53 -0000      1.24
--- NEWS        25 Jul 2007 22:38:02 -0000
***************
*** 6,11 ****
--- 6,15 ----
  
  Date        Modules         Changes
  
+ 2007-07-26  human           The function human_options takes an additional
+                             third argument, the option that introduced the
+                             argument that was passed to a xstrto* function.
+ 
  2007-07-14  gpl, lgpl       New Texinfo versions with no sectioning commands.
  
  2007-07-10  version-etc     Output now mentions GPLv3+, not GPLv2+.  Use
*** lib/human.h 21 Aug 2006 06:11:26 -0000      1.15
--- lib/human.h 25 Jul 2007 22:38:02 -0000
***************
*** 1,7 ****
  /* human.h -- print human readable file size
  
     Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
!    2005, 2006 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
--- 1,7 ----
  /* human.h -- print human readable file size
  
     Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
!    2005, 2006, 2007 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
***************
*** 78,83 ****
  
  char *human_readable (uintmax_t, char *, int, uintmax_t, uintmax_t);
  
! int human_options (char const *, bool, uintmax_t *);
  
  #endif /* HUMAN_H_ */
--- 78,83 ----
  
  char *human_readable (uintmax_t, char *, int, uintmax_t, uintmax_t);
  
! int human_options (char const *, bool, char const *, uintmax_t *);
  
  #endif /* HUMAN_H_ */
*** lib/human.c 5 Oct 2006 21:23:21 -0000       1.34
--- lib/human.c 25 Jul 2007 22:38:02 -0000
***************
*** 1,7 ****
  /* human.c -- print human readable file size
  
     Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
!    2005, 2006 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
--- 1,7 ----
  /* human.c -- print human readable file size
  
     Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
!    2005, 2006, 2007 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
***************
*** 464,470 ****
  }
  
  int
! human_options (char const *spec, bool report_errors, uintmax_t *block_size)
  {
    int opts;
    strtol_error e = humblock (spec, block_size, &opts);
--- 464,471 ----
  }
  
  int
! human_options (char const *spec, bool report_errors, char const *option,
!              uintmax_t *block_size)
  {
    int opts;
    strtol_error e = humblock (spec, block_size, &opts);
***************
*** 474,479 ****
        e = LONGINT_INVALID;
      }
    if (e != LONGINT_OK && report_errors)
!     STRTOL_FATAL_ERROR (spec, _("block size"), e);
    return opts;
  }
--- 475,480 ----
        e = LONGINT_INVALID;
      }
    if (e != LONGINT_OK && report_errors)
!     STRTOL_FATAL_ERROR (spec, option, e);
    return opts;
  }
diff --git a/src/df.c b/src/df.c
index 41bda87..f4844e7 100644
--- a/src/df.c
+++ b/src/df.c
@@ -798,16 +798,22 @@ main (int argc, char **argv)
   posix_format = false;
   exit_status = EXIT_SUCCESS;
 
-  while ((c = getopt_long (argc, argv, "aB:iF:hHklmPTt:vx:", long_options, NULL))
-	 != -1)
+  while (true)
     {
+      int oi = -1;
+      int c = getopt_long (argc, argv, "aB:iF:hHklmPTt:vx:", long_options, &oi);
+      if (c == -1)
+	break;
+
       switch (c)
 	{
 	case 'a':
 	  show_all_fs = true;
 	  break;
 	case 'B':
-	  human_output_opts = human_options (optarg, true, &output_block_size);
+	  human_output_opts =
+	    human_options (optarg, true, OPT_STR (oi, c, long_options),
+			   &output_block_size);
 	  break;
 	case 'i':
 	  inode_format = true;
@@ -874,7 +880,7 @@ main (int argc, char **argv)
 	}
       else
 	human_output_opts = human_options (getenv ("DF_BLOCK_SIZE"), false,
-					   &output_block_size);
+					   NULL, &output_block_size);
     }
 
   /* Fail if the same file system type was both selected and excluded.  */
diff --git a/src/du.c b/src/du.c
index 57678d9..cbfbbb5 100644
--- a/src/du.c
+++ b/src/du.c
@@ -697,12 +697,17 @@ main (int argc, char **argv)
 
   exclude = new_exclude ();
 
-  human_output_opts = human_options (getenv ("DU_BLOCK_SIZE"), false,
+  human_output_opts = human_options (getenv ("DU_BLOCK_SIZE"), false, NULL,
 				     &output_block_size);
 
-  while ((c = getopt_long (argc, argv, DEBUG_OPT "0abchHklmsxB:DLPSX:",
-			   long_options, NULL)) != -1)
+  while (true)
     {
+      int oi = -1;
+      int c = getopt_long (argc, argv, DEBUG_OPT "0abchHklmsxB:DLPSX:",
+			   long_options, &oi);
+      if (c == -1)
+	break;
+
       switch (c)
 	{
 #if DU_DEBUG
@@ -793,7 +798,9 @@ main (int argc, char **argv)
 	  break;
 
 	case 'B':
-	  human_output_opts = human_options (optarg, true, &output_block_size);
+	  human_output_opts =
+	    human_options (optarg, true, OPT_STR (oi, c, long_options),
+			   &output_block_size);
 	  break;
 
 	case 'D': /* This will eventually be 'H' (-H), too.  */
diff --git a/src/ls.c b/src/ls.c
index ee73622..c29b62a 100644
--- a/src/ls.c
+++ b/src/ls.c
@@ -1450,7 +1450,7 @@ decode_switches (int argc, char **argv)
 
   {
     char const *ls_block_size = getenv ("LS_BLOCK_SIZE");
-    human_output_opts = human_options (ls_block_size, false,
+    human_output_opts = human_options (ls_block_size, false, NULL,
 				       &output_block_size);
     if (ls_block_size || getenv ("BLOCK_SIZE"))
       file_output_block_size = output_block_size;
@@ -1506,10 +1506,15 @@ decode_switches (int argc, char **argv)
       }
   }
 
-  while ((c = getopt_long (argc, argv,
-			   "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UXZ1",
-			   long_options, NULL)) != -1)
+  while (true)
     {
+      int oi = -1;
+      int c = getopt_long (argc, argv,
+			   "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UXZ1",
+			   long_options, &oi);
+      if (c == -1)
+	break;
+
       switch (c)
 	{
 	case 'a':
@@ -1793,7 +1798,9 @@ decode_switches (int argc, char **argv)
 	  break;
 
 	case BLOCK_SIZE_OPTION:
-	  human_output_opts = human_options (optarg, true, &output_block_size);
+	  human_output_opts =
+	    human_options (optarg, true, OPT_STR (oi, c, long_options),
+			   &output_block_size);
 	  file_output_block_size = output_block_size;
 	  break;
 

Reply via email to