From bccd141d838b5bcf87ed94253d434c3057f2176c Mon Sep 17 00:00:00 2001 From: Pinya <800pin.ru@gmail.com> Date: Thu, 13 Dec 2018 19:39:38 +0300 Subject: [PATCH 1/2] fix error message for boolean argument --- !Compatibility/api/luaAPI.lua | 36 +++++++++++++++++------------------ !Compatibility/api/wowAPI.lua | 8 ++++---- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/!Compatibility/api/luaAPI.lua b/!Compatibility/api/luaAPI.lua index 45daf05..5ffb2ac 100644 --- a/!Compatibility/api/luaAPI.lua +++ b/!Compatibility/api/luaAPI.lua @@ -31,8 +31,8 @@ local function toInt(x) return x end function select(n, ...) - if not (type(n) == "number" or (type(n) == "string" and n == "#")) then - error(format("bad argument #1 to 'select' (number expected, got %s)", n and type(n) or "no value"), 2) + if n ~= "#" and type(n) ~= "number" then + error(format("bad argument #1 to 'select' (number expected, got %s)", n ~= nil and type(n) or "no value"), 2) end if n == "#" then @@ -60,7 +60,7 @@ function math.modf(i) i = type(i) ~= "number" and tonumber(i) or i if type(i) ~= "number" then - error(format("bad argument #1 to 'modf' (number expected, got %s)", i and type(i) or "no value"), 2) + error(format("bad argument #1 to 'modf' (number expected, got %s)", i ~= nil and type(i) or "no value"), 2) end if i == 0 then @@ -78,7 +78,7 @@ function math.cosh(i) i = type(i) ~= "number" and tonumber(i) or i if type(i) ~= "number" then - error(format("bad argument #1 to 'cosh' (number expected, got %s)", i and type(i) or "no value"), 2) + error(format("bad argument #1 to 'cosh' (number expected, got %s)", i ~= nil and type(i) or "no value"), 2) end if i < 0 then @@ -105,7 +105,7 @@ function math.sinh(i) i = type(i) ~= "number" and tonumber(i) or i if type(i) ~= "number" then - error(format("bad argument #1 to 'sinh' (number expected, got %s)", i and type(i) or "no value"), 2) + error(format("bad argument #1 to 'sinh' (number expected, got %s)", i ~= nil and type(i) or "no value"), 2) end local neg, x @@ -147,7 +147,7 @@ function math.tanh(i) i = type(i) ~= "number" and tonumber(i) or i if type(i) ~= "number" then - error(format("bad argument #1 to 'tanh' (number expected, got %s)", i and type(i) or "no value"), 2) + error(format("bad argument #1 to 'tanh' (number expected, got %s)", i ~= nil and type(i) or "no value"), 2) end if i == 0 then @@ -175,7 +175,7 @@ end function string.join(delimiter, ...) if type(delimiter) ~= "string" and type(delimiter) ~= "number" then - error(format("bad argument #1 to 'join' (string expected, got %s)", delimiter and type(delimiter) or "no value"), 2) + error(format("bad argument #1 to 'join' (string expected, got %s)", delimiter ~= nil and type(delimiter) or "no value"), 2) end if arg.n == 0 then @@ -188,11 +188,11 @@ strjoin = string.join function string.match(str, pattern, index) if type(str) ~= "string" and type(str) ~= "number" then - error(format("bad argument #1 to 'match' (string expected, got %s)", str and type(str) or "no value"), 2) + error(format("bad argument #1 to 'match' (string expected, got %s)", str ~= nil and type(str) or "no value"), 2) elseif type(pattern) ~= "string" and type(pattern) ~= "number" then - error(format("bad argument #2 to 'match' (string expected, got %s)", pattern and type(pattern) or "no value"), 2) - elseif index and type(index) ~= "number" and (type(index) ~= "string" or index == "") then - error(format("bad argument #3 to 'match' (number expected, got %s)", index and type(index) or "no value"), 2) + error(format("bad argument #2 to 'match' (string expected, got %s)", pattern ~= nil and type(pattern) or "no value"), 2) + elseif index and type(tonumber(index)) ~= "number" then + error(format("bad argument #3 to 'match' (number expected, got %s)", index ~= nil and type(index) or "no value"), 2) end local i1, i2, match, match2 = find(str, pattern, index) @@ -212,7 +212,7 @@ strmatch = string.match function string.reverse(str) if type(str) ~= "string" and type(str) ~= "number" then - error(format("bad argument #1 to 'reverse' (string expected, got %s)", str and type(str) or "no value"), 2) + error(format("bad argument #1 to 'reverse' (string expected, got %s)", str ~= nil and type(str) or "no value"), 2) end local size = len(str) @@ -231,9 +231,9 @@ strrev = string.reverse function string.split(delimiter, str) if type(delimiter) ~= "string" and type(delimiter) ~= "number" then - error(format("bad argument #1 to 'split' (string expected, got %s)", delimiter and type(delimiter) or "no value"), 2) + error(format("bad argument #1 to 'split' (string expected, got %s)", delimiter ~= nil and type(delimiter) or "no value"), 2) elseif type(str) ~= "string" and type(str) ~= "number" then - error(format("bad argument #2 to 'split' (string expected, got %s)", str and type(str) or "no value"), 2) + error(format("bad argument #2 to 'split' (string expected, got %s)", str ~= nil and type(str) or "no value"), 2) end local fields = {} @@ -273,9 +273,9 @@ local escapeSequences = { } function string.trim(str, chars) if type(str) ~= "string" and type(str) ~= "number" then - error(format("bad argument #1 to 'trim' (string expected, got %s)", str and type(str) or "no value"), 2) + error(format("bad argument #1 to 'trim' (string expected, got %s)", str ~= nil and type(str) or "no value"), 2) elseif chars and (type(chars) ~= "string" and type(chars) ~= "number") then - error(format("bad argument #2 to 'trim' (string expected, got %s)", chars and type(chars) or "no value"), 2) + error(format("bad argument #2 to 'trim' (string expected, got %s)", chars ~= nil and type(chars) or "no value"), 2) end if chars then @@ -340,7 +340,7 @@ end function table.maxn(t) if type(t) ~= "table" then - error(format("bad argument #1 to 'maxn' (table expected, got %s)", t and type(t) or "no value"), 2) + error(format("bad argument #1 to 'maxn' (table expected, got %s)", t ~= nil and type(t) or "no value"), 2) end local maxn = 0 @@ -358,7 +358,7 @@ end function table.wipe(t) if type(t) ~= "table" then - error(format("bad argument #1 to 'wipe' (table expected, got %s)", t and type(t) or "no value"), 2) + error(format("bad argument #1 to 'wipe' (table expected, got %s)", t ~= nil and type(t) or "no value"), 2) end for k in pairs(t) do diff --git a/!Compatibility/api/wowAPI.lua b/!Compatibility/api/wowAPI.lua index e4cdb02..056404b 100644 --- a/!Compatibility/api/wowAPI.lua +++ b/!Compatibility/api/wowAPI.lua @@ -209,9 +209,9 @@ end function difftime(time2, time1) if type(time2) ~= "number" then - error(format("bad argument #1 to 'difftime' (number expected, got %s)", time2 and type(time2) or "no value"), 2) + error(format("bad argument #1 to 'difftime' (number expected, got %s)", time2 ~= nil and type(time2) or "no value"), 2) elseif time1 and type(time1) ~= "number" then - error(format("bad argument #2 to 'difftime' (number expected, got %s)", time1 and type(time1) or "no value"), 2) + error(format("bad argument #2 to 'difftime' (number expected, got %s)", time1 ~= nil and type(time1) or "no value"), 2) end return time1 and time2 - time1 or time2 @@ -321,7 +321,7 @@ end function GetMapNameByID(id) if not (type(id) == "string" or type(id) == "number") then - error(format("Bad argument #1 to \"GetMapNameByID\" (number expected, got %s)", id and type(id) or "no value"), 2) + error(format("Bad argument #1 to \"GetMapNameByID\" (number expected, got %s)", id ~= nil and type(id) or "no value"), 2) end return mapByID[tonumber(id)] @@ -382,7 +382,7 @@ end function CreateStatusBarTexturePointer(statusbar) if type(statusbar) ~= "table" then - error(format("Bad argument #1 to \"CreateStatusBarTexturePointer\" (table expected, got %s)", statusbar and type(statusbar) or "no value"), 2) + error(format("Bad argument #1 to \"CreateStatusBarTexturePointer\" (table expected, got %s)", statusbar ~= nil and type(statusbar) or "no value"), 2) elseif not (statusbar.GetObjectType and statusbar:GetObjectType() == "StatusBar") then error("Bad argument #1 to \"CreateStatusBarTexturePointer\" (statusbar object expected)", 2) end From 9c44b68ad14a21d0b850a0fcb489df5b952ca9fb Mon Sep 17 00:00:00 2001 From: Pinya <800pin.ru@gmail.com> Date: Thu, 13 Dec 2018 19:40:15 +0300 Subject: [PATCH 2/2] update string.split and string.trim functions --- !Compatibility/api/luaAPI.lua | 90 ++++++++--------------------------- 1 file changed, 19 insertions(+), 71 deletions(-) diff --git a/!Compatibility/api/luaAPI.lua b/!Compatibility/api/luaAPI.lua index 5ffb2ac..8a66285 100644 --- a/!Compatibility/api/luaAPI.lua +++ b/!Compatibility/api/luaAPI.lua @@ -1,7 +1,6 @@ --Cache global variables local error = error local geterrorhandler = geterrorhandler -local loadstring = loadstring local next = next local pairs = pairs local pcall = pcall @@ -10,7 +9,7 @@ local tostring = tostring local type = type local unpack = unpack local abs, ceil, exp, floor = math.abs, math.ceil, math.exp, math.floor -local find, format, gfind, gsub, len, sub = string.find, string.format, string.gfind, string.gsub, string.len, string.sub +local find, format, gsub, len, sub = string.find, string.format, string.gsub, string.len, string.sub local concat, getn, setn, tremove = table.concat, table.getn, table.setn, table.remove math.fmod = math.mod @@ -229,49 +228,31 @@ function string.reverse(str) end strrev = string.reverse -function string.split(delimiter, str) +local function string_split(delimiter, str, limit) if type(delimiter) ~= "string" and type(delimiter) ~= "number" then error(format("bad argument #1 to 'split' (string expected, got %s)", delimiter ~= nil and type(delimiter) or "no value"), 2) elseif type(str) ~= "string" and type(str) ~= "number" then error(format("bad argument #2 to 'split' (string expected, got %s)", str ~= nil and type(str) or "no value"), 2) + elseif limit and type(tonumber(limit)) ~= "number" then + error(format("bad argument #3 to 'split' (number expected, got %s)", limit ~= nil and type(limit) or "no value"), 2) end - local fields = {} - gsub(str, format("([^%s]+)", delimiter), function(c) fields[getn(fields) + 1] = c end) + limit = tonumber(limit) + if limit and limit <= 1 then + return str + end - return unpack(fields) + local startPos, endPos = find(str, delimiter, 1, true) + if not startPos then + return str + end + + return sub(str, 1, startPos - 1), string_split(delimiter, sub(str, endPos + 1), limit and (limit - 1)) end -strsplit = string.split +string.split = string_split +strsplit = string_split -local escapeSequences = { - ["\a"] = "\\a", -- Bell - ["\b"] = "\\b", -- Backspace - ["\t"] = "\\t", -- Horizontal tab - ["\n"] = "\\n", -- Newline - ["\v"] = "\\v", -- Vertical tab - ["\f"] = "\\f", -- Form feed - ["\r"] = "\\r", -- Carriage return - ["\\"] = "\\\\", -- Backslash - ["\""] = "\\\"", -- Quotation mark - ["|"] = "||", - [" "] = "%s", - - ["!"] = "\\!", - ["#"] = "\\#", - ["$"] = "\\$", - ["%"] = "\\%", - ["&"] = "\\&", - ["'"] = "\\'", - ["("] = "\\(", - [")"] = "\\)", - ["*"] = "\\*", - ["+"] = "\\+", - [","] = "\\,", - ["-"] = "\\-", - ["."] = "\\.", - ["/"] = "\\/" -} -function string.trim(str, chars) +local function string_trim(str, chars) if type(str) ~= "string" and type(str) ~= "number" then error(format("bad argument #1 to 'trim' (string expected, got %s)", str ~= nil and type(str) or "no value"), 2) elseif chars and (type(chars) ~= "string" and type(chars) ~= "number") then @@ -279,42 +260,9 @@ function string.trim(str, chars) end if chars then - local tokens = {} - local size = 0 - - for token in gfind(chars, "[%z\1-\255]") do - size = size + 1 - tokens[size] = token - end - - local pattern = "" - - for i = 1, size do - pattern = pattern..(escapeSequences[tokens[i]] or tokens[i]).."+" - - if i < size then - pattern = pattern.."|" - end - end - - local patternStart = loadstring("return \"^["..pattern.."](.-)$\"")() - local patternEnd = loadstring("return \"^(.-)["..pattern.."]$\"")() - - local trimed, x, y = 1, 1, 1 - while trimed > 0 do - if x > 0 then - str, x = gsub(str, patternStart, "%1") - end - if y > 0 then - str, y = gsub(str, patternEnd, "%1") - end - - trimed = x + y - end - - return str + local pattern = "["..gsub(chars, "([%]%.%^%-%%])", "%%%1").."]*" + return gsub(gsub(str, "^"..pattern, ""), pattern.."$", "") elseif type(str) == "string" then - -- remove leading/trailing [space][tab][return][newline] return gsub(str, "^%s*(.-)%s*$", "%1") else return tostring(str)