All pastes #386467 Raw Edit

Lua eval() function

public lua v1 · immutable
·published 2007-03-08 17:17 UTC
rendered paste body
sandbox = sandbox or { ai = { patterns = {} }};function eval(e, ex)	if not e:match("^[%a%d%p%s]+$") then print(e.." does not match\n\n"); return false, "Send me some real Lua, eh?"; end	local chunk, errmsg = loadstring("return "..e);	array = table;	if not chunk then 		chunk, errmsg = loadstring(e);		if chunk and ex and (not ex.allow_functions) then			return false, "That's something I could not allow to happen.";		end	if not chunk then return false, "Syntax error: "..errmsg; end	end		for k, v in pairs(math) do sandbox[k] = v end	for k, v in pairs(string) do sandbox[k] = v end	if ex and ex.data then		for k, v in pairs(ex.data) do sandbox[k] = v end	end	sandbox.dump = nil;	sandbox.array = array;	sandbox.table = table;	sandbox.time = os.time;	sandbox.difftime = os.difftime;	sandbox.clock = os.clock;	sandbox.date = os.date;	sandbox.RAM = MemUsage;	sandbox.tostring = tostring;	sandbox.tonumber = tonumber;	sandbox.select = select;	sandbox.type = type;	sandbox.unpack = unpack;	sandbox.print = function (a) return a; end	sandbox.pairs = pairs;	sandbox.ipairs = ipairs;	sandbox.assert = assert;	sandbox.count = table.fieldcount;		if ex and ex.allow_mtaccess then		sandbox.setmetatable = setmetatable;		sandbox.getmetatable = getmetatable;	end			setfenv(chunk, sandbox)	sandbox["sandbox"] = sandbox;		StartTime = os.time();	debug.sethook(NewWatchdog(),"", 10);		results = { pcall(chunk) };	debug.sethook(); -- Remove hook	StartTime = nil;	if not results[1] then		return false, "Error: "..results[2], "error";	end	table.remove(results, 1); -- Remove status code	if #results == 0 then return nil, ChooseResponse("{Done :)}{Done}{Ok}{That's done}{As you wish}"); end	for k, v in ipairs(results) do results[k] = tostring(v); end	return true, table.concat(results, ", ");endfunction NewWatchdog(tim)	local StartTime = os.time();	local MaxRunTime = 2;	return function ()		-- This is a debug hook, to ensure functions run in the sandbox end within n seconds		-- if StartTime == nil then print("StartTime is nil"); StartTime = os.time(); end--		print("Hook time: "..os.difftime(StartTime, os.time()))		if os.difftime(os.time(),StartTime) > MaxRunTime then			debug.sethook();			error("Sorry, the function ran too long, unable to complete", 2); end		if MemUsage() > (1024 * 2) then -- 2MB			debug.sethook();			error("Sorry, I am not allowed to use that much memory. Please try more efficient code ;)", 2); end	endend