-- https://coronalabs.com/blog/2014/09/02/tutorial-printing-table-contents/ function Auctionator.Utilities.TablePrint( t, name ) if not Auctionator.Debug.IsOn() then return end name = name or 'Unknown' print( '*************** TABLE ' .. name .. ' *****************' ) -- print( 'Utilities.Print', debugstack( 2, 1, 0 ) ) local print_r_cache={} local function sub_print_r(t,indent) if (print_r_cache[tostring(t)]) then print(indent.."*"..tostring(t)) else print_r_cache[tostring(t)]=true if (type(t)=="table") then for pos,val in pairs(t) do if (type(val)=="table") then print(indent.."["..pos.."] => "..tostring(t).." {") sub_print_r(val,indent..string.rep(" ",string.len(pos)+2)) print(indent..string.rep(" ",string.len(pos)).."}") elseif (type(val)=="string") then print(indent.."["..pos..'] => "'..val..'"') else print(indent.."["..pos.."] => "..tostring(val)) end end else print(indent..tostring(t)) end end end if (type(t)=="table") then print(tostring(t).." {") sub_print_r(t," ") print("}") else sub_print_r(t," ") end print() end function Auctionator.Utilities.FlatPrint( t ) local buffer = {} for position, value in pairs( t ) do table.insert( buffer, value ) end print( [[{]] .. table.concat( buffer, ',' ) .. [[}]] ) end function Auctionator.Utilities.UTF8_Truncate( string, options ) options = options or {} local newLength = options.newLength or 127 if string:len() <= newLength then return string end local position, char; for position = newLength, 1, -1 do char = string:byte( position + 1 ) if bit.band( char, 0xC0 ) == 0x80 then return string:sub( 1, position - 1 ) end end end