1
0
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:
batrick
2008-06-08 07:22:14 +00:00
parent b8d8702dda
commit 06da4ac2ed

View File

@@ -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 if type(s) == "string" then
sbuf[#sbuf+1] = s;
concatbuf =function(sbuf, s) elseif getmetatable(s) == getmetatable(sbuf) then
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
table.insert(sbuf, s)
elseif getmetatable(s) == mt 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 for i = 1, #sbuf1 do
end
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