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

# set_mode Subroutine

- 29 statements
- Source File

## public impure elemental subroutine set_mode(key, mode)

## NAME

    set_mode(3f) - [ARGUMENTS:M_CLI2] turn on optional modes
    (LICENSE:PD)

## SYNOPSIS

    subroutine set_mode(key,mode)

     character(len=*),intent(in) :: key
     logical,intent(in),optional :: mode

## DESCRIPTION

     Allow optional behaviors.

## OPTIONS

    KEY    name of option

    The following values are allowed:

    o  response_file - enable use of response file

    o  ignorecase - ignore case in long key names. So the user
       does not have to remember if the option is --IgnoreCase
       or --ignorecase or --ignoreCase

    o  underdash  - treat dash in keyword as an underscore.
       So the user should not have to remember if the option is
       --ignore_case or --ignore-case.

    o  strict - allow Boolean keys to be bundled, but requires
       a single dash prefix be used for short key names and
       long names must be prefixed with two dashes.

    o  lastonly  - when multiple keywords occur keep the rightmost
       value specified instead of appending the values together.

    MODE   set to .true. to activate the optional mode.
           Set to .false. to deactivate the mode.
           It is .true. by default.

## EXAMPLE

Sample program:

    program demo_set_mode
    use M_CLI2,  only : set_args, lget, set_mode
    implicit none
    character(len=*),parameter :: all='(*(g0))'
       !
       ! enable use of response files
       call set_mode('response_file')
       !
       ! Any dash in a keyword is treated as an underscore
       call set_mode('underdash')
       !
       ! The case of long keywords are ignored.
       ! Values and short names remain case-sensitive
       call set_mode('ignorecase')
       !
       ! short single-character boolean keys may be bundled
       ! but it is required that a single dash is used for
       ! short keys and a double dash for long keywords.
       call set_mode('strict')
       !
       call set_args(' --switch_X:X F --switch-Y:Y F --ox:O F -t F -x F -o F')
       !
       print all,'--switch_X or -X ... ',lget('switch_X')
       print all,'--switch_Y or -Y ... ',lget('switch_Y')
       print all,'--ox or -O       ... ',lget('ox')
       print all,'-o               ... ',lget('o')
       print all,'-x               ... ',lget('x')
       print all,'-t               ... ',lget('t')
    end program demo_set_mode

## AUTHOR

      John S. Urban, 2019

## LICENSE

      Public Domain

### Arguments

Type | Intent | Optional | Attributes |  | Name |
--- | --- | --- | --- | --- | --- | ---
character(len=*), | intent(in) |  |  | :: | key |
logical, | intent(in), | optional |  | :: | mode |

### Contents

### Source Code

set_mode

## Source Code

    elemental impure subroutine set_mode(key,mode)
    character(len=*),intent(in) :: key
    logical,intent(in),optional :: mode
    logical :: local_mode

       if(present(mode))then
          local_mode=mode
       else
          local_mode=.true.
       endif

       select case(lower(key))
       case('response_file','response file'); CLI_RESPONSE_FILE=local_mode
       case('debug');                         G_DEBUG=local_mode
       case('ignorecase');                    G_IGNORECASE=local_mode
       case('underdash');                     G_UNDERDASH=local_mode
       case('noseparator');                   G_NOSEPARATOR=local_mode
       case('strict');                        G_STRICT=local_mode
       case('lastonly');                      G_APPEND=.not.local_mode
       case default
          call journal('*set_mode* unknown key name ',key)
       end select

       if(G_DEBUG)write(*,gen)'<DEBUG>EXPAND_RESPONSE:END'

    end subroutine set_mode