M_CLI2(3m_cli2)
π M_CLI2 β the manual page, but make it cute π
okay so bestie, welcome to M_CLI2(3m_cli2) β the module that literally just cracks a Unix-style command line for you. the actual NAME line in the source says M_CLI2(3fm) - [ARGUMENTS::M_CLI2::INTRO] and it's about command line argument parsing using a prototype command. and it's LICENSE:PD (public domain, we love a generous king π).
β¨ NAME β¨
M_CLI2(3fm) β [ARGUMENTS::M_CLI2::INTRO] command line argument parsing using a prototype command. also: LICENSE:PD π«Ά
πΈ SYNOPSIS πΈ
here's every procedure and variable you can pull in, fr fr:
! basic procedures
use M_CLI2, only : set_args, get_args, specified, set_mode
! convenience functions
use M_CLI2, only : dget, iget, lget, rget, sget, cget
use M_CLI2, only : dgets, igets, lgets, rgets, sgets, cgets
! variables
use M_CLI2, only : unnamed, remaining, args
! working with non-allocatable strings and arrays
use M_CLI2, only : get_args_fixed_length, get_args_fixed_size
! special function for creating subcommands
use M_CLI2, only : get_subcommand(3f)
π¦ DESCRIPTION π¦
so the M_CLI2 module cracks a Unix-style command line. that's the whole vibe. π
typically you make one call to SET_ARGS(3f) to define the command arguments, set default values and parse the command line. then you call the convenience procedures β or GET_ARGS(3f) proper β for each command keyword to grab the argument values. lowkey elegant, highkey useful. β¨
detailed descriptions of each procedure and example programs are included. no gatekeeping here. π
π EXAMPLE π
here's a minimal program that can be called in various ways:
mimimal -x 100.3 -y 3.0e4
mimimal --xvalue=300 --debug
mimimal --yvalue 400
mimimal -x 10 file1 file2 file3
program example:
program minimal
use M_CLI2, only : set_args, lget, rget, sgets
implicit none
real :: x, y
integer :: i
character(len=:),allocatable :: filenames(:)
! define and crack command line
call set_args(' --yvalue:y 0.0 --xvalue:x 0.0 --debug F')
! get values
x=rget('xvalue')
y=rget('yvalue')
if(lget('debug'))then
write(*,*)'X=',x
write(*,*)'Y=',y
write(*,*)'ATAN2(Y,X)=',atan2(x=x,y=y)
else
write(*,*)atan2(x=x,y=y)
endif
filenames=sgets() ! sget with no name gets "unnamed" values
if(size(filenames) > 0)then
write(*,'(g0)')'filenames:'
write(*,'(i6.6,3a)')(i,'[',filenames(i),']',i=1,size(filenames))
endif
end program minimal
sample program using get_args() and variants:
program demo_M_CLI2
use M_CLI2, only : set_args, get_args
use M_CLI2, only : filenames=>unnamed
use M_CLI2, only : get_args_fixed_length, get_args_fixed_size
implicit none
integer :: i
integer,parameter :: dp=kind(0.0d0)
!
! Define ARGS
real :: x, y, z
logical :: l, lbig
character(len=40) :: label ! FIXED LENGTH
real(kind=dp),allocatable :: point(:)
logical,allocatable :: logicals(:)
character(len=:),allocatable :: title ! VARIABLE LENGTH
real :: p(3) ! FIXED SIZE
logical :: logi(3) ! FIXED SIZE
!
! DEFINE AND PARSE (TO SET INITIAL VALUES) COMMAND LINE
! o set a value for all keywords.
! o double-quote strings, strings must be at least one space
! because adjacent double-quotes designate a double-quote
! in the value.
! o set all logical values to F
! o numeric values support an "e" or "E" exponent
! o for lists delimit with a comma, colon, or space
call set_args(' &
& -x 1 -y 2 -z 3 &
& -p -1 -2 -3 &
& --point 11.11, 22.22, 33.33e0 &
& --title "my title" -l F -L F &
& --logicals F F F F F &
& --logi F T F &
& --label " " &
! note space between quotes is required
& ')
! Assign values to elements using G_ARGS(3f).
! non-allocatable scalars can be done up to twenty per call
call get_args('x',x, 'y',y, 'z',z, 'l',l, 'L',lbig)
! As a convenience multiple pairs of keywords and variables may be
! specified if and only if all the values are scalars and the CHARACTER
! variables are fixed-length or pre-allocated.
!
! After SET_ARGS(3f) has parsed the command line
! GET_ARGS(3f) retrieves the value of keywords accept for
! two special cases. For fixed-length CHARACTER variables
! see GET_ARGS_FIXED_LENGTH(3f). For fixed-size arrays see
! GET_ARGS_FIXED_SIZE(3f).
!
! allocatables should be done one at a time
call get_args('title',title) ! allocatable string
call get_args('point',point) ! allocatable arrays
call get_args('logicals',logicals)
!
! less commonly ...
! for fixed-length strings
call get_args_fixed_length('label',label)
! for non-allocatable arrays
call get_args_fixed_size('p',p)
call get_args_fixed_size('logi',logi)
!
! all done parsing, use values
write(*,*)'x=',x, 'y=',y, 'z=',z, x+y+z
write(*,*)'p=',p
write(*,*)'point=',point
write(*,*)'title=',title
write(*,*)'label=',label
write(*,*)'l=',l
write(*,*)'L=',lbig
write(*,*)'logicals=',logicals
write(*,*)'logi=',logi
!
! unnamed strings
!
if(size(filenames) > 0)then
write(*,'(i6.6,3a)')(i,'[',filenames(i),']',i=1,size(filenames))
endif
!
end program demo_M_CLI2
π AUTHOR π
John S. Urban, 2019. absolute legend, we stan. π
π LICENSE π
Public Domain. it's giving generous. it's giving free. periodt. β¨
π§ SEE ALSO π§
go read these next bestie, they're all connected:
get_args(3f)get_args_fixed_size(3f)get_args_fixed_length(3f)get_subcommand(3f)set_mode(3f)specified(3f)
heads up: the convenience routines are described underget_args(3f)β that'sdget(3f),iget(3f),lget(3f),rget(3f),sget(3f),cget(3f)anddgets(3f),igets(3f),lgets(3f),rgets(3f),sgets(3f),cgets(3f). iykyk π
okay that's the whole page, mwah π
this was M_CLI2(3m_cli2), dated February 10, 2023. go forth and crack some command lines, bestie β you're the main character of your own terminal π¦πβ¨
π¦ where this page comes from
- ubuntu resolute: libfortran-cli2-dev 3.2.0-6 Β· UNLICENSE
- ubuntu stonking: libfortran-cli2-dev 3.2.0-13 Β· UNLICENSE
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms