Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer(kind=long_k), | intent(out), | allocatable | :: | val(:) | Vector read from the Lua table, will have the same length as the table but not exceed maxlength, if provided. |
|
integer, | intent(out), | allocatable | :: | ErrCode(:) | Error code describing problems encountered in each of the components. Will be allocated with the same length as the returned vector. If the complete vector is not given in the Lua script, and no default is provided, an zerosized array will be returned. |
|
integer, | intent(in) | :: | maxlength | Maximal length to allocate for the vector. |
||
type(flu_State) | :: | L | Handle to the lua script |
|||
integer(kind=long_k), | intent(in), | optional | :: | default(:) | A default vector to use, if no proper definition is found. Components will be filled with the help of this default definition. |
subroutine get_top_long_vvect(val, ErrCode, maxlength, L, default)
type(flu_State) :: L !! Handle to the lua script
!> Vector read from the Lua table, will have the same length as the table
!! but not exceed maxlength, if provided.
integer(kind=long_k), intent(out), allocatable :: val(:)
!> Error code describing problems encountered in each of the components.
!! Will be allocated with the same length as the returned vector.
!! If the complete vector is not given in the Lua script, and no default
!! is provided, an zerosized array will be returned.
integer, intent(out), allocatable :: ErrCode(:)
!> Maximal length to allocate for the vector.
integer, intent(in) :: maxlength
!> A default vector to use, if no proper definition is found.
!! Components will be filled with the help of this default definition.
integer(kind=long_k), intent(in), optional :: default(:)
integer :: vect_handle
integer :: table_len, vect_len, def_len
integer :: vect_lb
integer :: iComp
vect_handle = 0
! Find the length of the default value, if it is not provided, its 0.
def_len = 0
if (present(default)) def_len = size(default)
is_scal: if (flu_isNumber(L, -1)) then
! Not a table but a scalar number!
allocate(val(1))
allocate(errCode(1))
if (def_len >= 1) then
call aot_top_get_val(val(1), ErrCode(1), L, &
& default(1) )
else
call aot_top_get_val( val(1), ErrCode(1), L )
end if
else is_scal
! Try to interpret the top entry on the stack as a table
vect_handle = aot_table_top(L=L)
table_len = aot_table_length(L=L, thandle=vect_handle)
! The size of the vector is limited by maxlength.
vect_len = min(maxlength, table_len)
! Now parse the table with the vector entries.
if (aot_table_first(L, vect_handle)) then
allocate(val(vect_len))
allocate(errCode(vect_len))
ErrCode = 0
! Up to the length of the default value, provide the default settings.
do iComp=1,def_len
call aot_top_get_val(val(iComp), ErrCode(iComp), L, &
& default(iComp))
if (.not. flu_next(L, vect_handle)) exit
end do
vect_lb = def_len+1
! After def_len entries no default values for the components are
! available anymore, proceed without a default setting for the rest.
do iComp=vect_lb,vect_len
call aot_top_get_val(val(iComp), ErrCode(iComp), L)
if (.not. flu_next(L, vect_handle)) exit
end do
else
! No vector definition found in the Lua script, use the default.
if (present(default)) then
allocate(val(def_len))
allocate(errCode(def_len))
val(:) = default
ErrCode = ibSet(0, aoterr_NonExistent)
else
! No vector definition in the Lua script and no default provided,
! return an empty array.
allocate(val(0))
allocate(errCode(0))
end if
end if
end if is_scal
call aot_table_close(L, vect_handle)
end subroutine get_top_long_vvect