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

Reply via email to