/* 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
#include <argmatch.h>
#include <error.h>
-#include <xstrtoul.h>
+#include <xstrtol.h>
#include "human.h"
/* 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
uintmax_t amt;
int base;
int to_block_size;
- int tenths;
+ int tenths = 0;
int power;
char *p;
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)
{
{
int multiplier = from_block_size / to_block_size;
amt = n * multiplier;
- tenths = rounding = 0;
if (amt / multiplier != n)
{
return buf;
}
}
+ else if (from_block_size == 0)
+ amt = 0;
else
{
int divisor = to_block_size / from_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
{