File xoptions.icn

Summary

###########################################################################

       File:     xoptions.icn

       Subject:  Procedure to get command-line options

       Based on the options.icn by
       Robert J. Alexander and Gregg M. Townsend and Don Ward

       Modified: Bruce Rennie          Rewrite and extensions

       Date:     August 29, 2020

###########################################################################

   This file is in the public domain.

###########################################################################

       xoptions(arg, optstring, errproc, finishoption[]) removes command options
       from the argument list of an Icon main procedure, returning a table of
       option values.

###########################################################################

     xoptions(arg, optstring, errproc, finishoption[]) -- Get command line options.

     This procedure separates and interprets command line options included in
  the main program argument list.  Option names and values are removed
  from the argument list and returned in a table. Allows for options to have
  sub-options and allows for options/sub-options to be stored in separate files
  and called by referencing these files by use of "@".

     This procedure will now handle the POSIX conventions, the GNU long option
  conventions and the various conventions that were originally in this procedure,
  including non-alphanumeric characters as options.

     Additionally, Icon/Unicon conventions of using "-x" as well as "--" to end
  the processing of options from the command line by allowing an additional list
  of values to do this. A addition allows for a series of values to be stored
  against an option till "--" or other specified values are encountered.

     On the command line, options are introduced by a "-" character.  An option
  name is either a single printable character, as in "-n" or "-?", or a string
  of letters, numbers, and underscores, as in "-geometry". Valueless
  single-character options may appear in combination, for example as "-qtv".


     Some options require values.  Generally, the option name is one argument
  and the value appears as the next argument, for example "-F file.txt".
  However, with a single-character argument name (as in that example), the
  value may be concatenated: "-Ffile.txt" is accepted as equivalent. In addition
  the "=" can be used as the separator between the option and the value (no
  space separation allowed) as in "-F=file.txt".

     Options may be freely interspersed with non-option arguments. An argument
  of a single "-" is treated as a non-option.  The special argument "--" or other
  specified values will terminate the option processing. Non-option arguments
  are returned in the original argument list for interpretation by the caller,
  including those collected from any specified option file (as described in the
  next paragraph).

     An argument of the form @filename (a "@" immediately followed by a file name)
  causes xoptions() to replace that argument with arguments retrieved from the
  file "filename".  Each line of the file is taken as a separate argument,
  exactly as it appears in the file. Arguments beginning with - are processed
  as options, and those starting with @ are processed as nested argument files.
  An argument of "--" causes all remaining arguments IN THAT FILE ONLY to be
  treated as non-options (including @filename arguments). filename can have a
  fully specified path or a relative specified path or a local directory
  specified path.

     The parameters of xoptions(arg, optstring, errproc, finishoption[]) are:

       arg         the argument list as passed to the main procedure. This is the
                   list that is passed into the program from the operating system
                   being used.

       optstring   a string specifying the allowable options.  This is a
                   concatenation, with optional spaces between, of one or more
                   option specs of the form

                       -name%*     (one or more alphanumeric or _)
                       --name%*    (one or more alphanumeric or _ or -)
                       name%*      (one or more characters not flags and each
                                    character is treated as a separate single
                                    character option)
                       =name%*     (one or more alphanumeric or _)

                   where

                       -       introduces the option

                       --      introduces the option where the option name can
                               contain "-"

                       =       introduces the option where command line option
                               can be either --name or -name

                       name    is either a string of alphanumerics (any of a-z,
                               A-Z, 0-9, and _)
                               or any single printable character. The "-" is
                               allowed when prefixed by "--".

                       %       is one of the following flag characters:
                               !       No value is required or allowed
                               :       A string value is required
                               +       An integer value is required
                               .       A real value is required
                               $       Optional value - anything
                               ()      Defines a set of comma separated sub-option
                                       option/pairs. The option string definition
                                       use the above flag characters "!", ":",
                                       "+", ".", "$" with an optional "*". The
                                       value (if supplied) is separated by "=".
                               <       all values following this option up to any
                                       value found in finishoption are to be
                                       collected into a list for this option.
                                       any "*" following this will be ignored.

                       *       optional and indicates that the option can occur
                               multiple times in the command options and must
                               follow the % specifier, if used.

                       For all options that do not allow multiple occurrences,
                       the consequence of multiple appearances of that option
                       is that the last occurrence will overwrite any previous
                       occurrence.

                   The leading "-" may be omitted for a single-characteroption.
                   The "!" flag may be omitted except when needed to terminate
                   a multi-character name. In the case of a single "-" as the
                   start of the option specifier, any following "-" will
                   terminate the multi-character name.

                   Thus the following optstrings are equivalent:

                       "-n+ -t -v -q -F: -geometry: -silent"
                       "n+tvqF:-geometry:-silent"
                       "-silent!n+tvqF:-geometry:"

                   If "optstring" is omitted any single letter or digit is
                   assumed to be valid and require no data.

       errproc     a procedure which will be called if an error is is detected
                   in the command line options. The procedure is called with
                   one argument:  a string describing the error that occurred.
                   After errproc() is called, xoptions() immediately returns the
                   outcome of errproc(), without processing further arguments.
                   Already processed arguments will have been removed from "arg".
                   If "errproc" is omitted, stop() is called if an error is
                   detected and the program will abort.

       finishoption is a list of options that terminate the processing of options.
                   This allows the proceeding options to be passed to another
                   program. By default this is "--". An example of other values
                   being used is the "-x" used in the icont compiler to pass
                   all following parameters to the iconx interpreter.


     A table is returned containing the options that were specified. The keys
  are the specified option names. The assigned values are the data values
  following the options converted to the specified type.

  A value of 1 is stored for options that accept no values.

     The table's default value is &null so testing for the occurrence of that
  specific parameter can use the \ operator to check if it was actually specified
  on the command line.


     Upon return, the option arguments are removed from arg, leaving only the
  non-option arguments.


 Options with embedded "-"

     Options may begin with "--" and, if they do, may contain "-" characters.
  So options like --dry-run will be parsed correctly and will result in an
  entry in the options table with a key of "-dry-run" (note the leading minus
  in the key). All such options must be terminated by a space or one of
  allowable specifier characters described above. The handling of these options
  allows any number of "-" to be in the option name after the initial
  alphanumeric or "_" character. The normal expectation is that the option name
  will have a single "-" between each group of alphanumeric character grouping.
  However, if you require multiple sequential "-" in the option name, this is
  allowed.

     For all options that have an associated value (optional or required), there
  are three usable alternatives (as per POSIX standards).

     For single character options, the value can follow immediately, or it can be
  space separated or have a an "=" between the option and the value.

     Using -l as an example, we can specify the command line as

       -lone
       -l one
       -l=one

     For multi-character options, the value is either space separated or have
  an "=" between the option and the value.

     Using -geometry as an example, we can specify the command line as

       -geometry "240:240"
       -geometry="240:240"

     For options that have sub-options the following has been added (as per the
  POSIX standards). The options that have sub-options have the sub-options as a
  comma separated list of option/value pairs. Those sub-options that have values use
  a "=" between sub-option and the associated value. To define the sub-options,
  place these in parentheses.

     An example of defining the option string.

       -o(h!file:*sfr)

     The command line form could be as follows

       -o h,file=filename.ext,file="another file.ext",r

     The value returned for an option that has sub-options is a table of key/values
  pairs, the default is &null and for keys that have no required values, the value
  returned is 1.


     A similar extension is available in the @ file. You can now write

       -time 45
     or
       -time=45

     instead of the two lines previously required as in

       -time
       45

 Treating options specified as --opt and -opt as the same option.

     To remove the leading minus from such keys, make the first character
  of the specified option in the option string an "=" character: then, a
  supplied argument of either --opt or -opt would result in a key of "opt" in
  the table. When the first character is an equals character, the procedure
  ensures that only one of "--opt" or "-opt" may be specified in the option
  way to allow (for example) both --run and -run as options is to miss out
  string. The only the leading equals and to treat option["-run"] and option["run"]
  separately in the calling program.

 e.g.

   "-bish-bash-bosh--bash"   gives to four different options, which are

   command line                        option table
   ------------------------------|-----------------------------
       -bish                     |        bish
       -bash                     |        bash
       -bosh                     |        bosh
       --bash                    |        -bash

   "--bish-bash-bosh--bash"  recognises a single command line option

   command line                        option table
   ------------------------------|-----------------------------
       --bish-bash-bosh--bash    |     -bish-bash-bosh--bash

   "=bish-bash-bosh--bash"  recognises two command line options that have the
  same meaning

   command line                        option table
   ------------------------------|-----------------------------
       -bish-bash-bosh--bash     |    bish-bash-bosh--bash
       --bish-bash-bosh--bash    |    bish-bash-bosh--bash


 Specify short form of option names

     As per GNU extensions, the option names can be shortened as long as these
  shortened forms are able to be disambiguated from all other valid option
  names. An example of this would be two options such as "-si" and "-silent".

     In this case, "-s" would NOT be a valid short form as it could not be
  disambiguated between either of the options. "-si" would be available as this
  is the full option name and "-sil" and any longer prefix of "-silent" would
  also be valid.

  The command line could use the full names as:

   "-si -silent"

  or it could be specified as

   "-si -sil"

  as being equivalent command line forms.

###########################################################################
Procedures:
convert_to_list, process_command_option, process_option_string, xoptions

This file is part of the (main) package.

Source code.

Details
Procedures:

convert_to_list(str, suboptionsep)

PD:
: convert_to_list(str, suboptionsep) - the sub-string elements that are separated
: by the value found in suboptionsep into a list of strings that are option/value
: pairs and prefix each sub-string with the "-".
:
: This procedure is helper procedure to allow processing of sub-options as if
: they were an argument list.
:


process_command_option(args, option, opttable, maptable, finishoption, errproc, nosuboption)

PD:
: process_command_option(args, option, opttable, maptable, finishoption, errproc, nosuboption)
:
:


process_option_string(optstring, flags, nosuboption)

PD:
: process_option_string(optstring, flags, nosuboption)
:
:


xoptions(arg, optstring, errproc, finishoption)

PD:
: xoptions(arg, optstring, errproc, finishoption[])
:
:@param arg                list of strings which represent the arguments given
:@                         to the calling program
:@param optstring          string representing the allowable options and sub-options
:@                         and any required values for those options/sub-options
:@errproc                  error procedure to be used when an error is found in
:@                         the supplied arg list
:@finishoption[]           list of applicable values that can terminate the
:@                         processing of options and values
:@returns                  table containing option/values found in the arg list
:@updates arg              the value of arg is updated by the removal the found
:@                         options/values and by pointer semantics, the value in
:@                         calling procedure
:



This page produced by UniDoc on 2021/04/15 @ 23:59:54.