File options.icn

Summary

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

	File:     options.icn

	Subject:  Procedure to get command-line options

	Authors:  Robert J. Alexander and Gregg M. Townsend

	Date:     May 5, 2000
             Nov 20 2019   Don Ward    Add --options-with-dashes

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

   This file is in the public domain.

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

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

###########################################################################
  
     options(arg,optstring,errproc) -- Get command line options.

     This procedure separates and interprets command options included in 
  the main program argument list.  Option names and values are removed
  from the argument list and returned in a table.

 -----------------------------------------------------------------------
 [Pre Nov 2019 version description: see additional comments at the end]
 
     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.
  
     Options may be freely interspersed with non-option arguments.
  An argument of "-" is treated as a non-option.  The special argument
  "--" terminates option processing.  Non-option arguments are returned
  in the original argument list for interpretation by the caller.

     An argument of the form @filename (a "@" immediately followed
  by a file name) causes options() 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).

     The parameters of options(arg,optstring,errproc) are:
  
       arg         the argument list as passed to the main procedure.

       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%
		    where
			-	introduces the option
			name	is either a string of alphanumerics
				(any of a-z, A-Z, 0-9, and _)
				or any single printable character
			%	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

		    The leading "-" may be omitted for a single-character
		    option.  The "!" flag may be omitted except when
		    needed to terminate a 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 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, options() 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.
  
     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.
 

     Upon return, the option arguments are removed from arg, leaving
  only the non-option arguments.
 
 ---------------------------------------------------------------------------
 [Nov 2019 enhancements]
 
   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).
 
   To remove the leading minus from such keys, make the first character
 of the option string an equals 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 string. The only
 way to allow (for example) both --run and -run as options is to miss out
 the leading equals and to treat option["-run"] and option["run"]
 separately in the calling program.
 e.g.
   "-bish-bash-bosh--bash"   is ok.
   "=-bish-bash-bosh--bash"  results in a "duplicate option --bash" error.
  
   "=-bish-bash-bosh--bish-bash-bosh" is also ok because, in this case,
   the options are
          -bish -bash -bosh and  --bish-bash-bosh
 Because the -- options can swallow succeeding minus characters, it's
 probably better to use spaces to separate arguments, even when not
 needed. In the preceding example, it's much clearer to write
    "= -bish -bash -bosh --bish-bash-bosh"
 
   This version will also accept parameters with an equal sign in them. e.g.
 instead of
     progname -time 45
 you can write
     progname -time=45
 A similar extension is available in the @ file. You can now write
     -time 45
 or
     -time = 45
 instead of two lines
     -time
     45
 as previously.
 
###########################################################################
Procedures:
options

This file is part of the (main) package.

Source code.

Details
Procedures:

options(arg, optstring, errproc)



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