193 lines
5.8 KiB
Lua
193 lines
5.8 KiB
Lua
--mercilessly stolen from LIKO-12, a much better FC made in LOVE
|
|
--MIT Licensed so it's okay though
|
|
--https://github.com/RamiLego4Game/LIKO-12/blob/master/Engine/sandbox.lua
|
|
|
|
--A function that creates new sandboxed global environment.
|
|
|
|
local bit = require("bit")
|
|
local utf8 = require("utf8")
|
|
|
|
local _LuaBCHeader = string.char(0x1B).."LJ"
|
|
|
|
return function(parent)
|
|
local GLOB = {
|
|
assert=assert,
|
|
error=error,
|
|
ipairs=ipairs,
|
|
pairs=pairs,
|
|
next=next,
|
|
pcall=pcall,
|
|
select=select,
|
|
tonumber=tonumber,
|
|
tostring=tostring,
|
|
type=type,
|
|
unpack=unpack,
|
|
_VERSION=_VERSION,
|
|
xpcall=xpcall,
|
|
setmetatable=setmetatable,
|
|
getmetatable=getmetatable,
|
|
rawget = rawget,
|
|
rawset = rawset,
|
|
rawequal = rawequal,
|
|
string={
|
|
byte=string.byte,
|
|
char=string.char,
|
|
find=string.find,
|
|
format=string.format,
|
|
gmatch=string.gmatch,
|
|
gsub=string.gsub,
|
|
len=string.len,
|
|
lower=string.lower,
|
|
match=string.match,
|
|
rep=string.rep,
|
|
reverse=string.reverse,
|
|
sub=string.sub,
|
|
upper=string.upper
|
|
},
|
|
table={
|
|
insert=table.insert,
|
|
maxn=table.maxn,
|
|
remove=table.remove,
|
|
sort=table.sort,
|
|
concat=table.concat
|
|
},
|
|
math={
|
|
abs=math.abs,
|
|
acos=math.acos,
|
|
asin=math.asin,
|
|
atan=math.atan,
|
|
atan2=math.atan2,
|
|
ceil=math.ceil,
|
|
cos=math.cos,
|
|
cosh=math.cosh,
|
|
deg=math.deg,
|
|
exp=math.exp,
|
|
floor=math.floor,
|
|
fmod=math.fmod,
|
|
frexp=math.frexp,
|
|
huge=math.huge,
|
|
ldexp=math.ldexp,
|
|
log=math.log,
|
|
log10=math.log10,
|
|
max=math.max,
|
|
min=math.min,
|
|
modf=math.modf,
|
|
pi=math.pi,
|
|
pow=math.pow,
|
|
rad=math.rad,
|
|
random=math.random,
|
|
randomseed=math.randomseed,
|
|
sin=math.sin,
|
|
sinh=math.sinh,
|
|
sqrt=math.sqrt,
|
|
tan=math.tan,
|
|
tanh=math.tanh,
|
|
noise = math.noise,
|
|
b64enc = function(rawstr) return love.data.encode("string","base64",rawstr) end,
|
|
b64dec = function(rawstr) return love.data.decode("string","base64",rawstr) end,
|
|
hexenc = function(rawstr) return love.data.encode("string","hex",rawstr) end,
|
|
hexdec = function(rawstr) return love.data.decode("string","hex",rawstr) end,
|
|
compress = function(rawstr,format,lvl) return love.data.compress("string",format or "lz4",rawstr,lvl or -1) end,
|
|
decompress = function(rawstr,format) return love.data.decompress("string",format or "lz4",rawstr) end,
|
|
hash = function(hashfunction,rawstr)
|
|
local ok, err = pcall(love.data.hash,hashfunction,rawstr)
|
|
if ok then return err
|
|
else return error(err) end
|
|
end,
|
|
isConvex = math.isConvex,
|
|
triangulate = math.triangulate,
|
|
randomNormal = math.randomNormal
|
|
},
|
|
coroutine={
|
|
create = coroutine.create,
|
|
resume = coroutine.resume,
|
|
yield = coroutine.yield,
|
|
status = coroutine.status
|
|
},
|
|
os={
|
|
time=os.time,
|
|
clock=os.clock,
|
|
date=os.date
|
|
},
|
|
bit={
|
|
cast=bit.cast,
|
|
bnot=bit.bnot,
|
|
band=bit.band,
|
|
bor=bit.bor,
|
|
bxor=bit.bxor,
|
|
lshift=bit.lshift,
|
|
rshift=bit.rshift,
|
|
arshift=bit.arshift,
|
|
tobit=bit.tobit,
|
|
tohex=bit.tohex,
|
|
rol=bit.rol,
|
|
ror=bit.ror,
|
|
bswap=bit.swap
|
|
},
|
|
utf8={
|
|
char=utf8.char,
|
|
charpattern=utf8.charpattern,
|
|
codes=utf8.codes,
|
|
codepoint=utf8.codepoint,
|
|
len=utf8.len,
|
|
offset=utf8.offset
|
|
}
|
|
}
|
|
GLOB.getfenv = function(f)
|
|
if type(f) ~= "function" then return error("bad argument #1 to 'getfenv' (function expected, got "..type(f)) end
|
|
local ok, env = pcall(getfenv,f)
|
|
if not ok then return error(env) end
|
|
if env.love == love then env = {} end --Protection
|
|
return env
|
|
end
|
|
GLOB.setfenv = function(f,env)
|
|
if type(f) ~= "function" then return error("bad argument #1 to 'setfenv' (function expected, got "..type(f)) end
|
|
if type(env) ~= "table" then return error("bad argument #2 to 'setfenv' (table expected, got "..type(env)) end
|
|
local oldenv = getfenv(f)
|
|
if oldenv.love == love then return end --Trying to make a crash ! evil.
|
|
local ok, err = pcall(setfenv,f,env)
|
|
if not ok then return error(err) end
|
|
end
|
|
GLOB.loadstring = function(data,chunkname)
|
|
if data:sub(1,3) == _LuaBCHeader then return error("LOADING BYTECODE IS NOT ALLOWED, YOU HACKER !") end
|
|
if chunkname and type(chunkname) ~= "string" then return error("Chunk name must be a string or a nil, provided: "..type(chunkname)) end
|
|
local chunk, err = loadstring(data,chunkname)
|
|
if not chunk then return nil, err end
|
|
setfenv(chunk,GLOB)
|
|
return chunk
|
|
end
|
|
GLOB.load = function(iter,chunkname)
|
|
if type(iter) ~= "string" then return error("Iterator must be a function, provided: "..type(iter)) end
|
|
if chunkname and type(chunkname) ~= "string" then return error("Chunk name must be a string or a nil, provided: "..type(chunkname)) end
|
|
local firstline = iter()
|
|
if firstline:sub(1,3) == _LuaBCHeader then return error("LOADING BYTECODE IS NOT ALLOWED, YOU HACKER !") end
|
|
local newiter = function()
|
|
if firstline then
|
|
local l = firstline
|
|
firstline = nil
|
|
return l
|
|
end
|
|
return iter()
|
|
end
|
|
|
|
return load(newiter,chunkname)
|
|
end
|
|
GLOB.coroutine.sethook = function(co,...)
|
|
--DEPRICATED--
|
|
|
|
--Coroutine hooks are useless because of LuaJIT
|
|
|
|
--[[if type(co) ~= "thread" then return error("bad argument #1 (thread expected, got "..type(co)..")") end
|
|
local ok, err = pcall(debug.sethook,co,...)
|
|
if not ok then return error(err) end
|
|
return err]]
|
|
end
|
|
GLOB.coroutine.running = function()
|
|
local curco = coroutine.running()
|
|
if parent and parent.co and curco == parent.co then return end
|
|
return curco
|
|
end
|
|
GLOB._G=GLOB --Mirror Mirror
|
|
return GLOB
|
|
end
|