Improved command line parsing

The first character after control character is now not required to be a letter
This commit is contained in:
mpeterv
2014-02-23 16:15:49 +04:00
parent ad4959b137
commit fc65c85a13
3 changed files with 31 additions and 23 deletions

View File

@@ -23,12 +23,12 @@ describe("tests related to help message generation", function()
it("uses custom help option", function()
local parser = Parser "foo"
:add_help {aliases = {"\\?"}}
:add_help {name = "/?"}
assert.equal(table.concat({
"Usage: foo [\\?]",
"Usage: foo [/?]",
"",
"Options: ",
" \\? Show this help message and exit. "
" /? Show this help message and exit. "
}, "\r\n"), parser:prepare():get_help())
end)

View File

@@ -16,6 +16,14 @@ describe("tests related to options", function()
assert.same({server = "foo"}, args)
end)
it("handles non-standard charset", function()
local parser = Parser()
parser:option "/s"
parser:flag "/?"
local args = parser:parse{"/s", "foo", "/?"}
assert.same({s = "foo", ["?"] = true}, args)
end)
it("handles GNU-style long options", function()
local parser = Parser()
parser:option("-s", "--server")

View File

@@ -267,8 +267,12 @@ function Parser:prepare()
end)
if #self._help_option._aliases == 0 then
if self._help_option._name then
self._help_option._aliases[1] = self._help_option._name
else
self._help_option "-h" "--help"
end
end
if not self._help_option._description then
self._help_option:description "Show this help message and exit. "
@@ -700,26 +704,11 @@ function Parser:_parse(args, errhandler)
first = data:sub(1, 1)
if charset[first] then
if #data > 1 then
if data:sub(2, 2):match "[a-zA-Z]" then
plain = false
for i = 2, #data do
name = first .. data:sub(i, i)
option = get_option(name)
handle_option(name)
if i ~= #data and option._minargs > 0 then
handle_argument(data:sub(i+1))
break
end
end
elseif data:sub(2, 2) == first then
if data:sub(2, 2) == first then
if #data == 2 then
plain = false
handle_options = false
elseif data:sub(3, 3):match "[a-zA-Z]" then
plain = false
else
local equal = data:find "="
if equal then
name = data:sub(1, equal-1)
@@ -733,6 +722,17 @@ function Parser:_parse(args, errhandler)
handle_option(data)
end
end
else
for i = 2, #data do
name = first .. data:sub(i, i)
option = get_option(name)
handle_option(name)
if i ~= #data and option._minargs > 0 then
handle_argument(data:sub(i+1))
break
end
end
end
end
end