Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
logical, | 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 |
|||
logical, | 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_logical_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. logical, 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. logical, 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_isBoolean(L, -1)) then ! Not a table but a scalar logical! 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_logical_vvect