--FILE--
<?php
+print "TESTING COMPARE\n";
$special_forms = array("-dev", "a1", "b1", "RC1", "", "pl1");
+$operators = array(
+ "lt", "<",
+ "le", "<=",
+ "gt", ">",
+ "ge", ">=",
+ "eq", "=", "==",
+ "ne", "<>", "!="
+);
test("1", "2");
test("10", "2");
test("1.0", "1.1");
test("1.0$f1", "1.0$f2");
}
}
-
+print "TESTING OPERATORS\n";
+foreach ($special_forms as $f1) {
+ foreach ($special_forms as $f2) {
+ foreach ($operators as $op) {
+ $v1 = "1.0$f1";
+ $v2 = "1.0$f2";
+ $test = version_compare($v1, $v2, $op) ? "true" : "false";
+ printf("%7s %2s %-7s : %s\n", $v1, $op, $v2, $test);
+ }
+ }
+}
function test($v1, $v2) {
$compare = version_compare($v1, $v2);
?>
--EXPECT--
+TESTING COMPARE
1 < 2
10 > 2
1.0 < 1.1
1.0pl1 > 1.0RC1
1.0pl1 > 1.0
1.0pl1 = 1.0pl1
+TESTING OPERATORS
+1.0-dev lt 1.0-dev : false
+1.0-dev < 1.0-dev : false
+1.0-dev le 1.0-dev : true
+1.0-dev <= 1.0-dev : true
+1.0-dev gt 1.0-dev : false
+1.0-dev > 1.0-dev : false
+1.0-dev ge 1.0-dev : true
+1.0-dev >= 1.0-dev : true
+1.0-dev eq 1.0-dev : true
+1.0-dev = 1.0-dev : true
+1.0-dev == 1.0-dev : true
+1.0-dev ne 1.0-dev : false
+1.0-dev <> 1.0-dev : false
+1.0-dev != 1.0-dev : false
+1.0-dev lt 1.0a1 : true
+1.0-dev < 1.0a1 : true
+1.0-dev le 1.0a1 : true
+1.0-dev <= 1.0a1 : true
+1.0-dev gt 1.0a1 : false
+1.0-dev > 1.0a1 : false
+1.0-dev ge 1.0a1 : false
+1.0-dev >= 1.0a1 : false
+1.0-dev eq 1.0a1 : false
+1.0-dev = 1.0a1 : false
+1.0-dev == 1.0a1 : false
+1.0-dev ne 1.0a1 : true
+1.0-dev <> 1.0a1 : true
+1.0-dev != 1.0a1 : true
+1.0-dev lt 1.0b1 : true
+1.0-dev < 1.0b1 : true
+1.0-dev le 1.0b1 : true
+1.0-dev <= 1.0b1 : true
+1.0-dev gt 1.0b1 : false
+1.0-dev > 1.0b1 : false
+1.0-dev ge 1.0b1 : false
+1.0-dev >= 1.0b1 : false
+1.0-dev eq 1.0b1 : false
+1.0-dev = 1.0b1 : false
+1.0-dev == 1.0b1 : false
+1.0-dev ne 1.0b1 : true
+1.0-dev <> 1.0b1 : true
+1.0-dev != 1.0b1 : true
+1.0-dev lt 1.0RC1 : true
+1.0-dev < 1.0RC1 : true
+1.0-dev le 1.0RC1 : true
+1.0-dev <= 1.0RC1 : true
+1.0-dev gt 1.0RC1 : false
+1.0-dev > 1.0RC1 : false
+1.0-dev ge 1.0RC1 : false
+1.0-dev >= 1.0RC1 : false
+1.0-dev eq 1.0RC1 : false
+1.0-dev = 1.0RC1 : false
+1.0-dev == 1.0RC1 : false
+1.0-dev ne 1.0RC1 : true
+1.0-dev <> 1.0RC1 : true
+1.0-dev != 1.0RC1 : true
+1.0-dev lt 1.0 : true
+1.0-dev < 1.0 : true
+1.0-dev le 1.0 : true
+1.0-dev <= 1.0 : true
+1.0-dev gt 1.0 : false
+1.0-dev > 1.0 : false
+1.0-dev ge 1.0 : false
+1.0-dev >= 1.0 : false
+1.0-dev eq 1.0 : false
+1.0-dev = 1.0 : false
+1.0-dev == 1.0 : false
+1.0-dev ne 1.0 : true
+1.0-dev <> 1.0 : true
+1.0-dev != 1.0 : true
+1.0-dev lt 1.0pl1 : true
+1.0-dev < 1.0pl1 : true
+1.0-dev le 1.0pl1 : true
+1.0-dev <= 1.0pl1 : true
+1.0-dev gt 1.0pl1 : false
+1.0-dev > 1.0pl1 : false
+1.0-dev ge 1.0pl1 : false
+1.0-dev >= 1.0pl1 : false
+1.0-dev eq 1.0pl1 : false
+1.0-dev = 1.0pl1 : false
+1.0-dev == 1.0pl1 : false
+1.0-dev ne 1.0pl1 : true
+1.0-dev <> 1.0pl1 : true
+1.0-dev != 1.0pl1 : true
+ 1.0a1 lt 1.0-dev : false
+ 1.0a1 < 1.0-dev : false
+ 1.0a1 le 1.0-dev : false
+ 1.0a1 <= 1.0-dev : false
+ 1.0a1 gt 1.0-dev : true
+ 1.0a1 > 1.0-dev : true
+ 1.0a1 ge 1.0-dev : true
+ 1.0a1 >= 1.0-dev : true
+ 1.0a1 eq 1.0-dev : false
+ 1.0a1 = 1.0-dev : false
+ 1.0a1 == 1.0-dev : false
+ 1.0a1 ne 1.0-dev : true
+ 1.0a1 <> 1.0-dev : true
+ 1.0a1 != 1.0-dev : true
+ 1.0a1 lt 1.0a1 : false
+ 1.0a1 < 1.0a1 : false
+ 1.0a1 le 1.0a1 : true
+ 1.0a1 <= 1.0a1 : true
+ 1.0a1 gt 1.0a1 : false
+ 1.0a1 > 1.0a1 : false
+ 1.0a1 ge 1.0a1 : true
+ 1.0a1 >= 1.0a1 : true
+ 1.0a1 eq 1.0a1 : true
+ 1.0a1 = 1.0a1 : true
+ 1.0a1 == 1.0a1 : true
+ 1.0a1 ne 1.0a1 : false
+ 1.0a1 <> 1.0a1 : false
+ 1.0a1 != 1.0a1 : false
+ 1.0a1 lt 1.0b1 : true
+ 1.0a1 < 1.0b1 : true
+ 1.0a1 le 1.0b1 : true
+ 1.0a1 <= 1.0b1 : true
+ 1.0a1 gt 1.0b1 : false
+ 1.0a1 > 1.0b1 : false
+ 1.0a1 ge 1.0b1 : false
+ 1.0a1 >= 1.0b1 : false
+ 1.0a1 eq 1.0b1 : false
+ 1.0a1 = 1.0b1 : false
+ 1.0a1 == 1.0b1 : false
+ 1.0a1 ne 1.0b1 : true
+ 1.0a1 <> 1.0b1 : true
+ 1.0a1 != 1.0b1 : true
+ 1.0a1 lt 1.0RC1 : true
+ 1.0a1 < 1.0RC1 : true
+ 1.0a1 le 1.0RC1 : true
+ 1.0a1 <= 1.0RC1 : true
+ 1.0a1 gt 1.0RC1 : false
+ 1.0a1 > 1.0RC1 : false
+ 1.0a1 ge 1.0RC1 : false
+ 1.0a1 >= 1.0RC1 : false
+ 1.0a1 eq 1.0RC1 : false
+ 1.0a1 = 1.0RC1 : false
+ 1.0a1 == 1.0RC1 : false
+ 1.0a1 ne 1.0RC1 : true
+ 1.0a1 <> 1.0RC1 : true
+ 1.0a1 != 1.0RC1 : true
+ 1.0a1 lt 1.0 : true
+ 1.0a1 < 1.0 : true
+ 1.0a1 le 1.0 : true
+ 1.0a1 <= 1.0 : true
+ 1.0a1 gt 1.0 : false
+ 1.0a1 > 1.0 : false
+ 1.0a1 ge 1.0 : false
+ 1.0a1 >= 1.0 : false
+ 1.0a1 eq 1.0 : false
+ 1.0a1 = 1.0 : false
+ 1.0a1 == 1.0 : false
+ 1.0a1 ne 1.0 : true
+ 1.0a1 <> 1.0 : true
+ 1.0a1 != 1.0 : true
+ 1.0a1 lt 1.0pl1 : true
+ 1.0a1 < 1.0pl1 : true
+ 1.0a1 le 1.0pl1 : true
+ 1.0a1 <= 1.0pl1 : true
+ 1.0a1 gt 1.0pl1 : false
+ 1.0a1 > 1.0pl1 : false
+ 1.0a1 ge 1.0pl1 : false
+ 1.0a1 >= 1.0pl1 : false
+ 1.0a1 eq 1.0pl1 : false
+ 1.0a1 = 1.0pl1 : false
+ 1.0a1 == 1.0pl1 : false
+ 1.0a1 ne 1.0pl1 : true
+ 1.0a1 <> 1.0pl1 : true
+ 1.0a1 != 1.0pl1 : true
+ 1.0b1 lt 1.0-dev : false
+ 1.0b1 < 1.0-dev : false
+ 1.0b1 le 1.0-dev : false
+ 1.0b1 <= 1.0-dev : false
+ 1.0b1 gt 1.0-dev : true
+ 1.0b1 > 1.0-dev : true
+ 1.0b1 ge 1.0-dev : true
+ 1.0b1 >= 1.0-dev : true
+ 1.0b1 eq 1.0-dev : false
+ 1.0b1 = 1.0-dev : false
+ 1.0b1 == 1.0-dev : false
+ 1.0b1 ne 1.0-dev : true
+ 1.0b1 <> 1.0-dev : true
+ 1.0b1 != 1.0-dev : true
+ 1.0b1 lt 1.0a1 : false
+ 1.0b1 < 1.0a1 : false
+ 1.0b1 le 1.0a1 : false
+ 1.0b1 <= 1.0a1 : false
+ 1.0b1 gt 1.0a1 : true
+ 1.0b1 > 1.0a1 : true
+ 1.0b1 ge 1.0a1 : true
+ 1.0b1 >= 1.0a1 : true
+ 1.0b1 eq 1.0a1 : false
+ 1.0b1 = 1.0a1 : false
+ 1.0b1 == 1.0a1 : false
+ 1.0b1 ne 1.0a1 : true
+ 1.0b1 <> 1.0a1 : true
+ 1.0b1 != 1.0a1 : true
+ 1.0b1 lt 1.0b1 : false
+ 1.0b1 < 1.0b1 : false
+ 1.0b1 le 1.0b1 : true
+ 1.0b1 <= 1.0b1 : true
+ 1.0b1 gt 1.0b1 : false
+ 1.0b1 > 1.0b1 : false
+ 1.0b1 ge 1.0b1 : true
+ 1.0b1 >= 1.0b1 : true
+ 1.0b1 eq 1.0b1 : true
+ 1.0b1 = 1.0b1 : true
+ 1.0b1 == 1.0b1 : true
+ 1.0b1 ne 1.0b1 : false
+ 1.0b1 <> 1.0b1 : false
+ 1.0b1 != 1.0b1 : false
+ 1.0b1 lt 1.0RC1 : true
+ 1.0b1 < 1.0RC1 : true
+ 1.0b1 le 1.0RC1 : true
+ 1.0b1 <= 1.0RC1 : true
+ 1.0b1 gt 1.0RC1 : false
+ 1.0b1 > 1.0RC1 : false
+ 1.0b1 ge 1.0RC1 : false
+ 1.0b1 >= 1.0RC1 : false
+ 1.0b1 eq 1.0RC1 : false
+ 1.0b1 = 1.0RC1 : false
+ 1.0b1 == 1.0RC1 : false
+ 1.0b1 ne 1.0RC1 : true
+ 1.0b1 <> 1.0RC1 : true
+ 1.0b1 != 1.0RC1 : true
+ 1.0b1 lt 1.0 : true
+ 1.0b1 < 1.0 : true
+ 1.0b1 le 1.0 : true
+ 1.0b1 <= 1.0 : true
+ 1.0b1 gt 1.0 : false
+ 1.0b1 > 1.0 : false
+ 1.0b1 ge 1.0 : false
+ 1.0b1 >= 1.0 : false
+ 1.0b1 eq 1.0 : false
+ 1.0b1 = 1.0 : false
+ 1.0b1 == 1.0 : false
+ 1.0b1 ne 1.0 : true
+ 1.0b1 <> 1.0 : true
+ 1.0b1 != 1.0 : true
+ 1.0b1 lt 1.0pl1 : true
+ 1.0b1 < 1.0pl1 : true
+ 1.0b1 le 1.0pl1 : true
+ 1.0b1 <= 1.0pl1 : true
+ 1.0b1 gt 1.0pl1 : false
+ 1.0b1 > 1.0pl1 : false
+ 1.0b1 ge 1.0pl1 : false
+ 1.0b1 >= 1.0pl1 : false
+ 1.0b1 eq 1.0pl1 : false
+ 1.0b1 = 1.0pl1 : false
+ 1.0b1 == 1.0pl1 : false
+ 1.0b1 ne 1.0pl1 : true
+ 1.0b1 <> 1.0pl1 : true
+ 1.0b1 != 1.0pl1 : true
+ 1.0RC1 lt 1.0-dev : false
+ 1.0RC1 < 1.0-dev : false
+ 1.0RC1 le 1.0-dev : false
+ 1.0RC1 <= 1.0-dev : false
+ 1.0RC1 gt 1.0-dev : true
+ 1.0RC1 > 1.0-dev : true
+ 1.0RC1 ge 1.0-dev : true
+ 1.0RC1 >= 1.0-dev : true
+ 1.0RC1 eq 1.0-dev : false
+ 1.0RC1 = 1.0-dev : false
+ 1.0RC1 == 1.0-dev : false
+ 1.0RC1 ne 1.0-dev : true
+ 1.0RC1 <> 1.0-dev : true
+ 1.0RC1 != 1.0-dev : true
+ 1.0RC1 lt 1.0a1 : false
+ 1.0RC1 < 1.0a1 : false
+ 1.0RC1 le 1.0a1 : false
+ 1.0RC1 <= 1.0a1 : false
+ 1.0RC1 gt 1.0a1 : true
+ 1.0RC1 > 1.0a1 : true
+ 1.0RC1 ge 1.0a1 : true
+ 1.0RC1 >= 1.0a1 : true
+ 1.0RC1 eq 1.0a1 : false
+ 1.0RC1 = 1.0a1 : false
+ 1.0RC1 == 1.0a1 : false
+ 1.0RC1 ne 1.0a1 : true
+ 1.0RC1 <> 1.0a1 : true
+ 1.0RC1 != 1.0a1 : true
+ 1.0RC1 lt 1.0b1 : false
+ 1.0RC1 < 1.0b1 : false
+ 1.0RC1 le 1.0b1 : false
+ 1.0RC1 <= 1.0b1 : false
+ 1.0RC1 gt 1.0b1 : true
+ 1.0RC1 > 1.0b1 : true
+ 1.0RC1 ge 1.0b1 : true
+ 1.0RC1 >= 1.0b1 : true
+ 1.0RC1 eq 1.0b1 : false
+ 1.0RC1 = 1.0b1 : false
+ 1.0RC1 == 1.0b1 : false
+ 1.0RC1 ne 1.0b1 : true
+ 1.0RC1 <> 1.0b1 : true
+ 1.0RC1 != 1.0b1 : true
+ 1.0RC1 lt 1.0RC1 : false
+ 1.0RC1 < 1.0RC1 : false
+ 1.0RC1 le 1.0RC1 : true
+ 1.0RC1 <= 1.0RC1 : true
+ 1.0RC1 gt 1.0RC1 : false
+ 1.0RC1 > 1.0RC1 : false
+ 1.0RC1 ge 1.0RC1 : true
+ 1.0RC1 >= 1.0RC1 : true
+ 1.0RC1 eq 1.0RC1 : true
+ 1.0RC1 = 1.0RC1 : true
+ 1.0RC1 == 1.0RC1 : true
+ 1.0RC1 ne 1.0RC1 : false
+ 1.0RC1 <> 1.0RC1 : false
+ 1.0RC1 != 1.0RC1 : false
+ 1.0RC1 lt 1.0 : true
+ 1.0RC1 < 1.0 : true
+ 1.0RC1 le 1.0 : true
+ 1.0RC1 <= 1.0 : true
+ 1.0RC1 gt 1.0 : false
+ 1.0RC1 > 1.0 : false
+ 1.0RC1 ge 1.0 : false
+ 1.0RC1 >= 1.0 : false
+ 1.0RC1 eq 1.0 : false
+ 1.0RC1 = 1.0 : false
+ 1.0RC1 == 1.0 : false
+ 1.0RC1 ne 1.0 : true
+ 1.0RC1 <> 1.0 : true
+ 1.0RC1 != 1.0 : true
+ 1.0RC1 lt 1.0pl1 : true
+ 1.0RC1 < 1.0pl1 : true
+ 1.0RC1 le 1.0pl1 : true
+ 1.0RC1 <= 1.0pl1 : true
+ 1.0RC1 gt 1.0pl1 : false
+ 1.0RC1 > 1.0pl1 : false
+ 1.0RC1 ge 1.0pl1 : false
+ 1.0RC1 >= 1.0pl1 : false
+ 1.0RC1 eq 1.0pl1 : false
+ 1.0RC1 = 1.0pl1 : false
+ 1.0RC1 == 1.0pl1 : false
+ 1.0RC1 ne 1.0pl1 : true
+ 1.0RC1 <> 1.0pl1 : true
+ 1.0RC1 != 1.0pl1 : true
+ 1.0 lt 1.0-dev : false
+ 1.0 < 1.0-dev : false
+ 1.0 le 1.0-dev : false
+ 1.0 <= 1.0-dev : false
+ 1.0 gt 1.0-dev : true
+ 1.0 > 1.0-dev : true
+ 1.0 ge 1.0-dev : true
+ 1.0 >= 1.0-dev : true
+ 1.0 eq 1.0-dev : false
+ 1.0 = 1.0-dev : false
+ 1.0 == 1.0-dev : false
+ 1.0 ne 1.0-dev : true
+ 1.0 <> 1.0-dev : true
+ 1.0 != 1.0-dev : true
+ 1.0 lt 1.0a1 : false
+ 1.0 < 1.0a1 : false
+ 1.0 le 1.0a1 : false
+ 1.0 <= 1.0a1 : false
+ 1.0 gt 1.0a1 : true
+ 1.0 > 1.0a1 : true
+ 1.0 ge 1.0a1 : true
+ 1.0 >= 1.0a1 : true
+ 1.0 eq 1.0a1 : false
+ 1.0 = 1.0a1 : false
+ 1.0 == 1.0a1 : false
+ 1.0 ne 1.0a1 : true
+ 1.0 <> 1.0a1 : true
+ 1.0 != 1.0a1 : true
+ 1.0 lt 1.0b1 : false
+ 1.0 < 1.0b1 : false
+ 1.0 le 1.0b1 : false
+ 1.0 <= 1.0b1 : false
+ 1.0 gt 1.0b1 : true
+ 1.0 > 1.0b1 : true
+ 1.0 ge 1.0b1 : true
+ 1.0 >= 1.0b1 : true
+ 1.0 eq 1.0b1 : false
+ 1.0 = 1.0b1 : false
+ 1.0 == 1.0b1 : false
+ 1.0 ne 1.0b1 : true
+ 1.0 <> 1.0b1 : true
+ 1.0 != 1.0b1 : true
+ 1.0 lt 1.0RC1 : false
+ 1.0 < 1.0RC1 : false
+ 1.0 le 1.0RC1 : false
+ 1.0 <= 1.0RC1 : false
+ 1.0 gt 1.0RC1 : true
+ 1.0 > 1.0RC1 : true
+ 1.0 ge 1.0RC1 : true
+ 1.0 >= 1.0RC1 : true
+ 1.0 eq 1.0RC1 : false
+ 1.0 = 1.0RC1 : false
+ 1.0 == 1.0RC1 : false
+ 1.0 ne 1.0RC1 : true
+ 1.0 <> 1.0RC1 : true
+ 1.0 != 1.0RC1 : true
+ 1.0 lt 1.0 : false
+ 1.0 < 1.0 : false
+ 1.0 le 1.0 : true
+ 1.0 <= 1.0 : true
+ 1.0 gt 1.0 : false
+ 1.0 > 1.0 : false
+ 1.0 ge 1.0 : true
+ 1.0 >= 1.0 : true
+ 1.0 eq 1.0 : true
+ 1.0 = 1.0 : true
+ 1.0 == 1.0 : true
+ 1.0 ne 1.0 : false
+ 1.0 <> 1.0 : false
+ 1.0 != 1.0 : false
+ 1.0 lt 1.0pl1 : true
+ 1.0 < 1.0pl1 : true
+ 1.0 le 1.0pl1 : true
+ 1.0 <= 1.0pl1 : true
+ 1.0 gt 1.0pl1 : false
+ 1.0 > 1.0pl1 : false
+ 1.0 ge 1.0pl1 : false
+ 1.0 >= 1.0pl1 : false
+ 1.0 eq 1.0pl1 : false
+ 1.0 = 1.0pl1 : false
+ 1.0 == 1.0pl1 : false
+ 1.0 ne 1.0pl1 : true
+ 1.0 <> 1.0pl1 : true
+ 1.0 != 1.0pl1 : true
+ 1.0pl1 lt 1.0-dev : false
+ 1.0pl1 < 1.0-dev : false
+ 1.0pl1 le 1.0-dev : false
+ 1.0pl1 <= 1.0-dev : false
+ 1.0pl1 gt 1.0-dev : true
+ 1.0pl1 > 1.0-dev : true
+ 1.0pl1 ge 1.0-dev : true
+ 1.0pl1 >= 1.0-dev : true
+ 1.0pl1 eq 1.0-dev : false
+ 1.0pl1 = 1.0-dev : false
+ 1.0pl1 == 1.0-dev : false
+ 1.0pl1 ne 1.0-dev : true
+ 1.0pl1 <> 1.0-dev : true
+ 1.0pl1 != 1.0-dev : true
+ 1.0pl1 lt 1.0a1 : false
+ 1.0pl1 < 1.0a1 : false
+ 1.0pl1 le 1.0a1 : false
+ 1.0pl1 <= 1.0a1 : false
+ 1.0pl1 gt 1.0a1 : true
+ 1.0pl1 > 1.0a1 : true
+ 1.0pl1 ge 1.0a1 : true
+ 1.0pl1 >= 1.0a1 : true
+ 1.0pl1 eq 1.0a1 : false
+ 1.0pl1 = 1.0a1 : false
+ 1.0pl1 == 1.0a1 : false
+ 1.0pl1 ne 1.0a1 : true
+ 1.0pl1 <> 1.0a1 : true
+ 1.0pl1 != 1.0a1 : true
+ 1.0pl1 lt 1.0b1 : false
+ 1.0pl1 < 1.0b1 : false
+ 1.0pl1 le 1.0b1 : false
+ 1.0pl1 <= 1.0b1 : false
+ 1.0pl1 gt 1.0b1 : true
+ 1.0pl1 > 1.0b1 : true
+ 1.0pl1 ge 1.0b1 : true
+ 1.0pl1 >= 1.0b1 : true
+ 1.0pl1 eq 1.0b1 : false
+ 1.0pl1 = 1.0b1 : false
+ 1.0pl1 == 1.0b1 : false
+ 1.0pl1 ne 1.0b1 : true
+ 1.0pl1 <> 1.0b1 : true
+ 1.0pl1 != 1.0b1 : true
+ 1.0pl1 lt 1.0RC1 : false
+ 1.0pl1 < 1.0RC1 : false
+ 1.0pl1 le 1.0RC1 : false
+ 1.0pl1 <= 1.0RC1 : false
+ 1.0pl1 gt 1.0RC1 : true
+ 1.0pl1 > 1.0RC1 : true
+ 1.0pl1 ge 1.0RC1 : true
+ 1.0pl1 >= 1.0RC1 : true
+ 1.0pl1 eq 1.0RC1 : false
+ 1.0pl1 = 1.0RC1 : false
+ 1.0pl1 == 1.0RC1 : false
+ 1.0pl1 ne 1.0RC1 : true
+ 1.0pl1 <> 1.0RC1 : true
+ 1.0pl1 != 1.0RC1 : true
+ 1.0pl1 lt 1.0 : false
+ 1.0pl1 < 1.0 : false
+ 1.0pl1 le 1.0 : false
+ 1.0pl1 <= 1.0 : false
+ 1.0pl1 gt 1.0 : true
+ 1.0pl1 > 1.0 : true
+ 1.0pl1 ge 1.0 : true
+ 1.0pl1 >= 1.0 : true
+ 1.0pl1 eq 1.0 : false
+ 1.0pl1 = 1.0 : false
+ 1.0pl1 == 1.0 : false
+ 1.0pl1 ne 1.0 : true
+ 1.0pl1 <> 1.0 : true
+ 1.0pl1 != 1.0 : true
+ 1.0pl1 lt 1.0pl1 : false
+ 1.0pl1 < 1.0pl1 : false
+ 1.0pl1 le 1.0pl1 : true
+ 1.0pl1 <= 1.0pl1 : true
+ 1.0pl1 gt 1.0pl1 : false
+ 1.0pl1 > 1.0pl1 : false
+ 1.0pl1 ge 1.0pl1 : true
+ 1.0pl1 >= 1.0pl1 : true
+ 1.0pl1 eq 1.0pl1 : true
+ 1.0pl1 = 1.0pl1 : true
+ 1.0pl1 == 1.0pl1 : true
+ 1.0pl1 ne 1.0pl1 : false
+ 1.0pl1 <> 1.0pl1 : false
+ 1.0pl1 != 1.0pl1 : false
#define sign(n) ((n)<0?-1:((n)>0?1:0))
-#define PHP_VC_COMPARE 0
-#define PHP_VC_LT 1
-#define PHP_VC_LE 2
-#define PHP_VC_GT 3
-#define PHP_VC_GE 4
-#define PHP_VC_EQ 5
-
-#define PHP_VCFUNC(name,mode) \
- void name(INTERNAL_FUNCTION_PARAMETERS) { \
- do_version_compare(INTERNAL_FUNCTION_PARAM_PASSTHRU, mode); \
- }
-
/* {{{ php_canonicalize_version() */
PHPAPI char *
/* }}} */
/* {{{ do_version_compare() */
-void do_version_compare(INTERNAL_FUNCTION_PARAMETERS, int mode)
+/* {{{ proto int version_compare(string ver1, string ver2 [, string oper])
+ Compares two "PHP-standardized" version number strings */
+
+PHP_FUNCTION(version_compare)
{
- zval **v1, **v2;
+ zval **v1, **v2, **oper;
int compare, argc;
+ char *op;
argc = ZEND_NUM_ARGS();
- if (argc != 2 || zend_get_parameters_ex(argc, &v1, &v2) == FAILURE) {
+ if (argc < 2 || argc > 3 || zend_get_parameters_ex(argc, &v1, &v2, &oper) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(v1);
convert_to_string_ex(v2);
compare = php_version_compare(Z_STRVAL_PP(v1), Z_STRVAL_PP(v2));
- switch (mode) {
- case PHP_VC_LT:
- RETURN_LONG(compare == -1);
- case PHP_VC_LE:
- RETURN_LONG(compare != 1);
- case PHP_VC_GT:
- RETURN_LONG(compare == 1);
- case PHP_VC_GE:
- RETURN_LONG(compare != -1);
- case PHP_VC_EQ:
- RETURN_LONG(compare == 0);
- case PHP_VC_COMPARE:
- default:
- RETURN_LONG(compare);
+ if (argc == 2) {
+ RETURN_LONG(compare);
+ }
+ convert_to_string_ex(oper);
+ op = Z_STRVAL_PP(oper);
+ if (!strcmp(op, "<") || !strcmp(op, "lt")) {
+ RETURN_LONG(compare == -1);
+ }
+ if (!strcmp(op, "<=") || !strcmp(op, "le")) {
+ RETURN_LONG(compare != 1);
+ }
+ if (!strcmp(op, ">") || !strcmp(op, "gt")) {
+ RETURN_LONG(compare == 1);
+ }
+ if (!strcmp(op, ">=") || !strcmp(op, "ge")) {
+ RETURN_LONG(compare != -1);
}
+ if (!strcmp(op, "==") || !strcmp(op, "=") || !strcmp(op, "eq")) {
+ RETURN_LONG(compare == 0);
+ }
+ if (!strcmp(op, "!=") || !strcmp(op, "<>") || !strcmp(op, "ne")) {
+ RETURN_LONG(compare != 0);
+ }
+ RETURN_NULL();
}
/* }}} */
-/* {{{ proto int version_compare(string ver1, string ver2) */
-
-PHP_VCFUNC(PHP_FN(version_compare), PHP_VC_COMPARE);
-
-/* }}} */
-/* {{{ proto int version_lt(string ver1, string ver2) */
-
-PHP_VCFUNC(PHP_FN(version_lt), PHP_VC_LT);
-
-/* }}} */
-/* {{{ proto int version_lt(string ver1, string ver2) */
-
-PHP_VCFUNC(PHP_FN(version_le), PHP_VC_LE);
-
-/* }}} */
-/* {{{ proto int version_gt(string ver1, string ver2) */
-
-PHP_VCFUNC(PHP_FN(version_gt), PHP_VC_GT);
-
-/* }}} */
-/* {{{ proto int version_ge(string ver1, string ver2) */
-
-PHP_VCFUNC(PHP_FN(version_ge), PHP_VC_GE);
-
-/* }}} */
-/* {{{ proto int version_eq(string ver1, string ver2) */
-
-PHP_VCFUNC(PHP_FN(version_eq), PHP_VC_EQ);
-
-/* }}} */
-
/*
* Local variables:
* tab-width: 4