File: demo6.f90

package info (click to toggle)
fortran-cli2 3.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 25,856 kB
  • sloc: f90: 6,172; javascript: 3,423; makefile: 188; sh: 25
file content (96 lines) | stat: -rwxr-xr-x 3,332 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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