@(#) SUBCOMMANDS
For a command with subcommands like git(1) you can call this program which has two subcommands (run, test), like this:
demo6 –help demo6 run -x -y -z -title -l -L demo6 test -title -l -L -testname demo6 run –help
Type | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|
character(len=:), | allocatable | :: | help_text(:) | |||
logical | :: | l | ||||
logical | :: | l_ | ||||
character(len=:), | allocatable | :: | name | |||
character(len=80) | :: | testname | ||||
character(len=80) | :: | title | ||||
character(len=:), | allocatable | :: | version_text(:) |
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real, | intent(in) | :: | x | |||
real, | intent(in) | :: | y | |||
real, | intent(in) | :: | z | |||
character(len=*), | intent(in) | :: | title | |||
logical, | intent(in) | :: | l | |||
logical, | intent(in) | :: | l_ |
program demo6
!! @(#) SUBCOMMANDS
!!
!! For a command with subcommands like git(1) you can call this program
!! which has two subcommands (run, test), like this:
!!
!! demo6 --help
!! demo6 run -x -y -z -title -l -L
!! demo6 test -title -l -L -testname
!! demo6 run --help
!!
use M_CLI2, only : set_args, get_args, get_args_fixed_length, get_subcommand
use M_CLI2, only : rget,sget,lget
use M_CLI2, only : CLI_RESPONSE_FILE
implicit none
character(len=:),allocatable :: name ! the subcommand name
character(len=:),allocatable :: version_text(:), help_text(:)
! define some values to use as arguments
character(len=80) :: title, testname
logical :: l, l_
print *,'demo6: creating subcommands'
version_text=[character(len=80) :: &
'@(#)PROGRAM: demo6 >', &
'@(#)DESCRIPTION: My demo program >', &
'@(#)VERSION: 1.0 20200715 >', &
'@(#)AUTHOR: me, myself, and I>', &
'@(#)LICENSE: Public Domain >', &
'' ]
CLI_RESPONSE_FILE=.true.
! find the subcommand name by looking for first word on command
! not starting with dash
name = get_subcommand()
! define commands and parse command line and set help text and process command
select case(name)
case('run')
help_text=[character(len=80) :: &
' ', &
' Help for subcommand "run" ', &
' ', &
'' ]
call set_args('-x 1 -y 2 -z 3 --title "my title" -l F -L F',help_text,version_text)
! example using convenience functions to retrieve values and pass them
! to a routine
call my_run(rget('x'),rget('y'),rget('z'),sget('title'),lget('l'),lget('L'))
case('test')
help_text=[character(len=80) :: &
' ', &
' Help for subcommand "test" ', &
' ', &
'' ]
call set_args('--title "my title" -l F -L F --testname "Test"',help_text,version_text)
! use get_args(3f) to extract values and use them
call get_args_fixed_length('title',title)
call get_args('l',l)
call get_args('L',l_)
call get_args_fixed_length('testname',testname)
! all done cracking the command line. use the values in your program.
write(*,*)'command was ',name
write(*,*)'title .... ',trim(title)
write(*,*)'l,l_ ..... ',l,l_
write(*,*)'testname . ',trim(testname)
case('')
! general help for "demo6 --help"
help_text=[character(len=80) :: &
' General help describing the ', &
' program. ', &
'' ]
call set_args(' ',help_text,version_text) ! process help and version
case default
call set_args(' ',help_text,version_text) ! process help and version
write(*,'(*(a))')'unknown or missing subcommand [',trim(name),']'
end select
contains
subroutine my_run(x,y,z,title,l,l_)
! nothing about commandline parsing here!
real,intent(in) :: x,y,z
character(len=*),intent(in) :: title
logical,intent(in) :: l
logical,intent(in) :: l_
write(*,*)'MY_RUN'
write(*,*)'x,y,z .....',x,y,z
write(*,*)'title .... ',title
write(*,*)'l,l_ ..... ',l,l_
end subroutine my_run
end program demo6