mirror of
https://github.com/nmap/nmap.git
synced 2025-12-06 04:31:29 +00:00
85 lines
2.0 KiB
Lua
85 lines
2.0 KiB
Lua
-- license = "See nmaps COPYING for license"
|
|
module("strbuf" ,package.seeall)
|
|
|
|
-- String buffer functions. Concatenation is not efficient in
|
|
-- lua as strings are immutable. If a large amount of '..'
|
|
-- operations are needed a string buffer should be used instead
|
|
|
|
--[[
|
|
local buf = strbuf.new()
|
|
-- from here buf may be used like a string for concatenation operations
|
|
-- (the lefthand-operand has to be a strbuf, the righthand-operand may be
|
|
-- a string or a strbuf)
|
|
-- alternativly you can assign a value (which will become the first string
|
|
-- inside the buffer) with new
|
|
local buf2 = strbuf.new('hello')
|
|
buf = buf .. 'string'
|
|
buf = buf .. 'data'
|
|
print(buf) -- default seperator is a new line
|
|
print(strbuf.dump(buf)) -- no seperator
|
|
print(strbuf.dump(buf, ' ')) -- seperated by spaces
|
|
strbuf.clear(buf)
|
|
--]]
|
|
|
|
|
|
|
|
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
|
|
table.insert(sbuf, s)
|
|
elseif getmetatable(s) == mt then
|
|
for _,v in ipairs(s) do
|
|
table.insert(sbuf, v)
|
|
end
|
|
else
|
|
error("right-hand operand of concat has to be either string or strbuf!")
|
|
end
|
|
return sbuf
|
|
end
|
|
|
|
local eqbuf = function(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
|
|
return false
|
|
end
|
|
|
|
if #sbuf1 ~= #sbuf2 then
|
|
return false
|
|
end
|
|
|
|
for i=1, #sbuf1 do
|
|
if sbuf1[i] ~= sbuf2[i] then
|
|
return false
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
clear = function(sbuf)
|
|
for i, v in pairs(sbuf) do
|
|
sbuf[i] = nil
|
|
end
|
|
end
|
|
|
|
mt = { __concat = concatbuf, __tostring = function(s) return dump(s, '\n') end , __eq=eqbuf}
|
|
|
|
new = function(val)
|
|
local tmp ={}
|
|
setmetatable(tmp, mt)
|
|
if val ~=nil then
|
|
table.insert(tmp, val)
|
|
end
|
|
return tmp
|
|
end
|
|
|
|
|
|
|