mirror of
https://github.com/koreader/koreader
synced 2024-10-31 21:20:20 +00:00
167 lines
3.9 KiB
Lua
167 lines
3.9 KiB
Lua
|
-- Copyright (c) 2009 Aleksey Cheusov <vle@gmx.net>
|
||
|
--
|
||
|
-- Permission is hereby granted, free of charge, to any person obtaining
|
||
|
-- a copy of this software and associated documentation files (the
|
||
|
-- "Software"), to deal in the Software without restriction, including
|
||
|
-- without limitation the rights to use, copy, modify, merge, publish,
|
||
|
-- distribute, sublicense, and/or sell copies of the Software, and to
|
||
|
-- permit persons to whom the Software is furnished to do so, subject to
|
||
|
-- the following conditions:
|
||
|
--
|
||
|
-- The above copyright notice and this permission notice shall be
|
||
|
-- included in all copies or substantial portions of the Software.
|
||
|
--
|
||
|
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||
|
-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||
|
-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||
|
-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||
|
-- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||
|
-- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||
|
-- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||
|
|
||
|
local type, pairs, ipairs, io, os = type, pairs, ipairs, io, os
|
||
|
|
||
|
module ("alt_getopt")
|
||
|
|
||
|
local function convert_short2long (opts)
|
||
|
local i = 1
|
||
|
local len = #opts
|
||
|
local ret = {}
|
||
|
|
||
|
for short_opt, accept_arg in opts:gmatch("(%w)(:?)") do
|
||
|
ret[short_opt]=#accept_arg
|
||
|
end
|
||
|
|
||
|
return ret
|
||
|
end
|
||
|
|
||
|
local function exit_with_error (msg, exit_status)
|
||
|
io.stderr:write (msg)
|
||
|
os.exit (exit_status)
|
||
|
end
|
||
|
|
||
|
local function err_unknown_opt (opt)
|
||
|
exit_with_error ("Unknown option `-" ..
|
||
|
(#opt > 1 and "-" or "") .. opt .. "'\n", 1)
|
||
|
end
|
||
|
|
||
|
local function canonize (options, opt)
|
||
|
if not options [opt] then
|
||
|
err_unknown_opt (opt)
|
||
|
end
|
||
|
|
||
|
while type (options [opt]) == "string" do
|
||
|
opt = options [opt]
|
||
|
|
||
|
if not options [opt] then
|
||
|
err_unknown_opt (opt)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return opt
|
||
|
end
|
||
|
|
||
|
function get_ordered_opts (arg, sh_opts, long_opts)
|
||
|
local i = 1
|
||
|
local count = 1
|
||
|
local opts = {}
|
||
|
local optarg = {}
|
||
|
|
||
|
local options = convert_short2long (sh_opts)
|
||
|
for k,v in pairs (long_opts) do
|
||
|
options [k] = v
|
||
|
end
|
||
|
|
||
|
while i <= #arg do
|
||
|
local a = arg [i]
|
||
|
|
||
|
if a == "--" then
|
||
|
i = i + 1
|
||
|
break
|
||
|
|
||
|
elseif a == "-" then
|
||
|
break
|
||
|
|
||
|
elseif a:sub (1, 2) == "--" then
|
||
|
local pos = a:find ("=", 1, true)
|
||
|
|
||
|
if pos then
|
||
|
local opt = a:sub (3, pos-1)
|
||
|
|
||
|
opt = canonize (options, opt)
|
||
|
|
||
|
if options [opt] == 0 then
|
||
|
exit_with_error ("Bad usage of option `" .. a .. "'\n", 1)
|
||
|
end
|
||
|
|
||
|
optarg [count] = a:sub (pos+1)
|
||
|
opts [count] = opt
|
||
|
else
|
||
|
local opt = a:sub (3)
|
||
|
|
||
|
opt = canonize (options, opt)
|
||
|
|
||
|
if options [opt] == 0 then
|
||
|
opts [count] = opt
|
||
|
else
|
||
|
if i == #arg then
|
||
|
exit_with_error ("Missed value for option `" .. a .. "'\n", 1)
|
||
|
end
|
||
|
|
||
|
optarg [count] = arg [i+1]
|
||
|
opts [count] = opt
|
||
|
i = i + 1
|
||
|
end
|
||
|
end
|
||
|
count = count + 1
|
||
|
|
||
|
elseif a:sub (1, 1) == "-" then
|
||
|
local j
|
||
|
for j=2,a:len () do
|
||
|
local opt = canonize (options, a:sub (j, j))
|
||
|
|
||
|
if options [opt] == 0 then
|
||
|
opts [count] = opt
|
||
|
count = count + 1
|
||
|
elseif a:len () == j then
|
||
|
if i == #arg then
|
||
|
exit_with_error ("Missed value for option `-" .. opt .. "'\n", 1)
|
||
|
end
|
||
|
|
||
|
optarg [count] = arg [i+1]
|
||
|
opts [count] = opt
|
||
|
i = i + 1
|
||
|
count = count + 1
|
||
|
break
|
||
|
else
|
||
|
optarg [count] = a:sub (j+1)
|
||
|
opts [count] = opt
|
||
|
count = count + 1
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
break
|
||
|
end
|
||
|
|
||
|
i = i + 1
|
||
|
end
|
||
|
|
||
|
return opts,i,optarg
|
||
|
end
|
||
|
|
||
|
function get_opts (arg, sh_opts, long_opts)
|
||
|
local ret = {}
|
||
|
|
||
|
local opts,optind,optarg = get_ordered_opts (arg, sh_opts, long_opts)
|
||
|
for i,v in ipairs (opts) do
|
||
|
if optarg [i] then
|
||
|
ret [v] = optarg [i]
|
||
|
else
|
||
|
ret [v] = 1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return ret,optind
|
||
|
end
|