get_subcommand(3m_cli2)

πŸ“¦ version 3.2.0, in ubuntu resolute, ubuntu stonking

πŸ’– get_subcommand πŸ’–

okay bestie, welcome to the get_subcommand(3m_cli2) page β€” yes that's the manual name, section 3m_cli2, she's iconic, she's niche, she's exactly what you need if you're out here building a program with subcommands πŸŽ€


✨ NAME ✨

get_subcommand(3f) β€” [ARGUMENTS:M_CLI2] special-case routine for handling subcommands on a command line (LICENSE:PD)

like literally the whole point is subcommands, no cap πŸ’…


✨ SYNOPSIS ✨

function get_subcommand()

    character(len=:),allocatable :: get_subcommand

✨ DESCRIPTION ✨

okay so here's the tea πŸ“ in the special case when you're creating a program with subcommands, it is assumed that the first word on the command line is the subcommand. and a routine is required to handle response file processing β€” that's literally why this routine exists. it (optionally processing response files) returns that first word as the subcommand name. slay.

🚨 bestie listen β€” it should not be used by programs not building a more elaborate command with subcommands. it's giving "special occasion only", not "everyday wear". periodt.

✨ RETURNS ✨

  • NAME β€” name of subcommand πŸ‘‘

✨ EXAMPLE ✨

Sample program:

   program demo_get_subcommand
   !x! SUBCOMMANDS
   !x! For a command with subcommands like git(1)
   !x! you can make separate namelists for each subcommand.
   !x! You can call this program which has two subcommands (run, test),
   !x! like this:
   !x!    demo_get_subcommand --help
   !x!    demo_get_subcommand run -x -y -z --title -l -L
   !x!    demo_get_subcommand test --title -l -L --testname
   !x!    demo_get_subcommand run --help
      implicit none
   !x! DEFINE VALUES TO USE AS ARGUMENTS WITH INITIAL VALUES
      real               :: x=-999.0,y=-999.0,z=-999.0
      character(len=80)  :: title="not set"
      logical            :: l=.false.
      logical            :: l_=.false.
      character(len=80)  :: testname="not set"
      character(len=20)  :: name
      call parse(name) !x! DEFINE AND PARSE COMMAND LINE
      !x! ALL DONE CRACKING THE COMMAND LINE.
      !x! USE THE VALUES IN YOUR PROGRAM.
      write(*,*)'command was ',name
      write(*,*)'x,y,z .... ',x,y,z
      write(*,*)'title .... ',title
      write(*,*)'l,l_ ..... ',l,l_
      write(*,*)'testname . ',testname
   contains
   subroutine parse(name)
   !x! PUT EVERYTHING TO DO WITH COMMAND PARSING HERE FOR CLARITY
   use M_CLI2, only : set_args, get_args, get_args_fixed_length
   use M_CLI2, only : get_subcommand, set_mode
   character(len=*)              :: name    ! the subcommand name
   character(len=:),allocatable  :: help_text(:), version_text(:)
      call set_mode('response_file')
   ! define version text
      version_text=[character(len=80) :: &
         '@(#)PROGRAM:     demo_get_subcommand            >', &
         '@(#)DESCRIPTION: My demo program  >', &
         '@(#)VERSION:     1.0 20200715     >', &
         '@(#)AUTHOR:      me, myself, and I>', &
         '@(#)LICENSE:     Public Domain    >', &
         '' ]
       ! general help for "demo_get_subcommand --help"
       help_text=[character(len=80) :: &
        ' allowed subcommands are          ', &
        '   * run  -l -L --title -x -y -z  ', &
        '   * test -l -L --title           ', &
        '' ]
      ! find the subcommand name by looking for first word on command
      ! not starting with dash
      name = get_subcommand()
      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)
       call get_args('x',x)
       call get_args('y',y)
       call get_args('z',z)
       call get_args_fixed_length('title',title)
       call get_args('l',l)
       call get_args('L',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)
       call get_args_fixed_length('title',title)
       call get_args('l',l)
       call get_args('L',l_)
       call get_args_fixed_length('testname',testname)
      case default
       ! process help and version
       call set_args(' ',help_text,version_text)
       write(*,'(*(a))')'unknown or missing subcommand [',trim(name),']'
       write(*,'(a)')[character(len=80) ::  &
       ' allowed subcommands are          ', &
       '   * run  -l -L -title -x -y -z   ', &
       '   * test -l -L -title            ', &
       '' ]
       stop
      end select
   end subroutine parse
   end program demo_get_subcommand

like LOOK at her go 😭 the select case(name) is the main character moment fr fr, one case('run'), one case('test'), and a case default that just reads you for filth and tells you your subcommand is unknown or missing πŸ’€


✨ AUTHOR ✨

John S. Urban, 2019 β€” king behavior honestly πŸ‘‘


✨ LICENSE ✨

Public Domain 🫢 go wild, no strings, she's free


and that's the whole page bestie!! πŸ¦‹ this little manual page is dated February 10, 2023, from the get_subcommand(3m_cli2) source, so if you cite her, cite her right πŸ’œ mwah, go build something cute with subcommands, iykyk ✨🌸

πŸ“¦ where this page comes from