|
Packit |
437b5e |
--[[
|
|
Packit |
437b5e |
POSIX library for Lua 5.1, 5.2 & 5.3.
|
|
Packit |
437b5e |
(c) Gary V. Vaughan <gary@vaughan.pe>, 2014-2015
|
|
Packit |
437b5e |
]]
|
|
Packit |
437b5e |
--[[--
|
|
Packit |
437b5e |
Private argument checking helpers.
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
Undocumented internal helpers for argcheck wrapping.
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
@module posix._checkarg
|
|
Packit |
437b5e |
]]
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function argerror (name, i, extramsg, level)
|
|
Packit |
437b5e |
level = level or 1
|
|
Packit |
437b5e |
local s = string.format ("bad argument #%d to '%s'", i, name)
|
|
Packit |
437b5e |
if extramsg ~= nil then
|
|
Packit |
437b5e |
s = s .. " (" .. extramsg .. ")"
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
error (s, level + 1)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function toomanyargerror (name, expected, got, level)
|
|
Packit |
437b5e |
level = level or 1
|
|
Packit |
437b5e |
local fmt = "no more than %d argument%s expected, got %d"
|
|
Packit |
437b5e |
argerror (name, expected + 1,
|
|
Packit |
437b5e |
fmt:format (expected, expected == 1 and "" or "s", got), level + 1)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function argtypeerror (name, i, expect, actual, level)
|
|
Packit |
437b5e |
level = level or 1
|
|
Packit |
437b5e |
local fmt = "%s expected, got %s"
|
|
Packit |
437b5e |
argerror (name, i,
|
|
Packit |
437b5e |
fmt:format (expect, type (actual):gsub ("nil", "no value")), level + 1)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function badoption (name, i, what, option, level)
|
|
Packit |
437b5e |
level = level or 1
|
|
Packit |
437b5e |
local fmt = "invalid %s option '%s'"
|
|
Packit |
437b5e |
argerror (name, i, fmt:format (what, option), level + 1)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function checkint (name, i, actual, level)
|
|
Packit |
437b5e |
level = level or 1
|
|
Packit |
437b5e |
if type (actual) ~= "number" then
|
|
Packit |
437b5e |
argtypeerror (name, i, "int", actual, level + 1)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
return actual
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function checkstring (name, i, actual, level)
|
|
Packit |
437b5e |
level = level or 1
|
|
Packit |
437b5e |
if type (actual) ~= "string" then
|
|
Packit |
437b5e |
argtypeerror (name, i, "string", actual, level + 1)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
return actual
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function checkselection (fname, argi, fields, level)
|
|
Packit |
437b5e |
level = level or 1
|
|
Packit |
437b5e |
local field1, type1 = fields[1], type (fields[1])
|
|
Packit |
437b5e |
if type1 == "table" and #fields > 1 then
|
|
Packit |
437b5e |
toomanyargerror (fname, argi, #fields + argi - 1, level + 1)
|
|
Packit |
437b5e |
elseif field1 ~= nil and type1 ~= "table" and type1 ~= "string" then
|
|
Packit |
437b5e |
argtypeerror (fname, argi, "table, string or nil", field1, level + 1)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
for i = 2, #fields do
|
|
Packit |
437b5e |
checkstring (fname, i + argi - 1, fields[i], level + 1)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function checktable (name, i, actual, level)
|
|
Packit |
437b5e |
level = level or 1
|
|
Packit |
437b5e |
if type (actual) ~= "table" then
|
|
Packit |
437b5e |
argtypeerror (name, i, "table", actual, level + 1)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
return actual
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function optint (name, i, actual, def, level)
|
|
Packit |
437b5e |
level = level or 1
|
|
Packit |
437b5e |
if actual ~= nil and type (actual) ~= "number" then
|
|
Packit |
437b5e |
argtypeerror (name, i, "int or nil", actual, level + 1)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
return actual or def
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function optstring (name, i, actual, def, level)
|
|
Packit |
437b5e |
level = level or 1
|
|
Packit |
437b5e |
if actual ~= nil and type (actual) ~= "string" then
|
|
Packit |
437b5e |
argtypeerror (name, i, "string or nil", actual, level + 1)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
return actual or def
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function opttable (name, i, actual, def, level)
|
|
Packit |
437b5e |
level = level or 1
|
|
Packit |
437b5e |
if actual ~= nil and type (actual) ~= "table" then
|
|
Packit |
437b5e |
argtypeerror (name, i, "table or nil", actual, level + 1)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
return actual or def
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
return {
|
|
Packit |
437b5e |
argerror = argerror,
|
|
Packit |
437b5e |
argtypeerror = argtypeerror,
|
|
Packit |
437b5e |
badoption = badoption,
|
|
Packit |
437b5e |
checkint = checkint,
|
|
Packit |
437b5e |
checkselection = checkselection,
|
|
Packit |
437b5e |
checkstring = checkstring,
|
|
Packit |
437b5e |
checktable = checktable,
|
|
Packit |
437b5e |
optint = optint,
|
|
Packit |
437b5e |
optstring = optstring,
|
|
Packit |
437b5e |
opttable = opttable,
|
|
Packit |
437b5e |
toomanyargerror = toomanyargerror,
|
|
Packit |
437b5e |
}
|