OpenSDE Framework (without history before r20070)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

172 lines
3.8 KiB

-- --- T2-COPYRIGHT-NOTE-BEGIN ---
-- This copyright note is auto-generated by ./scripts/Create-CopyPatch.
--
-- T2 SDE: misc/lua/sde/getopt.lua
-- Copyright (C) 2005 - 2006 The T2 SDE Project
-- Copyright (C) 2005 - 2006 Juergen "George" Sawinski
--
-- More information can be found in the files COPYING and README.
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; version 2 of the License. A copy of the
-- GNU General Public License can be found in the file COPYING.
-- --- T2-COPYRIGHT-NOTE-END ---
-- TODO:
-- - add boolean option argument types
-- - maybe other types needed ?
-- DESCRIPTION:
-- opts,args,err = getopt(arg-list, option-definition)
-- Parses the "arg-list" according to "option-definition" and
-- returns the parsed options "opts", additional arguments "args" and
-- possibly an error.
--
-- Option definition format:
-- key Option key (e.g. key = "help")
-- option String or list of options (e.g. option = {"-h", "--help"})
-- default Default value (e.g. default = false)
-- argument This option has no argument (ARG.none), a required
-- argument (ARG.required) or an optional argument (ARG.optional)
-- flag The option is flagged:
-- number (OPT.number)
-- incremental (OPT.incremental)
-- Example: see below
ARG = {
none = 0,
required = 1,
optional = 2
}
OPT = {
none = 0,
string = 0,
number = 1,
--boolean = 2,
incremental = 10,
}
function getopt(args,def)
local opt = {}
local arg = {}
local nargs = table.getn(args)
-- first pass: defaults
for _,d in pairs(def) do
if d.default ~= nil then
opt[d.key] = d.default
end
end
-- Second pass: parse arguments
local i=1
repeat
for _,d in pairs(def) do
local found = false
-- FIXME is there some shorter version for this:
if type(d.option) == "string" then
if d.option == args[i] then found=true end
else
for k=1,table.getn(d.option) do
if d.option[k] == args[i] then
found = true
end
end
end
-- process option and arguments
if found then
local val = true
local nextisopt = false
local havearg = false
-- check if next is an argument (not option)
if args[i+1] and string.sub(args[i+1],1,1) == "-" then
nextisopt = true
end
-- option argument ?
if nextisopt and d.argument == ARG.required then
return nil, nil, "Missing option argument for `" .. args[i] .. "'"
end
if not nextisopt and
(d.argument == ARG.required
or d.argument == ARG.optional) then
args[i] = nil
i = i+1
val = args[i]
havearg = true
end
-- flags ?
if d.flag then
if d.flag == OPT.number then
val = tonumber(val)
elseif d.flag == OPT.incremental then
val = opt[d.key] + 1
end
end
-- finally assign value
opt[d.key] = val
-- remove key from list (see third pass)
args[i] = nil
end
end
i=i+1
until i>nargs
-- Third pass: check option, sort arguments
for i=1,nargs do
if args[i] then
if string.sub(args[i],1,1) == "-" then
return nil, nil, "Unrecognized option `" .. args[i] .. "'"
else
table.insert(arg, args[i])
end
end
end
-- done
return opt,arg
end
-- EXAMPLE
if false then
opt,arg,err = getopt(arg, {
{
key = "help",
option = { "-h", "-help", "--help" },
},
{
key = "verbose",
option = { "-v", "-verbose", "--verbose" },
default = 0,
flag = OPT.incremental
},
})
if not opt then
print "ERR:"
print(err)
os.exit(-1)
end
print "OPTS:"
for k,v in pairs(opt) do
print("",k,v)
end
print "ARGS:"
for k,v in pairs(arg) do
print("",k,v)
end
end