program demo_specified
use, intrinsic :: iso_fortran_env, only : &
& stderr=>ERROR_UNIT, stdin=>INPUT_UNIT, stdout=>OUTPUT_UNIT
use M_CLI2, only : set_args, igets, rgets, specified, sget, lget
implicit none
! Define args
integer,allocatable :: ints(:)
real,allocatable :: floats(:)
logical :: flag
character(len=:),allocatable :: color
character(len=:),allocatable :: list(:)
integer :: i
call set_args('&
& --color:c "red" &
& --flag:f F &
& --ints:i 1,10,11 &
& --floats:T 12.3, 4.56 &
& ')
ints=igets('ints')
floats=rgets('floats')
flag=lget('flag')
color=sget('color')
write(*,*)'color=',color
write(*,*)'flag=',flag
write(*,*)'ints=',ints
write(*,*)'floats=',floats
write(*,*)'was -flag specified?',specified('flag')
! elemental
write(*,*)specified(['floats','ints '])
! If you want to know if groups of parameters were specified use
! ANY(3f) and ALL(3f)
write(*,*)'ANY:',any(specified(['floats','ints ']))
write(*,*)'ALL:',all(specified(['floats','ints ']))
! For mutually exclusive
if (all(specified(['floats','ints '])))then
write(*,*)'You specified both names --ints and --floats'
endif
! For required parameter
if (.not.any(specified(['floats','ints '])))then
write(*,*)'You must specify --ints or --floats'
endif
! check if all values are in range from 10 to 30 and even
write(*,*)'are all numbers good?',all([ints >= 10,ints <= 30,(ints/2)*2 == ints])
! perhaps you want to check one value at a time
do i=1,size(ints)
write(*,*)ints(i),[ints(i) >= 10,ints(i) <= 30,(ints(i)/2)*2 == ints(i)]
if(all([ints(i) >= 10,ints(i) <= 30,(ints(i)/2)*2 == ints(i)]) )then
write(*,*)ints(i),'is an even number from 10 to 30 inclusive'
else
write(*,*)ints(i),'is not an even number from 10 to 30 inclusive'
endif
enddo
list = [character(len=10) :: 'red','white','blue']
if( any(color == list) )then
write(*,*)color,'matches a value in the list'
else
write(*,*)color,'not in the list'
endif
if(size(ints).eq.3)then
write(*,*)'ints(:) has expected number of values'
else
write(*,*)'ints(:) does not have expected number of values'
endif
end program demo_specified