(__strtol): Remove decl; it doesn't work if __strtol
[gnulib.git] / lib / human.c
index d03a2e4..7b923dc 100644 (file)
@@ -1,5 +1,5 @@
 /* human.c -- print human readable file size
-   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999 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
 # include <config.h>
 #endif
 
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-
 #include <sys/types.h>
 #include <stdio.h>
 
 # include <limits.h>
 #endif
 
+#if HAVE_STRING_H
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+
 #ifndef CHAR_BIT
 # define CHAR_BIT 8
 #endif
@@ -54,7 +56,7 @@ char *getenv ();
 
 #include <argmatch.h>
 #include <error.h>
-#include <xstrtoul.h>
+#include <xstrtol.h>
 
 #include "human.h"
 
@@ -74,7 +76,7 @@ static const char suffixes[] =
 /* Convert N to a human readable format in BUF.
 
    N is expressed in units of FROM_BLOCK_SIZE.  FROM_BLOCK_SIZE must
-   be positive.
+   be nonnegative.
 
    If OUTPUT_BLOCK_SIZE is positive, use units of OUTPUT_BLOCK_SIZE in
    the output number.  OUTPUT_BLOCK_SIZE must be a multiple of
@@ -99,7 +101,7 @@ human_readable (uintmax_t n, char *buf,
   uintmax_t amt;
   int base;
   int to_block_size;
-  int tenths;
+  int tenths = 0;
   int power;
   char *p;
 
@@ -107,7 +109,7 @@ human_readable (uintmax_t n, char *buf,
      1 means AMT.TENTHS < adjusted N < AMT.TENTHS + 0.05;
      2 means adjusted N == AMT.TENTHS + 0.05;
      3 means AMT.TENTHS + 0.05 < adjusted N < AMT.TENTHS + 0.1.  */
-  int rounding;
+  int rounding = 0;
 
   if (output_block_size < 0)
     {
@@ -134,7 +136,6 @@ human_readable (uintmax_t n, char *buf,
     {
       int multiplier = from_block_size / to_block_size;
       amt = n * multiplier;
-      tenths = rounding = 0;
 
       if (amt / multiplier != n)
        {
@@ -170,6 +171,8 @@ human_readable (uintmax_t n, char *buf,
          return buf;
        }
     }
+  else if (from_block_size == 0)
+    amt = 0;
   else
     {
       int divisor = to_block_size / from_block_size;
@@ -258,7 +261,7 @@ humblock (char const *spec, int *block_size)
 
   if (! spec && ! (spec = getenv ("BLOCK_SIZE")))
     *block_size = getenv ("POSIXLY_CORRECT") ? 512 : DEFAULT_BLOCK_SIZE;
-  else if (0 <= (i = argmatch (spec, block_size_args)))
+  else if (0 <= (i = ARGMATCH (spec, block_size_args, block_size_types)))
     *block_size = block_size_types[i];
   else
     {