PageRenderTime 2ms CodeModel.GetById 101ms app.highlight 8ms RepoModel.GetById 92ms app.codeStats 0ms

/ext/php_xmlrpc/compat/version_compare.php

http://mp-rechnungs-und-kundenverwaltung.googlecode.com/
PHP | 179 lines | 125 code | 14 blank | 40 comment | 31 complexity | 3e358274f0e22d34653bfcca605607ab MD5 | raw file
  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 2 2009-03-16 20:22:51Z ggiunta $
 20
 21
 22/**
 23 * Replace version_compare()
 24 *
 25 * @category    PHP
 26 * @package     PHP_Compat
 27 * @link        http://php.net/function.version_compare
 28 * @author      Philippe Jausions <Philippe.Jausions@11abacus.com>
 29 * @author      Aidan Lister <aidan@php.net>
 30 * @version     $Revision: 1.1 $
 31 * @since       PHP 4.1.0
 32 * @require     PHP 4.0.0 (user_error)
 33 */
 34if (!function_exists('version_compare')) {
 35    function version_compare($version1, $version2, $operator = '<')
 36    {
 37        // Check input
 38        if (!is_scalar($version1)) {
 39            user_error('version_compare() expects parameter 1 to be string, ' .
 40                gettype($version1) . ' given', E_USER_WARNING);
 41            return;
 42        }
 43
 44        if (!is_scalar($version2)) {
 45            user_error('version_compare() expects parameter 2 to be string, ' .
 46                gettype($version2) . ' given', E_USER_WARNING);
 47            return;
 48        }
 49
 50        if (!is_scalar($operator)) {
 51            user_error('version_compare() expects parameter 3 to be string, ' .
 52                gettype($operator) . ' given', E_USER_WARNING);
 53            return;
 54        }
 55
 56        // Standardise versions
 57        $v1 = explode('.',
 58            str_replace('..', '.',
 59                preg_replace('/([^0-9\.]+)/', '.$1.',
 60                    str_replace(array('-', '_', '+'), '.',
 61                        trim($version1)))));
 62
 63        $v2 = explode('.',
 64            str_replace('..', '.',
 65                preg_replace('/([^0-9\.]+)/', '.$1.',
 66                    str_replace(array('-', '_', '+'), '.',
 67                        trim($version2)))));
 68
 69        // Replace empty entries at the start of the array
 70        while (empty($v1[0]) && array_shift($v1)) {}
 71        while (empty($v2[0]) && array_shift($v2)) {}
 72
 73        // Release state order
 74        // '#' stands for any number
 75        $versions = array(
 76            'dev'   => 0,
 77            'alpha' => 1,
 78            'a'     => 1,
 79            'beta'  => 2,
 80            'b'     => 2,
 81            'RC'    => 3,
 82            '#'     => 4,
 83            'p'     => 5,
 84            'pl'    => 5);
 85
 86        // Loop through each segment in the version string
 87        $compare = 0;
 88        for ($i = 0, $x = min(count($v1), count($v2)); $i < $x; $i++) {
 89            if ($v1[$i] == $v2[$i]) {
 90                continue;
 91            }
 92            $i1 = $v1[$i];
 93            $i2 = $v2[$i];
 94            if (is_numeric($i1) && is_numeric($i2)) {
 95                $compare = ($i1 < $i2) ? -1 : 1;
 96                break;
 97            }
 98            // We use the position of '#' in the versions list
 99            // for numbers... (so take care of # in original string)
100            if ($i1 == '#') {
101                $i1 = '';
102            } elseif (is_numeric($i1)) {
103                $i1 = '#';
104            }
105            if ($i2 == '#') {
106                $i2 = '';
107            } elseif (is_numeric($i2)) {
108                $i2 = '#';
109            }
110            if (isset($versions[$i1]) && isset($versions[$i2])) {
111                $compare = ($versions[$i1] < $versions[$i2]) ? -1 : 1;
112            } elseif (isset($versions[$i1])) {
113                $compare = 1;
114            } elseif (isset($versions[$i2])) {
115                $compare = -1;
116            } else {
117                $compare = 0;
118            }
119
120            break;
121        }
122
123        // If previous loop didn't find anything, compare the "extra" segments
124        if ($compare == 0) {
125            if (count($v2) > count($v1)) {
126                if (isset($versions[$v2[$i]])) {
127                    $compare = ($versions[$v2[$i]] < 4) ? 1 : -1;
128                } else {
129                    $compare = -1;
130                }
131            } elseif (count($v2) < count($v1)) {
132                if (isset($versions[$v1[$i]])) {
133                    $compare = ($versions[$v1[$i]] < 4) ? -1 : 1;
134                } else {
135                    $compare = 1;
136                }
137            }
138        }
139
140        // Compare the versions
141        if (func_num_args() > 2) {
142            switch ($operator) {
143                case '>':
144                case 'gt':
145                    return (bool) ($compare > 0);
146                    break;
147                case '>=':
148                case 'ge':
149                    return (bool) ($compare >= 0);
150                    break;
151                case '<=':
152                case 'le':
153                    return (bool) ($compare <= 0);
154                    break;
155                case '==':
156                case '=':
157                case 'eq':
158                    return (bool) ($compare == 0);
159                    break;
160                case '<>':
161                case '!=':
162                case 'ne':
163                    return (bool) ($compare != 0);
164                    break;
165                case '':
166                case '<':
167                case 'lt':
168                    return (bool) ($compare < 0);
169                    break;
170                default:
171                    return;
172            }
173        }
174
175        return $compare;
176    }
177}
178
179?>