home *** CD-ROM | disk | FTP | other *** search
- ############################################################################
- #
- # Name: options.icn
- #
- # Title: Get command-line options
- #
- # Authors: Robert J. Alexander and Gregg M. Townsend
- #
- # Date: November 9, 1989
- #
- ############################################################################
- #
- # options(arg,optstring) -- Get command line options.
- #
- # This procedure analyzes the -options on the command line
- # invoking an Icon program. The inputs are:
- #
- # arg the argument list as passed to the main procedure.
- #
- # optstring a string of allowable option letters. If a
- # letter is followed by ":" the corresponding
- # option is assumed to be followed by a string of
- # data, optionally separated from the letter by
- # space. If instead of ":" the letter is followed
- # by a "+", the parameter will converted to an
- # integer; if a ".", converted to a real. If opt-
- # string is omitted any letter is assumed to be
- # valid and require no data.
- #
- # It returns a table containing the options that were specified.
- # The keys are the specified option letters. The assigned values are
- # the data words following the options, if any, or 1 if the option
- # has no data. The table's default value is &null.
- #
- # If an error is detected, stop() is called with an appropriate
- # error message.
- #
- # 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.
- #
- ############################################################################
-
- procedure options(arg,optstring)
- local x,i,c,otab,flist,o,p
- /optstring := string(&letters)
- otab := table()
- flist := []
- while x := get(arg) do
- x ? {
- if ="-" & not pos(0) then {
- if ="-" & pos(0) then break
- while c := move(1) do
- if i := find(c,optstring) + 1 then
- otab[c] :=
- if any(':+.',o := optstring[i]) then {
- p := "" ~== tab(0) | get(arg) |
- stop("No parameter following -",c)
- case o of {
- ":": p
- "+": integer(p) |
- stop("-",c," needs numeric parameter")
- ".": real(p) |
- stop("-",c," needs numeric parameter")
- }
- }
- else 1
- else stop("Unrecognized option: -",c)
- }
- else put(flist,x)
- }
- while push(arg,pull(flist))
- return otab
- end
-