[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: avoiding recursion in a dump_table function
 
- From: Anthony Howe <achowe+lua@...>
 
- Date: Wed, 11 May 2011 11:45:47 +0200
 
My version choose not use a seen table, but a __seen__ marker to avoid
cycles.  I suppose this could be simplified a bit with more use of
tostring(). Note this version refers to syslog.debug() instead of
print(). It happily does
	table_dump("_G", _G)
function table_dump(name, table, ...)
    if table == nil then
        return
    end
    local len = 0;
    local indent = arg[1] or ""
    if table.__seen__ then
        syslog.debug(indent..name.." = (seen) ".. tostring(table));
        return
    end
    syslog.debug(indent..name..' '.. tostring(table).." = {")
    for k,v in pairs(table) do
        len = len + 1
        local kt = type(k)
        if not (kt == 'string' or kt == 'number') then
            -- Key might be something like a thread, function, userdata.
            k = tostring(k)
        end
        local vt = type(v)
        if vt == "table" then
            table.__seen__ = true
            table_dump(k, v, indent..' ')
            table.__seen__ = nil
        elseif vt == "string" then
            syslog.debug(indent..' '..k.." = \""..v.."\"")
        elseif vt == "number" then
            syslog.debug(indent..' '..k.." = "..v)
        elseif vt == "boolean" then
            if v then v = "true" else v = "false" end
            syslog.debug(indent..' '..k.." = "..v)
        else
            syslog.debug(indent..' '..k.." = ".. vt);
        end
    end
    if 0 < # table then len = # table end
    syslog.debug(indent.."} -- "..name.." len=".. len)
end
-- 
Anthony C Howe            Skype: SirWumpus                  SnertSoft
                        Twitter: SirWumpus      BarricadeMX & Milters
http://snert.com/      http://nanozen.info/     http://snertsoft.com/