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: