5
local cutil = select(2, ...)
8
ffi = package.preload["ffi"],
9
cutil = function() return cutil end
18
for k, v in pairs(package.loaded) do loaded[k] = v end
20
M.path = "./?.lua;./?/init.lua"
24
local loadlib = package.loadlib
26
local cloader_load = function(soname, modname)
27
local hyp = modname:find("%-")
28
if hyp then modname = modname:sub(hyp + 1) end
29
local f, err = loadlib(soname, "luaopen_" .. (modname:gsub("%.", "_")))
31
error("error loading module '" .. modname .. "' from file '"
32
.. fname .. "':\n" .. err, 3)
39
local v = preload[modname]
41
return ("\no field preload['%s']"):format(modname)
46
local fname, err = package.searchpath(modname, M.path)
47
if not fname then return err end
48
local f, err = loadfile(fname)
50
error("error loading module '" .. modname .. "' from file '"
51
.. fname .. "':\n" .. err, 2)
56
local fname, err = package.searchpath(modname, M.cpath)
57
if not fname then return err end
58
local hyp = modname:find("%-")
59
if hyp then modname = modname:sub(hyp + 1) end
60
return cloader_load(fname, modname)
63
local rootname, dot = modname, modname:find("%.")
65
rootname = rootname:sub(dot + 1)
67
local fname, err = package.searchpath(rootname, M.cpath)
68
if not fname then return err end
69
return cloader_load(fname, modname)
74
local find_loader = function(modname, env)
76
local err = { ("module '%s' not found\n"):format(modname) }
77
for i = 1, #loaders do
78
local v = loaders[i](modname)
79
if type(v) == "function" then
80
local status, ret = pcall(function() return setfenv(v, env) end)
81
return status and ret or v
82
elseif type(v) == "string" then
86
return nil, table.concat(err)
89
M.require = function(modname, ...)
90
local v = loaded[modname]
91
if v ~= nil then return v end
92
local loader, err = find_loader(modname)
93
if not loader then error(err, 2) end
94
local ret = loader(modname, ...)
98
elseif loaded[modname] == nil then
99
loaded[modname] = true
102
return loaded[modname]
105
M.load_app = function(appname)
106
local fname, err = package.searchpath(appname, M.apath)
107
if not fname then return nil, err end
108
local f, err = loadfile(fname)
109
if not f then return nil, err end
117
M.path, M.apath = (...)(M.require, M.load_app, M.path, M.apath)
119
M.config = package.config
120
M.searchpath = package.searchpath
121
M.loadlib = package.loadlib
123
_G["require"] = M.require