private subroutine get_top_quadruple_vvect(val, ErrCode, maxlength, L, default)

Arguments

Type IntentOptional AttributesName

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

A default vector to use, if no proper definition is found. Components will be filled with the help of this default definition.

Source Code

  subroutine get_top_quadruple_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.

!> 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 :: vect_handle
integer :: table_len, vect_len, def_len
integer :: vect_lb
integer :: iComp

! 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)

! Find the length of the default value, if it is not provided, its 0.
def_len = 0
if (present(default)) def_len = size(default)

! 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

! Only if the vector table actually exists, and has at least one entry,
! this parsing has to be done.
if (present(default).and.(def_len > 0)) 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

! Up to the length of the default value, provide the default settings.
do iComp=2,def_len
if (.not. flu_next(L, vect_handle)) exit
call aot_top_get_val(val(iComp), ErrCode(iComp), L, &
&                  default(iComp))
end do

vect_lb = max(2, 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
if (.not. flu_next(L, vect_handle)) exit
call aot_top_get_val(val(iComp), ErrCode(iComp), L)
end do
else
! No vector definition found in the Lua script, use the default.
if (present(default)) then
allocate(val(def_len))
allocate(errCode(vect_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
call aot_table_close(L, vect_handle)