Date: Fri, 1 Mar 2013 09:13:41 -0800 From: John-Mark Gurney <jmg@funkthat.com> To: freebsd-hackers@freebsd.org Subject: Re: looking for someone to fix humanize_number (test cases included) Message-ID: <20130301171341.GJ55866@funkthat.com> In-Reply-To: <20121225194626.GA57447@volcano.org> References: <mailman.15.1356350401.35494.freebsd-hackers@freebsd.org> <20121225172037.GA56225@volcano.org> <20121225182355.GA56732@volcano.org> <20121225194626.GA57447@volcano.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Clifton Royston wrote this message on Tue, Dec 25, 2012 at 09:46 -1000:
> On Tue, Dec 25, 2012 at 08:23:55AM -1000, Clifton Royston wrote:
> > On Tue, Dec 25, 2012 at 07:20:37AM -1000, Clifton Royston wrote:
> > > On Mon, Dec 24, 2012 at 12:00:01PM +0000, freebsd-hackers-request@freebsd.org wrote:
> > > > From: John-Mark Gurney <jmg@funkthat.com>
> > > > To: hackers@FreeBSD.org
> > > > Subject: looking for someone to fix humanize_number (test cases
> > > > included)
> > > >
> > > > I'm looking for a person who is interested in fixing up humanize_number.
> > ...
> > > > So I decided to write a test program to test the output, and now I'm even
> > > > more surprised by the output... Neither 7.2-R nor 10-current give what
> > > > I expect are the correct results...
> > ...
> >
> > I am bemused.
>
> I correct myself: the function works fine, and there are no bugs I
> could find, though it's clear the man page could emphasize the correct
> usage a bit more.
>
> I had to read the source several times and start on debugging it
> before I understood the correct usage of the flag values with the scale
> and flags parameters, despite the man page stating:
>
> The following flags may be passed in scale:
>
> HN_AUTOSCALE Format the buffer using the lowest multiplier pos-
> sible.
> HN_GETSCALE Return the prefix index number (the number of
> times number must be divided to fit) instead of
> formatting it to the buffer.
>
> The following flags may be passed in flags:
>
> HN_DECIMAL If the final result is less than 10, display it
> using one digit.
> ...
> HN_DIVISOR_1000 Divide number with 1000 instead of 1024.
>
> That is, certain flags must be passed in flags and others must only
> be passed in scale - a bit counter-intuitive. Also, scale == 0 is
> clearly not interpreted as AUTOSCALE, but I am not yet clear how it is
> being handled - it seems somewhat like AUTOSCALE but not identical.
>
> When the test program constant table is updated to pass the scale
> flags as specified, as well as fixing the bugs mentioned in the
> previous emails, it all passes except for the one (intentional?)
> inconsistency that "k" is used in place of "K" if HN_DECIMAL is
> enabled.
>
> The bug in the transfer speed results which prompted this inquiry
> suggests that perhaps some clients of humanize_number in the codebase
> are also passing the scale parameters incorrectly. I would propose
> accepting HN_AUTOSCALE and HN_GETSCALE in the flags field (they don't
> overlap with other values) while continuing to accept them in the scale
> field for backwards compatibility. Trivial diff below.
Sorry I didn't get back to this, but now I have a few minutes...
> + getscale = (flags | scale) & HN_GETSCALE;
This isn't good:
#define HN_IEC_PREFIXES 0x10
#define HN_GETSCALE 0x10
If someone sets HN_IEC_PREFIXES, they'll acidentally enable _GETSCALE..
We could do something anoying by changing the value of _GETSCALE, and
then leaving some legacy code to accept the old _GETSCALE on the scale
input... This would let new code work, but would break new code on
old libraries... So, I don't see an easy way to fix this...
--
John-Mark Gurney Voice: +1 415 225 5579
"All that I will do, has been done, All that I have, has not."
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130301171341.GJ55866>
