neonucleus/data/OpenOS/lib/package.lua
IonutParau 687cfebd00 testing version of LuaBIOS and OpenOS
people were having issues getting them to work so now we promote consistency
2025-06-28 20:41:49 +02:00

120 lines
3.1 KiB
Lua

local package = {}
package.config = "/\n;\n?\n!\n-\n"
package.path = "/lib/?.lua;/usr/lib/?.lua;/home/lib/?.lua;./?.lua;/lib/?/init.lua;/usr/lib/?/init.lua;/home/lib/?/init.lua;./?/init.lua"
local loading = {}
local preload = {}
local searchers = {}
local loaded = {
["_G"] = _G,
["bit32"] = bit32,
["coroutine"] = coroutine,
["math"] = math,
["os"] = os,
["package"] = package,
["string"] = string,
["table"] = table
}
package.loaded = loaded
package.preload = preload
package.searchers = searchers
function package.searchpath(name, path, sep, rep)
checkArg(1, name, "string")
checkArg(2, path, "string")
sep = sep or '.'
rep = rep or '/'
sep, rep = '%' .. sep, rep
name = string.gsub(name, sep, rep)
local fs = require("filesystem")
local errorFiles = {}
for subPath in string.gmatch(path, "([^;]+)") do
subPath = string.gsub(subPath, "?", name)
if subPath:sub(1, 1) ~= "/" and os.getenv then
subPath = fs.concat(os.getenv("PWD") or "/", subPath)
end
if fs.exists(subPath) then
local file = fs.open(subPath, "r")
if file then
file:close()
return subPath
end
end
table.insert(errorFiles, "no file '" .. subPath .. "'")
end
return nil, table.concat(errorFiles, "\n\t")
end
table.insert(searchers, function(module)
if package.preload[module] then
return package.preload[module]
end
return "no field package.preload['" .. module .. "']"
end)
table.insert(searchers, function(module)
local library, path, status
path, status = package.searchpath(module, package.path)
if not path then
return status
end
library, status = loadfile(path)
if not library then
error(string.format("error loading module '%s' from file '%s':\n\t%s", module, path, status))
end
return library, module
end)
function require(module)
checkArg(1, module, "string")
if loaded[module] ~= nil then
return loaded[module]
elseif loading[module] then
error("already loading: " .. module .. "\n" .. debug.traceback(), 2)
else
local library, status, arg
local errors = ""
if type(searchers) ~= "table" then error("'package.searchers' must be a table") end
for _, searcher in pairs(searchers) do
library, arg = searcher(module)
if type(library) == "function" then break end
if type(library) ~= nil then
errors = errors .. "\n\t" .. tostring(library)
library = nil
end
end
if not library then error(string.format("module '%s' not found:%s", module, errors)) end
loading[module] = true
library, status = pcall(library, arg or module)
loading[module] = false
assert(library, string.format("module '%s' load failed:\n%s", module, status))
loaded[module] = status
return status
end
end
function package.delay(lib, file)
local mt = {}
function mt.__index(tbl, key)
mt.__index = nil
dofile(file)
return tbl[key]
end
if lib.internal then
setmetatable(lib.internal, mt)
end
setmetatable(lib, mt)
end
-------------------------------------------------------------------------------
return package