fdoc

subroutinemake_rangeprivate

subroutine make_range(c, args, v)

range(...), as a list.

Arguments

NameTypeIntentAttributesDescription
ctype(fypp_t)inout

the state

argstype(value_t)indimension(:)

the arguments

vtype(value_t)out

the result

Calls

Source

Show the code
subroutine make_range(c, args, v)
    type(fypp_t), intent(inout) :: c            !! the state
    type(value_t), intent(in) :: args(:)        !! the arguments
    type(value_t), intent(out) :: v             !! the result
    integer :: first, last, step, n, k

    first = 0
    step = 1
    select case (size(args))
    case (1)
        last = args(1)%number
    case (2)
        first = args(1)%number
        last = args(2)%number
    case (3)
        first = args(1)%number
        last = args(2)%number
        step = args(3)%number
    case default
        call fail(c, 'range takes one to three arguments')
        return
    end select
    n = max((last - first + step - sign(1, step))/step, 0)
    v%kind = V_LIST
    allocate (v%items(n))
    do k = 1, n
        call make_int(first + (k - 1)*step, v%items(k))
    end do
end subroutine make_range

Graphs

Calls

Called by