getopt
Simplified getopt, based on Svenne Panne's Haskell GetOpt


TODO: Sort out the packaging. getopt.Option is tedious to type, but
surely Option shouldn't be in the root namespace?
TODO: Wrap all messages; do all wrapping in processArgs, not
usageInfo; use sdoc-like library (see string.format todos)
TODO: Don't require name to be repeated in banner.
TODO: Store version separately (construct banner?).


Usage:


options = Options {Option {...} ...}
getopt.processArgs ()


Assumes prog = {name[, banner] [, purpose] [, notes] [, usage]}


options take a single dash, but may have a double dash
arguments may be given as -opt=arg or -opt arg
if an option taking an argument is given multiple times, only the
last value is returned; missing arguments are returned as 1


getOpt, usageInfo and dieWithUsage can be called directly (see
below, and the example at the end). Set _DEBUG.std to a non-nil
value to run the example.


getOpt: perform argument processing
  argIn: list of command-line args
  options: options table
returns
  argOut: table of remaining non-options
  optOut: table of option key-value list pairs
  errors: table of error messages


Options table type


Options table constructor: adds lookup tables for the option names


Error and usage information formatting


errNoArg: argument when there shouldn't be one
  @paramoptStr: option string
returns
  err: option error


errReqArg: required argument missing
  optStr: option string
  desc: argument description
returns
  err: option error


errUnrec: unrecognized option
  optStr: option string
returns
  err: option error


usageInfo: produce usage info for the given options
  header: header string
  optDesc: option descriptors
  pageWidth: width to format to [78]
returns
  mess: formatted string


dieWithUsage: die emitting a usage message


processArgs: simple getOpt wrapper
adds -version/-v and -help/-h/-? automatically; stops program
if there was an error or -help was used


A small and hopefully enlightening example: