diff options
Diffstat (limited to 'tests/bench/options.icn')
-rw-r--r-- | tests/bench/options.icn | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/tests/bench/options.icn b/tests/bench/options.icn new file mode 100644 index 0000000..ecf5266 --- /dev/null +++ b/tests/bench/options.icn @@ -0,0 +1,74 @@ +############################################################################ +# +# Name: options.icn +# +# Title: Get command-line options +# +# Authors: Robert J. Alexander, June 10, 1988 +# Gregg M. Townsend, 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 |