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

# demo17.f90 Source File

- 44 statements
- Source File

### Contents

### Programs

demo17

### Source Code

demo17.f90

## Source Code

    program demo17
    !!  @(#) using the unnamed parameters as filenames
    !!  For example, this should list the files in the current directory
    !!
    !!     demo17 *
    !!
    !!  Also demonstrates setting --help and --version text.
    !!
    !!     demo17 --help
    !!     demo17 --version
    !!     demo17 --usage
    !!
    use M_CLI2,  only : get_args
    use M_CLI2,  only : sget, lget, iget, rget, dget, cget
    use M_CLI2,  only : sgets, lgets, igets, rgets, dgets, cgets
    use M_CLI2,  only : filenames=>unnamed
    implicit none
    type(character(len=*)),parameter    :: all='(*(g0))'
    type(integer)                       :: indx

    !! argument values to set
    type(integer)                       :: i,j,k
    type(real)                          :: x,y,z
    type(character(len=:)),allocatable  :: title
    type(logical)                       :: l,m,n
    type(character(len=:)),allocatable  :: fnames(:)

       print all,'demo17: using the unnamed parameters as filenames'
       print all,'example: demo17 -x 100  * '

       call parse() !! Define and parse command line
       !! Get argument values
       call get_args('x',x,'y',y,'z',z)
       call get_args('i',i,'j',j,'k',k)
       call get_args('l',l,'m',m,'n',n)
       title=sget('title')

       !! All done cracking the command line use the values in your program.
       print all,'x=',x ,' y=',y ,' z=',z
       print all,'i=',i ,' j=',j ,' k=',k
       print all,'l=',l ,' m=',m ,' n=',n
       print all,'title=',title

       !! The optional unnamed values on the command line are
       !! accumulated in the character array "UNNAMED" which was
       !! renamed to "FILENAMES" on the use statement
       if(allocated(filenames))then
          if(size(filenames) > 0)then
             print all,'files:'
             print '(i6.6,1x,3a)',(indx,'[',filenames(indx),']',indx=1,size(filenames))
          endif
       endif

       ! alternate method, additionally can be used when desired result is numeric
       ! by using igets(3f), rgets(3f), ... instead of sgets(3f).

       fnames=sgets() ! also gets all the unnamed arguments
       if(size(fnames) > 0)then
          print all,'files:'
          print '(i6.6,1x,3a)',(indx,'[',fnames(indx),']',indx=1,size(fnames))
       endif

    contains
    subroutine parse()
    !! Put everything to do with command parsing here
    !!
    use M_CLI2,  only : set_args, set_mode
    call set_mode([character(len=20) :: 'strict','ignorecase'])
    ! a single call to set_args can define the options and their defaults, set help
    ! text and version information, and crack command line.
    call set_args(&
    !! DEFINE COMMAND OPTIONS AND DEFAULT VALUES
    ' &
     -i 1 -j 2 -k 3     &
     -l F -m F -n F     &
     -x 1 -y 2 -z 3     &
     --title "my title" &
    !! ## HELP TEXT ##
    ', [character(len=80) :: &
    !12345678901234567890123456789012345678901234567890123456789012345678901234567890
    'NAME                                                                            ', &
    '   myprogram(1) - make all things possible                                      ', &
    'SYNOPSIS                                                                        ', &
    '   myprogram [-i NNN] [-j NNN] [-k NNN] [-l] [-m] [-n] ]                        ', &
    '             [-x NNN.mm] [-y NNN.mm] [-z NNN.mm] [FILENAMES]                    ', &
    'DESCRIPTION                                                                     ', &
    '   myprogram(1) makes all things possible given stuff.                          ', &
    'OPTIONS                                                                         ', &
    '   -i,-j,-k   some integer values                                               ', &
    '   -l,-m,-n   some logical values                                               ', &
    '   -x,-y,-z   some real values                                                  ', &
    '   --title    a string argument                                                 ', &
    '   FILENAMES  any additional strings                                            ', &
    'EXAMPLE                                                                         ', &
    '   Typical usage:                                                               ', &
    '                                                                                ', &
    '     demo17 *.*                                                                 ', &
    '                                                                                ', &
    '                                                                                ', &
    !! ## VERSION TEXT (with optional @(#) prefix for what(1) command) ##
    '' ], [character(len=80) :: &
    '@(#)PROGRAM:     demo17           >', &
    '@(#)DESCRIPTION: My demo program  >', &
    '@(#)VERSION:     1.0 20200115     >', &
    '@(#)AUTHOR:      me, myself, and I>', &
    '@(#)LICENSE:     Public Domain    >', &
    '' ])

    end subroutine parse

    end program demo17