/* * version.sli * * This file is part of NEST. * * Copyright (C) 2004 The NEST Initiative * * NEST is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * NEST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with NEST. If not, see <http://www.gnu.org/licenses/>. * */ /* SLI version number handling library Note: this file depends on misc_helpers.sli, because it uses "breakup", "reverse", and "SLIFunctionWrapper". Hence misc_helpers.sli must be loaded first in sli-init.sli. */ %% note: this library cannot use the provide/require mechanism, because this %% would lead to infinite recuresion during initialization! /version namespace %%%%%% % pad version arrays with zeros to make them same length %%%%%% /:padversions[/arraytype /v1 /arraytype /v2] { v1 length v2 length max /m Set v1 m v1 length sub array join v2 m v2 length sub array join } bind SLIFunctionWrapper /* BeginDocumentation Name: version::validate - Assure correct format of version number array. Synopsis: [version] validate -> - Description: Assures that the passed array is composed of truly positive integers only, and contains at least one element. Parameters: [version] - Version number array. See [1] for details. Examples: [1 23 5] validate -> - [] validate -> (raises /SytaxError) [1 -23 5] validate -> (raises /SytaxError) [1 2.3 5] validate -> (raises /SytaxError) Diagnostics: If argument is no valid version number array, an error message is issued and /SytaxError is raised. Author: Ruediger Kupper FirstVersion: 29-jul-2003 Availability: SLI2.0, library: version References: [1] Ruediger Kupper, SLI library management, HRI-EU Report 06/05, Honda Research Institute Europe GmbH, 2006. SeeAlso: version::validate, version::vcmp, version::veq, version::vlt, version::vgt, version::vleq, version::vgeq, version::s2v, version::v2s */ /validate[/arraytype /v] { v length 0 eq { M_ERROR funcname cvs (Version number array must contain at least one number.) message funcname /SyntaxError raiseerror } if v { dup type /integertype neq { pop M_ERROR funcname cvs (Version number array must contain integers only.) message funcname /SyntaxError raiseerror } if 0 lt { M_ERROR funcname cvs (Version number array must contain positive integers only.) message funcname /SyntaxError raiseerror } if } forall } bind SLIFunctionWrapper /* BeginDocumentation Name: version::vcmp - Compare two version number arrays. Synopsis: [version1] [version2] vcmp -> -1 | 0 | +1 Description: Compare two version number arrays. The result is 0, if version1 equals version2 -1, if version1 is smaller than version2 +1, if version1 is greater than version2 The common semantics of version numbers is applied, e.g.: [1 5] = [1 5 0 0 0 0 0] [1 5] > [1 4] [1 5] > [1] [1 5] > [1 4 99 99 99] [1 5] < [2 0] [1 5] < [1 5 1] [1 1] < [1 10] etc. Parameters: version{1|2} - Version number arrays (see version::validate and [1]). Examples: [1 5] [1 5 0 0 0 0 0] vcmp -> 0 [1 5] [1 4] vcmp -> 1 [1 5] [1 5 1] vcmp -> -1 Diagnostics: /SyntaxError is raised, if parameters are no valid version number arrays (see version::validate). Author: Ruediger Kupper FirstVersion: 29-jul-2003 Availability: SLI2.0, library: version References: [1] Ruediger Kupper, SLI library management, HRI-EU Report 06/05, Honda Research Institute Europe GmbH, 2006. SeeAlso: version::validate, version::vcmp, version::veq, version::vlt, version::vgt, version::vleq, version::vgeq, version::s2v, version::v2s */ /vcmp[/arraytype /v1 /arraytype /v2] { v1 validate v2 validate v1 v2 :padversions /v2 Set /v1 Set /result 0 def 0 1 v1 length 1 sub { /i Set v2 i get /n2 Set v1 i get /n1 Set n1 n2 lt {/result -1 def exit} if n1 n2 gt {/result +1 def exit} if % it's neither greater nor smaller, so contine. } for result } bind SLIFunctionWrapper /* BeginDocumentation Name: version::veq - Are two version number arrays equal? Synopsis: [version1] [version2] veq -> true | false Description: Compare two version number arrays. The result is true, if version1 equals version2 false, otherwise The common semantics of version numbers is applied, see version::vcmp. Parameters: version{1|2} - Version number arrays (see version::validate and [1]). Examples: [1 5] [1 5 0 0 0 0 0] veq -> true [1 5] [1 4] veq -> false Diagnostics: /SyntaxError is raised, if parameters are no valid version number arrays (see version::validate). Author: Ruediger Kupper FirstVersion: 29-jul-2003 Availability: SLI2.0, library: version References: [1] Ruediger Kupper, SLI library management, HRI-EU Report 06/05, Honda Research Institute Europe GmbH, 2006. SeeAlso: version::validate, version::vcmp, version::veq, version::vlt, version::vgt, version::vleq, version::vgeq, version::s2v, version::v2s */ /veq[/arraytype /arraytype] { vcmp 0 eq } bind def /* BeginDocumentation Name: version::vlt - "Less than" for version number arrays. Synopsis: [version1] [version2] vlt -> true | false Description: Compare two version number arrays. The result is true, if version1 is less than version2 false, otherwise The common semantics of version numbers is applied, see version::vcmp. Parameters: version{1|2} - Version number arrays (see version::validate and [1]). Examples: [1 5] [1 5 0 0 0 0 0] vlt -> false [1 5] [1 4] vlt -> false [1 5] [1 5 1] vlt -> true Diagnostics: /SyntaxError is raised, if parameters are no valid version number arrays (see version::validate). Author: Ruediger Kupper FirstVersion: 29-jul-2003 Availability: SLI2.0, library: version References: [1] Ruediger Kupper, SLI library management, HRI-EU Report 06/05, Honda Research Institute Europe GmbH, 2006. SeeAlso: version::validate, version::vcmp, version::veq, version::vlt, version::vgt, version::vleq, version::vgeq, version::s2v, version::v2s */ /vlt[/arraytype /arraytype] { vcmp -1 eq } bind def /* BeginDocumentation Name: version::vgt - "Greater than" for version number arrays. Synopsis: [version1] [version2] vgt -> true | false Description: Compare two version number arrays. The result is true, if version1 is greater than version2 false, otherwise The common semantics of version numbers is applied, see version::vcmp. Parameters: version{1|2} - Version number arrays (see version::validate and [1]). Examples: [1 5] [1 5 0 0 0 0 0] vgt -> false [1 5] [1 4] vgt -> true [1 5] [1 5 1] vgt -> false Diagnostics: /SyntaxError is raised, if parameters are no valid version number arrays (see version::validate). Author: Ruediger Kupper FirstVersion: 29-jul-2003 Availability: SLI2.0, library: version References: [1] Ruediger Kupper, SLI library management, HRI-EU Report 06/05, Honda Research Institute Europe GmbH, 2006. SeeAlso: version::validate, version::vcmp, version::veq, version::vlt, version::vgt, version::vleq, version::vgeq, version::s2v, version::v2s */ /vgt[/arraytype /arraytype] { vcmp +1 eq } bind def /* BeginDocumentation Name: version::vleq - "Less or equal" for version number arrays. Synopsis: [version1] [version2] vleq -> true | false Description: Compare two version number arrays. The result is true, if version1 is less than or equal to version2 false, otherwise The common semantics of version numbers is applied, see version::vcmp. Parameters: version{1|2} - Version number arrays (see version::validate and [1]). Examples: [1 5] [1 5 0 0 0 0 0] vleq -> true [1 5] [1 4] vleq -> false [1 5] [1 5 1] vleq -> true Diagnostics: /SyntaxError is raised, if parameters are no valid version number arrays (see version::validate). Author: Ruediger Kupper FirstVersion: 29-jul-2003 Availability: SLI2.0, library: version References: [1] Ruediger Kupper, SLI library management, HRI-EU Report 06/05, Honda Research Institute Europe GmbH, 2006. SeeAlso: version::validate, version::vcmp, version::veq, version::vlt, version::vgt, version::vleq, version::vgeq, version::s2v, version::v2s */ /vleq[/arraytype /arraytype] { vcmp +1 neq } bind def /* BeginDocumentation Name: version::vgeq - "Greater or equal" for version number arrays. Synopsis: [version1] [version2] vgeq -> true | false Description: Compare two version number arrays. The result is true, if version1 is greater than or equal to version2 false, otherwise The common semantics of version numbers is applied, see version::vcmp. Parameters: version{1|2} - Version number arrays (see version::validate and [1]). Examples: [1 5] [1 5 0 0 0 0 0] vgeq -> true [1 5] [1 4] vgeq -> true [1 5] [1 5 1] vgeq -> false Diagnostics: /SyntaxError is raised, if parameters are no valid version number arrays (see version::validate). Author: Ruediger Kupper FirstVersion: 29-jul-2003 Availability: SLI2.0, library: version References: [1] Ruediger Kupper, SLI library management, HRI-EU Report 06/05, Honda Research Institute Europe GmbH, 2006. SeeAlso: version::validate, version::vcmp, version::veq, version::vlt, version::vgt, version::vleq, version::vgeq, version::s2v, version::v2s */ /vgeq[/arraytype /arraytype] { vcmp -1 neq } bind def /* BeginDocumentation Name: version::s2v - Convert version number string to array. Synopsis: (version) s2v -> [version] Description: Converts a version number contained in a string to a version number array. The string is expected to contain a "usual" dot-separated version number, e.g. (1.23.5) (no leading "V"). As one and only exception, the string may also contain a CVS revision string, e.g. (<dollar>Revision: 0.8.15<dollar>). In all other cases, [0] is returned. For CVS revision strings of not yet checked-in files, [0] is returned, too. Parameters: (version) - Version number string. See description above. [version] - Version number array (see version::validate and [1]). Examples: (1.23.5) s2v -> [1 23 5] (<dollar>Revision: 9.9<dollar>) s2v -> [9 9] (<dollar>Revision<dollar>) s2v -> [0] (v3.5) s2v -> [0] Diagnostics: /SyntaxError is raised, if result is no valid version number array (see version::validate). Author: Ruediger Kupper FirstVersion: 29-jul-2003 Availability: SLI2.0, library: version References: [1] Ruediger Kupper, SLI library management, HRI-EU Report 06/05, Honda Research Institute Europe GmbH, 2006. SeeAlso: version::validate, version::vcmp, version::veq, version::vlt, version::vgt, version::vleq, version::vgeq, version::s2v, version::v2s */ /s2v[/stringtype /s] { % first, handle possible CVS revision string. There are two possible versions: % revision string that has a number: s ($Revision: ) search { %stack: (number $) ($Revision: ) () pop pop %stack: (number $) reverse 0 2 erase reverse %stack: (number) } if % revision string that has not yet a number: dup ($Revision) ($) join eq { pop (9999999.9) M_DEBUG (library::s2v) (Found non-substituted $Revision) ($ string, returning a large number.) join message M_DEBUG (library::s2v) (Please check that keyword substitution is turned on for this file.) message %stack: (number) } if % at this point we assume that it's a normal version number. (.) breakup {cvi} Map dup validate } bind SLIFunctionWrapper /* BeginDocumentation Name: version::v2s - Convert version number array to string. Synopsis: [version] s2v -> (version) Description: Converts a version number array to a version number string. The string contains the "usual" dot-separated version number, e.g. (1.23.5) (no leading "V"). Parameters: (version) - Version number string. See description above. [version] - Version number array (see version::validate and [1]). Examples: [1 23 5] -> (1.23.5) [1 0 0 0] -> (1.0.0.0) Diagnostics: /SyntaxError is raised, if result is no valid version number array (see version::validate). Author: Ruediger Kupper FirstVersion: 29-jul-2003 Availability: SLI2.0, library: version References: [1] Ruediger Kupper, SLI library management, HRI-EU Report 06/05, Honda Research Institute Europe GmbH, 2006. SeeAlso: version::validate, version::vcmp, version::veq, version::vlt, version::vgt, version::vleq, version::vgeq, version::s2v, version::v2s */ /v2s[/arraytype /v] { v validate v 0 get cvs % get first number v 0 1 erase % get all other numbers {cvs (.) exch join join} forall } bind SLIFunctionWrapper end % namespace