subroutinemake_rangeprivate
subroutine make_range(c, args, v)
range(...), as a list.
Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
| c | type(fypp_t) | inout | the state | |
| args | type(value_t) | in | dimension(:) | the arguments |
| v | type(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