PageRenderTime 50ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/libraries/phpxmlrpc/compat/version_compare.php

https://github.com/chrisinammo/arthurmcneil
PHP | 179 lines | 125 code | 14 blank | 40 comment | 31 complexity | 8de176ae920aa7fd87ec4e4edbba146d MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-1.0
  1. <?php
  2. // +----------------------------------------------------------------------+
  3. // | PHP Version 4 |
  4. // +----------------------------------------------------------------------+
  5. // | Copyright (c) 1997-2004 The PHP Group |
  6. // +----------------------------------------------------------------------+
  7. // | This source file is subject to version 3.0 of the PHP license, |
  8. // | that is bundled with this package in the file LICENSE, and is |
  9. // | available at through the world-wide-web at |
  10. // | http://www.php.net/license/3_0.txt. |
  11. // | If you did not receive a copy of the PHP license and are unable to |
  12. // | obtain it through the world-wide-web, please send a note to |
  13. // | license@php.net so we can mail you a copy immediately. |
  14. // +----------------------------------------------------------------------+
  15. // | Authors: Philippe Jausions <Philippe.Jausions@11abacus.com> |
  16. // | Aidan Lister <aidan@php.net> |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id: version_compare.php,v 1.1 2005/07/11 16:34:36 ggiunta Exp $
  20. /**
  21. * Replace version_compare()
  22. *
  23. * @category PHP
  24. * @package PHP_Compat
  25. * @link http://php.net/function.version_compare
  26. * @author Philippe Jausions <Philippe.Jausions@11abacus.com>
  27. * @author Aidan Lister <aidan@php.net>
  28. * @version $Revision: 1.1 $
  29. * @since PHP 4.1.0
  30. * @require PHP 4.0.0 (user_error)
  31. */
  32. if (!function_exists('version_compare')) {
  33. function version_compare($version1, $version2, $operator = '<')
  34. {
  35. // Check input
  36. if (!is_scalar($version1)) {
  37. user_error('version_compare() expects parameter 1 to be string, ' .
  38. gettype($version1) . ' given', E_USER_WARNING);
  39. return;
  40. }
  41. if (!is_scalar($version2)) {
  42. user_error('version_compare() expects parameter 2 to be string, ' .
  43. gettype($version2) . ' given', E_USER_WARNING);
  44. return;
  45. }
  46. if (!is_scalar($operator)) {
  47. user_error('version_compare() expects parameter 3 to be string, ' .
  48. gettype($operator) . ' given', E_USER_WARNING);
  49. return;
  50. }
  51. // Standardise versions
  52. $v1 = explode('.',
  53. str_replace('..', '.',
  54. preg_replace('/([^0-9\.]+)/', '.$1.',
  55. str_replace(array('-', '_', '+'), '.',
  56. trim($version1)))));
  57. $v2 = explode('.',
  58. str_replace('..', '.',
  59. preg_replace('/([^0-9\.]+)/', '.$1.',
  60. str_replace(array('-', '_', '+'), '.',
  61. trim($version2)))));
  62. // Replace empty entries at the start of the array
  63. while (empty($v1[0]) && array_shift($v1)) {}
  64. while (empty($v2[0]) && array_shift($v2)) {}
  65. // Release state order
  66. // '#' stands for any number
  67. $versions = array(
  68. 'dev' => 0,
  69. 'alpha' => 1,
  70. 'a' => 1,
  71. 'beta' => 2,
  72. 'b' => 2,
  73. 'RC' => 3,
  74. '#' => 4,
  75. 'p' => 5,
  76. 'pl' => 5);
  77. // Loop through each segment in the version string
  78. $compare = 0;
  79. for ($i = 0, $x = min(count($v1), count($v2)); $i < $x; $i++) {
  80. if ($v1[$i] == $v2[$i]) {
  81. continue;
  82. }
  83. $i1 = $v1[$i];
  84. $i2 = $v2[$i];
  85. if (is_numeric($i1) && is_numeric($i2)) {
  86. $compare = ($i1 < $i2) ? -1 : 1;
  87. break;
  88. }
  89. // We use the position of '#' in the versions list
  90. // for numbers... (so take care of # in original string)
  91. if ($i1 == '#') {
  92. $i1 = '';
  93. } elseif (is_numeric($i1)) {
  94. $i1 = '#';
  95. }
  96. if ($i2 == '#') {
  97. $i2 = '';
  98. } elseif (is_numeric($i2)) {
  99. $i2 = '#';
  100. }
  101. if (isset($versions[$i1]) && isset($versions[$i2])) {
  102. $compare = ($versions[$i1] < $versions[$i2]) ? -1 : 1;
  103. } elseif (isset($versions[$i1])) {
  104. $compare = 1;
  105. } elseif (isset($versions[$i2])) {
  106. $compare = -1;
  107. } else {
  108. $compare = 0;
  109. }
  110. break;
  111. }
  112. // If previous loop didn't find anything, compare the "extra" segments
  113. if ($compare == 0) {
  114. if (count($v2) > count($v1)) {
  115. if (isset($versions[$v2[$i]])) {
  116. $compare = ($versions[$v2[$i]] < 4) ? 1 : -1;
  117. } else {
  118. $compare = -1;
  119. }
  120. } elseif (count($v2) < count($v1)) {
  121. if (isset($versions[$v1[$i]])) {
  122. $compare = ($versions[$v1[$i]] < 4) ? -1 : 1;
  123. } else {
  124. $compare = 1;
  125. }
  126. }
  127. }
  128. // Compare the versions
  129. if (func_num_args() > 2) {
  130. switch ($operator) {
  131. case '>':
  132. case 'gt':
  133. return (bool) ($compare > 0);
  134. break;
  135. case '>=':
  136. case 'ge':
  137. return (bool) ($compare >= 0);
  138. break;
  139. case '<=':
  140. case 'le':
  141. return (bool) ($compare <= 0);
  142. break;
  143. case '==':
  144. case '=':
  145. case 'eq':
  146. return (bool) ($compare == 0);
  147. break;
  148. case '<>':
  149. case '!=':
  150. case 'ne':
  151. return (bool) ($compare != 0);
  152. break;
  153. case '':
  154. case '<':
  155. case 'lt':
  156. return (bool) ($compare < 0);
  157. break;
  158. default:
  159. return;
  160. }
  161. }
  162. return $compare;
  163. }
  164. }
  165. ?>