demo6.f90 – M_CLI2
Author: John S. Urban
Description: command line parsing

# demo6.f90 Source File

- 48 statements
- Source File

### Contents

### Programs

demo6

### Source Code

demo6.f90

## Source Code

    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