On Fri, Jul 23, 2010 at 03:34, Dan Sommers <[email protected]> wrote:
> On Thu, 22 Jul 2010 14:38:16 +0200, Csaba Raduly wrote:
>
>> Anyway, here's a revised version:
>> --- xmlschemastypes2.c 2010-07-21 13:17:12.229467800 +0200 +++
>> xmlschemastypes.c 2010-07-22 14:00:05.965759600 +0200 @@ -2392,6
>> +2392,8 @@
>> case XML_SCHEMAS_DOUBLE:{
>> const xmlChar *cur = value;
>> int neg = 0;
>> + int digits_before = 0;
>> + int digits_after = 0;
>
> There's no need for two counters. Just use the same counter inside both
> loops and check for that counter being zero (or non-zero) at the end
> (then again, a sufficiently clever optimizer may already be doing that
> for you).
No, optimizer cannot to do that because they aren't equivalent. Just
imagine that one int (e.g. digits_before) obtained value 1 and another
overflowed to -1. This scenario will produce "true" in
digits_before+digits_after==0 check. Now imagine the only one
counter. On the same imaginable data it will be overflowed to -2 and
check for zero will return "false".
But anyway, I see no needs in counters at all. Just because what you
need is just an boolean flag (zero vs. not zero, there were any digits
or not). Something like that:
int digits_found=0;
...
...
while ((*cur >= '0') && (*cur <= '9'))
{
++cur;
digits_found=1;
}
...
...
if (!digits_found)
{
/* handle error */
}
By the way it far simpler for optimizer and may be handled better by
it indeed without unsafe tricks and assumptions.
> IMO, that fits the spirit of "a finite-length sequence of
> decimal digits separated by a period" fairly well.
--
Andrew W. Nosenko <[email protected]>
_______________________________________________
xml mailing list, project page http://xmlsoft.org/
[email protected]
http://mail.gnome.org/mailman/listinfo/xml