1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-09 14:11:29 +00:00
Files
nmap/nselib/tab.lua
david 1ee0fae3d1 Insert an empty row table when tab.nextrow is called and there is
nothing in the current row yet. This allows using #t or ipairs to get
the number of rows that have been filled by the user. t.rows is the
index number of the next row that will be filled in, or the one that is
currently being filled in if something has already been entered.
t.rows == #t + 1 means that we've finished with the previous row, but we
don't want to count a new (blank) row until we've started filling
something in.
2010-12-30 21:08:19 +00:00

115 lines
2.8 KiB
Lua

---
-- Arrange output into tables.
--
-- This module provides NSE scripts with a way to output structured tables
-- similar to what <code>NmapOutputTable.cc</code> provides.
--
-- Example usage:
-- <code>
-- local t = tab.new(2)
-- tab.add(t, 1, 'A1')
-- tab.add(t, 2, 'A2')
-- tab.nextrow(t)
-- tab.add(t, 1, 'BBBBBBBBB1')
-- tab.add(t, 2, 'BBB2')
-- tab.dump(t)
-- </code>
-- @copyright Same as Nmap--See http://nmap.org/book/man-legal.html
module(... or "tab",package.seeall)
require('strbuf')
--- Create and return a new table with a given number of columns and
-- the row counter set to 1.
-- @return A new table.
function new()
local table ={}
table['rows'] = 1
setmetatable(table, {__tostring=dump})
return table
end
--- Add a new string item to a table at a given column position.
--
-- The item will be added to the current row. If <code>nextrow</code> hasn't
-- been called yet that will be row 1.
-- @param t The table.
-- @param v The string to add.
-- @param c The column position at which to add the item.
function add(t, c, v)
assert(t)
assert(type(v) == "string")
-- add a new row if one doesn't exist
if t[t['rows']] == nil then
t[t['rows']] = {}
end
t[t['rows']][c] = v
return true
end
--- Add a complete row to the table and move on to the next row.
--
-- Calls <code>add</code> for each argument starting with the second argument
-- and after that calls <code>nextrow</code>.
-- @param t The table.
-- @param ... The elements to add to the row.
function addrow(t, ...)
for i=1, select("#", ...) do
add( t, i, tostring( ( select(i, ...)) ) )
end
nextrow( t )
end
--- Move on to the next row in the table. If this is not called
-- then previous column values will be over-written by subsequent
-- values.
-- @param t The table.
function nextrow(t)
assert(t)
assert(t['rows'])
t[t['rows']] = t[t['rows']] or {}
t['rows'] = t['rows'] + 1
end
--- Return a formatted string representation of the table.
--
-- The number of spaces in a column is based on the largest element in the
-- column with an additional two spaces for padding.
-- @param t The table.
function dump(t)
assert(t)
local column_width = {}
local num_columns = 0
local buf = strbuf.new()
-- find widest element in each column
for i, row in ipairs(t) do
for x, elem in pairs(row) do
local elem_width = string.len(elem)
if not column_width[x] or elem_width > column_width[x] then
column_width[x] = elem_width
end
if x > num_columns then
num_columns = x
end
end
end
-- build buf with padding so all column elements line up
for i, row in ipairs(t) do
local text_row = {}
for x = 1, num_columns do
local elem = row[x] or ""
text_row[#text_row + 1] = elem .. string.rep(" ", column_width[x] - #elem)
end
buf = buf .. table.concat(text_row, " ") .. "\n"
end
return strbuf.dump(buf)
end