forked from Hyperion/HyperionOS
56 lines
1.8 KiB
Plaintext
Executable File
56 lines
1.8 KiB
Plaintext
Executable File
local args = {...}
|
|
local kernel = args[1]
|
|
|
|
-- List of search paths
|
|
local paths = {
|
|
"/lib/?",
|
|
"/usr/lib/?",
|
|
"/usr/local/lib/?"
|
|
}
|
|
|
|
-- Custom require implementation
|
|
function require(module)
|
|
-- Return cached module if it already exists
|
|
if kernel.cache.preload[module] then
|
|
return kernel.cache.preload[module]
|
|
end
|
|
|
|
local err = {}
|
|
|
|
for _, path in ipairs(paths) do
|
|
-- Replace "?" with module name
|
|
local filePath = string.replace(path, "?", module)
|
|
|
|
-- Try to open file
|
|
local file = kernel.fs.isFile(filePath)
|
|
if file then
|
|
local content = kernel.fs.readAllText(filePath)
|
|
|
|
-- Load the module as Lua code
|
|
local chunk, loadErr = load(content, filePath)
|
|
if not chunk then
|
|
table.insert(err, "Error loading: " .. filePath .. ": " .. loadErr)
|
|
else
|
|
-- Execute the module. If the module returns a value, cache it.
|
|
local ok, result = xpcall(chunk, debug.traceback)
|
|
if not ok then
|
|
table.insert(err, "Error executing: "..filePath..": "..tostring(result))
|
|
else
|
|
if result ~= nil then
|
|
kernel.cache.preload[module] = result
|
|
return result
|
|
end
|
|
|
|
-- If module doesn't return anything, cache `true` like Lua does
|
|
kernel.cache.preload[module] = true
|
|
return true
|
|
end
|
|
end
|
|
else
|
|
table.insert(err, "Module not found: " .. filePath)
|
|
end
|
|
end
|
|
|
|
-- If nothing worked, raise an error with all reasons
|
|
error("Unable to require module '" .. module .. "':\n" .. table.concat(err, "\n"))
|
|
end |