mirror of
https://github.com/nmap/nmap.git
synced 2025-12-20 14:39:02 +00:00
Updated strbuf.lua
This commit is contained in:
@@ -1,9 +1,22 @@
|
|||||||
-- license = "See nmaps COPYING for license"
|
-- license = "See nmaps COPYING for license"
|
||||||
module("strbuf" ,package.seeall)
|
|
||||||
|
-- DEPENDENCIES --
|
||||||
|
|
||||||
|
local getmetatable = getmetatable;
|
||||||
|
local setmetatable = setmetatable;
|
||||||
|
local type = type;
|
||||||
|
local error = error;
|
||||||
|
local ipairs = ipairs;
|
||||||
|
local pairs = pairs;
|
||||||
|
local concat = table.concat;
|
||||||
|
|
||||||
|
|
||||||
|
module("strbuf");
|
||||||
|
|
||||||
-- String buffer functions. Concatenation is not efficient in
|
-- String buffer functions. Concatenation is not efficient in
|
||||||
-- lua as strings are immutable. If a large amount of '..'
|
-- lua as strings are immutable. If a large amount of '..' sequential
|
||||||
-- operations are needed a string buffer should be used instead
|
-- operations are needed a string buffer should be used instead
|
||||||
|
-- e.g. for i = 1, 10 do s = s..i end
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
local buf = strbuf.new()
|
local buf = strbuf.new()
|
||||||
@@ -21,64 +34,52 @@ module("strbuf" ,package.seeall)
|
|||||||
strbuf.clear(buf)
|
strbuf.clear(buf)
|
||||||
--]]
|
--]]
|
||||||
|
|
||||||
|
dump = concat;
|
||||||
|
|
||||||
|
function concatbuf(sbuf, s)
|
||||||
dump = table.concat
|
|
||||||
|
|
||||||
concatbuf =function(sbuf, s)
|
|
||||||
if sbuf == s then
|
|
||||||
error("refusing to concat the same buffer (recursion)!")
|
|
||||||
end
|
|
||||||
if getmetatable(sbuf) ~= mt then
|
|
||||||
error("left-hand operand of the concat operation has to be a strbuf!")
|
|
||||||
end
|
|
||||||
if type(s) == "string" then
|
if type(s) == "string" then
|
||||||
table.insert(sbuf, s)
|
sbuf[#sbuf+1] = s;
|
||||||
elseif getmetatable(s) == mt then
|
elseif getmetatable(s) == getmetatable(sbuf) then
|
||||||
for _,v in ipairs(s) do
|
for _,v in ipairs(s) do
|
||||||
table.insert(sbuf, v)
|
sbuf[#sbuf+1] = v;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
error("right-hand operand of concat has to be either string or strbuf!")
|
error("bad #2 operand to strbuf concat operation", 2);
|
||||||
end
|
end
|
||||||
return sbuf
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local eqbuf = function(sbuf1, sbuf2)
|
function eqbuf(sbuf1, sbuf2)
|
||||||
if getmetatable(sbuf1) ~= mt then
|
|
||||||
error("equal function expects a value of type strbuf as left-hand operand")
|
|
||||||
end
|
|
||||||
if getmetatable(sbuf1) ~= getmetatable(sbuf2) then
|
if getmetatable(sbuf1) ~= getmetatable(sbuf2) then
|
||||||
return false
|
error("one or more operands is not a string buffer", 2);
|
||||||
end
|
elseif #sbuf1 ~= #sbuf2 then
|
||||||
|
return false;
|
||||||
if #sbuf1 ~= #sbuf2 then
|
else
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
for i = 1, #sbuf1 do
|
for i = 1, #sbuf1 do
|
||||||
if sbuf1[i] ~= sbuf2[i] then
|
if sbuf1[i] ~= sbuf2[i] then
|
||||||
return false
|
return false;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return true
|
return true;
|
||||||
end
|
|
||||||
clear = function(sbuf)
|
|
||||||
for i, v in pairs(sbuf) do
|
|
||||||
sbuf[i] = nil
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
mt = { __concat = concatbuf, __tostring = function(s) return dump(s, '\n') end , __eq=eqbuf}
|
function clear(sbuf)
|
||||||
|
for k in pairs(sbuf) do
|
||||||
new = function(val)
|
sbuf[k] = nil;
|
||||||
local tmp ={}
|
|
||||||
setmetatable(tmp, mt)
|
|
||||||
if val ~=nil then
|
|
||||||
table.insert(tmp, val)
|
|
||||||
end
|
end
|
||||||
return tmp
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function tostring(sbuf)
|
||||||
|
return concat(sbuf, "\n");
|
||||||
|
end
|
||||||
|
|
||||||
|
local mt = {
|
||||||
|
__concat = concatbuf,
|
||||||
|
__tostring = tostring,
|
||||||
|
__eq = eqbuf,
|
||||||
|
__index = _M,
|
||||||
|
};
|
||||||
|
|
||||||
|
function new(...)
|
||||||
|
return setmetatable({...}, mt);
|
||||||
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user