Wrapper to json_add_string_by_path for adding a string vector by path.
The ilen
input can be used to specify the actual lengths of the
the strings in the array. They must all be <= len(value)
.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(json_core), | intent(inout) | :: | json | |||
type(json_value), | pointer | :: | me | the JSON structure |
||
character(kind=CK,len=*), | intent(in) | :: | path | the path to the variable |
||
character(kind=CK,len=*), | intent(in), | dimension(:) | :: | value | the vector to add |
|
logical(kind=LK), | intent(out), | optional | :: | found | if the variable was found |
|
logical(kind=LK), | intent(out), | optional | :: | was_created | if the variable had to be created |
|
integer(kind=IK), | intent(in), | optional | dimension(:) | :: | ilen | the string lengths of each
element in |
logical(kind=LK), | intent(in), | optional | :: | trim_str | if TRIM() should be called for each element |
|
logical(kind=LK), | intent(in), | optional | :: | adjustl_str | if ADJUSTL() should be called for each element |
subroutine json_add_string_vec_by_path(json,me,path,value,found,was_created,ilen,trim_str,adjustl_str)
implicit none
class(json_core),intent(inout) :: json
type(json_value),pointer :: me !! the JSON structure
character(kind=CK,len=*),intent(in) :: path !! the path to the variable
character(kind=CK,len=*),dimension(:),intent(in) :: value !! the vector to add
logical(LK),intent(out),optional :: found !! if the variable was found
logical(LK),intent(out),optional :: was_created !! if the variable had to be created
integer(IK),dimension(:),intent(in),optional :: ilen !! the string lengths of each
!! element in `value`. If not present,
!! the full `len(value)` string is added
!! for each element.
logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for each element
logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for each element
type(json_value),pointer :: p !! pointer to path (which may exist)
type(json_value),pointer :: var !! new variable that is created
integer(IK) :: i !! counter
character(kind=CK,len=:),allocatable :: name !! the variable name
logical(LK) :: p_found !! if the path was successfully found (or created)
if ( .not. json%exception_thrown ) then
! validate ilen array if present:
if (present(ilen)) then
if (size(ilen)/=size(value)) then
call json%throw_exception('Error in json_add_string_vec_by_path: '//&
'Invalid size of ilen input vector.',found)
if (present(found)) then
found = .false.
call json%clear_exceptions()
end if
if (present(was_created)) was_created = .false.
return
else
! also have to validate the specified lengths.
! (must not be greater than input string length)
do i = 1, size(value)
if (ilen(i)>len(value)) then
call json%throw_exception('Error in json_add_string_vec_by_path: '//&
'Invalid ilen element.',found)
if (present(found)) then
found = .false.
call json%clear_exceptions()
end if
if (present(was_created)) was_created = .false.
return
end if
end do
end if
end if
!get a pointer to the variable
!(creating it if necessary)
call json%create(me,path,p,found=p_found)
if (p_found) then
call json%info(p,name=name) ! want to keep the existing name
call json%create_array(var,name) ! create a new array variable
call json%replace(p,var,destroy=.true.) ! replace p with this array (destroy p)
!populate each element of the array:
do i=1,size(value)
if (present(ilen)) then
call json%add(var, CK_'', value(i)(1:ilen(i)), &
trim_str=trim_str, adjustl_str=adjustl_str)
else
call json%add(var, CK_'', value(i), &
trim_str=trim_str, adjustl_str=adjustl_str)
end if
end do
end if
else
if ( present(found) ) found = .false.
if ( present(was_created) ) was_created = .false.
end if
end subroutine json_add_string_vec_by_path