X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fhuman.c;h=79336624a96055a15e7c604f3ed2660498e8e764;hb=d3aea660de14898af6f8f03d452f58b28126dabc;hp=dbf536b1efdd630c151934c2ecd4ca2dda49428f;hpb=fd6c022736a6618466bc5561361aa3db08a3f0a0;p=gnulib.git diff --git a/lib/human.c b/lib/human.c index dbf536b1e..79336624a 100644 --- a/lib/human.c +++ b/lib/human.c @@ -1,6 +1,6 @@ /* human.c -- print human readable file size - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify @@ -25,17 +25,7 @@ #include "human.h" -#ifndef SIZE_MAX -# define SIZE_MAX ((size_t) -1) -#endif -#ifndef UINTMAX_MAX -# define UINTMAX_MAX ((uintmax_t) -1) -#endif - -#if HAVE_LOCALE_H && HAVE_LOCALECONV -# include -#endif - +#include #include #include #include @@ -45,8 +35,16 @@ #include #include +#include #include +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif +#ifndef UINTMAX_MAX +# define UINTMAX_MAX ((uintmax_t) -1) +#endif + /* The maximum length of a suffix like "KiB". */ #define HUMAN_READABLE_SUFFIX_LENGTH_MAX 3 @@ -102,10 +100,8 @@ group_number (char *number, size_t numberlen, size_t i = numberlen; /* The maximum possible value for NUMBERLEN is the number of digits - in the square of the largest uintmax_t, so double the size of - uintmax_t before converting to a bound. 302 / 1000 is ceil - (log10 (2.0)). Add 1 for integer division truncation. */ - char buf[2 * sizeof (uintmax_t) * CHAR_BIT * 302 / 1000 + 1]; + in the square of the largest uintmax_t, so double the size needed. */ + char buf[2 * INT_STRLEN_BOUND (uintmax_t) + 1]; memcpy (buf, number, numberlen); d = number + numberlen; @@ -158,6 +154,9 @@ group_number (char *number, size_t numberlen, so on. Numbers smaller than the power aren't modified. human_autoscale is normally used together with human_SI. + If (OPTS & human_space_before_unit), use a space to separate the + number from any suffix that is appended as described below. + If (OPTS & human_SI), append an SI prefix indicating which power is being used. If in addition (OPTS & human_B), append "B" (if base 1000) or "iB" (if base 1024) to the SI prefix. When ((OPTS & @@ -190,7 +189,6 @@ human_readable (uintmax_t n, char *buf, int opts, size_t decimal_pointlen = 1; char const *grouping = ""; char const *thousands_sep = ""; -#if HAVE_LOCALE_H && HAVE_LOCALECONV struct lconv const *l = localeconv (); size_t pointlen = strlen (l->decimal_point); if (0 < pointlen && pointlen <= MB_LEN_MAX) @@ -201,7 +199,6 @@ human_readable (uintmax_t n, char *buf, int opts, grouping = l->grouping; if (strlen (l->thousands_sep) <= MB_LEN_MAX) thousands_sep = l->thousands_sep; -#endif psuffix = buf + LONGEST_HUMAN_READABLE - HUMAN_READABLE_SUFFIX_LENGTH_MAX; p = psuffix; @@ -300,8 +297,8 @@ human_readable (uintmax_t n, char *buf, int opts, { do { - unsigned r10 = (amt % base) * 10 + tenths; - unsigned r2 = (r10 % base) * 2 + (rounding >> 1); + unsigned int r10 = (amt % base) * 10 + tenths; + unsigned int r2 = (r10 % base) * 2 + (rounding >> 1); amt /= base; tenths = r10 / base; rounding = (r2 < base @@ -384,6 +381,9 @@ human_readable (uintmax_t n, char *buf, int opts, break; } + if ((exponent | (opts & human_B)) && (opts & human_space_before_unit)) + *psuffix++ = ' '; + if (exponent) *psuffix++ = (! (opts & human_base_1024) && exponent == 1 ? 'k'