hey Guys,
(all based on latest SVN version of 19 jan 2008)
I created the following test:
resin Results:
strcmp('a', 'a') : 0
strcmp('b', 'a') : 1
strcmp('a', 'b') : -1
strcmp('', '0') : 0
strcmp(' ', '0') : 0
strcmp('', 'a') : -1
strcmp('', '') : 0
strcmp('0', '') : 0
strcmp('00', '') : 0
strcmp('10', '') : 1
strcmp('1', '1') : 0
strcmp('1', '2') : -1
strcmp('2', '1') : 1
strcmp('-1', '-2') : 0
strcmp('-2', '-1') : -1
strcmp('2', '2') : 1
mod_php results:
strcmp('a', 'a') : 0
strcmp('b', 'a') : 1
strcmp('a', 'b') : -1
strcmp('', '0') : -1
strcmp(' ', '0') : -16
strcmp('', 'a') : -1
strcmp('', '') : 0
strcmp('0', '') : 1
strcmp('00', '') : 2
strcmp('10', '') : 2
strcmp('1', '1') : 0
strcmp('1', '2') : -1
strcmp('2', '1') : 1
strcmp('-1', '-2') : 0
strcmp('-2', '-1') : -1
strcmp('2', '2') : 1
As you can see all evaluations between empty strings and numbers are
wrong,
looking at the java code (see below the mail) it's clear that there is
an test done
to see if both values can evaluate to a number (if
(isNumberConvertible() || rValue.isNumberConvertible()) { )
However apparently an empty string or string with spaces is seen as a
number 0 (nul).
To solve this issue properly would you feel that
1) isNumberConvertible() should return false on empty strings
2) isNumberConvertible() should return true on empty strings, but the
cmp functions needs to get changed.
This is what I did to solve my problem for now, when I comment out the
complete evaluation for numbers and do a true string compare,
this would be the output of resin (see code after:):
strcmp('a', 'a') : 0
strcmp('b', 'a') : 1
strcmp('a', 'b') : -1
strcmp('', '0') : -1
strcmp(' ', '0') : -1
strcmp('', 'a') : -1
strcmp('', '') : 0
strcmp('0', '') : 1
strcmp('00', '') : 1
strcmp('10', '') : 1
strcmp('1', '1') : 0
strcmp('1', '2') : -1
strcmp('2', '1') : 1
strcmp('-1', '-2') : 0
strcmp('-2', '-1') : -1
strcmp('2', '2') : 1
Now somebody did decide to check for numbers and do a comparison from
there,
may be it was speed reasons? or any other behafure I mist have missed?
Let me know how you feel about this so I can propose a proper patch
and an entry in bug trac later on,
kind regards,
Ries van Twisk
before:
public int cmp(Value rValue)
{
if (isNumberConvertible() || rValue.isNumberConvertible()) {
double l = toDouble();
double r = rValue.toDouble();
if (l == r)
return 0;
else if (l < r)
return -1;
else
return 1;
}
else {
int result = toString().compareTo(rValue.toString());
if (result == 0)
return 0;
else if (result > 0)
return 1;
else
return -1;
}
}
after (always compare true strings):
public int cmp(Value rValue)
{
int result = toString().compareTo(rValue.toString());
if (result == 0)
return 0;
else if (result > 0)
return 1;
else
return -1;
}
--
Ries van Twisk
Freelance TYPO3 Developer
email: [EMAIL PROTECTED]
web: http://www.rvantwisk.nl/
skype: callto://r.vantwisk
Phone: + 1 810-476-4193
_______________________________________________
resin-interest mailing list
resin-interest@caucho.com
http://maillist.caucho.com/mailman/listinfo/resin-interest