# Copyright 2002, 2003, 2004, 2006 Vladimir Prus
# Copyright 2008 Jurko Gospodnetic
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)

import errors ;
import numbers ;


rule boost-build ( )
{
    return "V2 (Milestone 12)" ;
}


rule jam ( )
{
    local v = [ modules.peek : JAM_VERSION ] ;
    return $(v:J=.) ;
}


rule print ( )
{
    ECHO "Boost.Build" [ boost-build ] ;
    ECHO "Boost.Jam" [ jam ] ;
}


# Utility rule for testing whether all elements in a sequence are equal to 0.
#
local rule is-all-zeroes ( sequence * )
{
    local result = "true" ;
    for local e in $(sequence)
    {
        if $(e) != "0"
        {
            result = "" ;
        }
    }
    return $(result) ;
}


# Returns "true" if the first version is less than the second one.
#
rule version-less ( lhs + : rhs + )
{
    numbers.check $(lhs) ;
    numbers.check $(rhs) ;

    local done ;
    local result ;

    while ! $(done) && $(lhs) && $(rhs)
    {
        if [ numbers.less $(lhs[1]) $(rhs[1]) ]
        {
            done = "true" ;
            result = "true" ;
        }
        else if [ numbers.less $(rhs[1]) $(lhs[1])  ]
        {
            done = "true" ;
        }
        else
        {
            lhs = $(lhs[2-]) ;
            rhs = $(rhs[2-]) ;
        }
    }
    if ( ! $(done) && ! $(lhs) && ! [ is-all-zeroes $(rhs) ] )
    {
        result = "true" ;
    }
    
    return $(result) ;
}


# Returns "true" if the current JAM version version is at least the given
# version.
#
rule check-jam-version ( version + )
{
    local version-tag = $(version:J=.) ;
    if ! $(version-tag)
    {
        errors.error Invalid version specifier: : $(version:E="(undefined)") ;
    }

    if ! $(.jam-version-check.$(version-tag))-is-not-empty
    {
        local jam-version = [ modules.peek : JAM_VERSION ] ;
        if ! $(jam-version)
        {
            errors.error "Unable to deduce Boost Jam version. Your Boost Jam"
                "installation is most likely terribly outdated." ;
        }
        .jam-version-check.$(version-tag) = "true" ;
        if [ version-less [ modules.peek : JAM_VERSION ] : $(version) ]
        {
            .jam-version-check.$(version-tag) = "" ;
        }
    }
    return $(.jam-version-check.$(version-tag)) ;
}


rule __test__ ( )
{
    import assert ;
    
    local jam-version = [ modules.peek : JAM_VERSION ] ;
    local future-version = $(jam-version) ;
    future-version += "1" ;

    assert.true  check-jam-version $(jam-version)    ;
    assert.false check-jam-version $(future-version) ;

    assert.true  version-less  0          :  1          ;
    assert.false version-less  0          :  0          ;
    assert.true  version-less  1          :  2          ;
    assert.false version-less  1          :  1          ;
    assert.false version-less  2          :  1          ;
    assert.true  version-less  3 1 20     :  3 4 10     ;
    assert.false version-less  3 1 10     :  3 1 10     ;
    assert.false version-less  3 4 10     :  3 1 20     ;
    assert.true  version-less  3 1 20 5 1 :  3 4 10     ;
    assert.false version-less  3 1 10 5 1 :  3 1 10     ;
    assert.false version-less  3 4 10 5 1 :  3 1 20     ;
    assert.true  version-less  3 1 20     :  3 4 10 5 1 ;
    assert.true  version-less  3 1 10     :  3 1 10 5 1 ;
    assert.false version-less  3 4 10     :  3 1 20 5 1 ;
    assert.false version-less  3 1 10     :  3 1 10 0 0 ;
    assert.false version-less  3 1 10 0 0 :  3 1 10     ;
    assert.false version-less  3 1 10 0   :  3 1 10 0 0 ;
    assert.false version-less  3 1 10 0   : 03 1 10 0 0 ;
    assert.false version-less 03 1 10 0   :  3 1 10 0 0 ;

    # TODO: Add tests for invalid input data being sent to version-less.
}
