From owner-freebsd-arch Sat Jan 26 15:29:39 2002 Delivered-To: freebsd-arch@freebsd.org Received: from mail.acns.ab.ca (mail.acns.ab.ca [142.179.151.95]) by hub.freebsd.org (Postfix) with ESMTP id B45DC37B404; Sat, 26 Jan 2002 15:29:30 -0800 (PST) Received: from colnta.acns.ab.ca (colnta.acns.ab.ca [192.168.1.2]) by mail.acns.ab.ca (8.11.6/8.11.3) with ESMTP id g0QNTOV11690; Sat, 26 Jan 2002 16:29:24 -0700 (MST) (envelope-from davidc@colnta.acns.ab.ca) Received: (from davidc@localhost) by colnta.acns.ab.ca (8.11.6/8.11.3) id g0QNTO107775; Sat, 26 Jan 2002 16:29:24 -0700 (MST) (envelope-from davidc) Date: Sat, 26 Jan 2002 16:29:24 -0700 From: Chad David To: "Brian F. Feldman" Cc: Bruce Evans , arch@FreeBSD.ORG Subject: Re: strtod() Message-ID: <20020126162924.A7726@colnta.acns.ab.ca> Mail-Followup-To: "Brian F. Feldman" , Bruce Evans , arch@FreeBSD.ORG References: <200201262249.g0QMnlU91392@green.bikeshed.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <200201262249.g0QMnlU91392@green.bikeshed.org>; from green@FreeBSD.ORG on Sat, Jan 26, 2002 at 05:49:46PM -0500 Sender: owner-freebsd-arch@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG On Sat, Jan 26, 2002 at 05:49:46PM -0500, Brian F. Feldman wrote: > Chad David wrote: > > On Sun, Jan 27, 2002 at 07:44:20AM +1100, Bruce Evans wrote: > > > > > > %%% > > > errno = 0; > > > num = strtouq(val, &expr, 0); > > > if (errno != 0) /* Overflow or underflow. */ > > > err(1, "%s", oper); > > > > > > if (expr == val) /* No valid digits. */ > > > errx(1, "%s: illegal numeric value", oper); > > > %%% > > > > > > The "Overflow or underflow" comment has rotted in 3 steps: > > > (1) It was changed from "Overflow" to "Overflow or underflow" when > > > strtuol() was changed to strtoq(). This was just an obfuscation. > > > "Underflow" must be read as "overflow towards negative infinity", > > > but it's less confusing to just say "overflow". > > > (2) The code was wrong because strto*() may set errno, and broke when > > > strtoq() started setting it. The "illegal numeric value" case > > > became unreachable. > > > (3) "Overflow or underflow" wasn't changed back to "Overflow" when > > > strtoq() was changed to strtouq(). > > > > Code like this is what I'm dealing with. My point is that if you set > > errno == 0, and then after the function it is != 0, an error DID occur, > > as long as the return value == 0.0 or HUGE_VAL I guess. > > > > Am I making any sense? > > Not "as long as the return value" is anything! Why should the function be > changing errno if it hasn't generated an error? These are particularly > difficult functions to use in the first place, and they really shouldn't be > made more-so by gratuitously changing errno. It's not hard to save errno, > either, in the library call... I'm not sure if you are agreeing with me, or disagreeing with me :). When 0.0 is returned and errno == EINVAL a lot of code assumes there was an error, but current always returns with errno == EINVAL, which breaks this code when "0.0" is converted.. If you are suggesting that strtod() etc. should save errno on entry and then reset it on return (unless it wants to return its own error) then I think I agree with that. -- Chad David davidc@acns.ab.ca www.FreeBSD.org davidc@freebsd.org ACNS Inc. Calgary, Alberta Canada Fourthly, The constant breeders, beside the gain of eight shillings sterling per annum by the sale of their children, will be rid of the charge of maintaining them after the first year. - Johnathan Swift To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message