From 88d75a16e5cb83936cc56028ba2490aef6bbfeb1 Mon Sep 17 00:00:00 2001 From: ejlbell Date: Tue, 15 Jan 2008 19:54:23 +0000 Subject: [PATCH] NSElib that provides NSE scripts with a way to output structured tables similar to NmapOutputTable.cc. --- nselib/tab.lua | 103 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 nselib/tab.lua diff --git a/nselib/tab.lua b/nselib/tab.lua new file mode 100644 index 000000000..290f60cbf --- /dev/null +++ b/nselib/tab.lua @@ -0,0 +1,103 @@ +-- See nmaps COPYING for license +module("tab" ,package.seeall) + +--[[ Provide NSE scripts with a way to output structured tables similar to + NmapOutputTable.cc. See end for an example on how to use it. --]] + +require('strbuf') + +--[[ Create and return a new table with a number of columns equal to col and + the row counter set to 1 --]] +function new(cols) + assert(cols > 0) + local table ={} + + table['cols'] = cols + table['rows'] = 1 + setmetatable(table, {__tostring=dump}) + return table +end + +--[[ Add a new string item (v) in a previously initialised table (t) + at column position 'c'. The data will be added to the current + row, if nextrow() hasn't been called yet that will be row 1 --]] +function add(t, c, v) + assert(t) + assert(v) + assert(t['rows']) + assert(t['cols']) + assert(type(v) == "string") + + if c < 1 or c > t['cols'] then + return false + end + + -- 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 + +--[[ 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. --]] +function nextrow(t) + assert(t) + assert(t['rows']) + t['rows'] = t['rows'] + 1 +end + +--[[ Once items have been added to a table, call this to return a + string which contains an equally spaced table. Number of spaces + is based on the largest element of a column with an additional + two spaces for padding --]] +function dump(t) + assert(t) + assert(t['rows']) + assert(t['cols']) + + local col_len = {} + local table = strbuf.new() + local len + + -- find largest string in column + for i=1, t['cols'] do + local max = 0 + for x=1, t['rows'] do + if t[x] == nil then t[x] = {} end + if t[x][i] ~= nil and string.len(t[x][i]) > max then + max = string.len(t[x][i]) + end + end + col_len[i] = max+2 + end + + -- build table with padding so all column elements line up + for i=1,t['rows'] do + for x=1, t['cols'] do + if t[i][x] ~= nil then + length = string.len(t[i][x]) + table = table .. t[i][x] + table = table .. string.rep(' ', col_len[x]-length) + end + end + table = table .. "\n" + end + + return strbuf.dump(table) +end + +--[[ Example Usage + +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) + +--]]