49 lines
1.2 KiB
Lua
49 lines
1.2 KiB
Lua
local function try_files(lst)
|
|
for _, v in pairs(lst) do
|
|
local z = potatOS.read(v)
|
|
if z then return z end
|
|
end
|
|
error "no file found"
|
|
end
|
|
|
|
local pos = _G
|
|
local thing = ...
|
|
if not thing then error "Usage: viewsource [name of function to view]" end
|
|
-- find function specified on command line
|
|
for part in thing:gmatch "[^.]+" do
|
|
pos = pos[part]
|
|
if not pos then error(thing .. " does not exist: " .. part) end
|
|
end
|
|
|
|
local info = debug.getinfo(pos)
|
|
if not info.linedefined or not info.lastlinedefined or not info.source or info.lastlinedefined == -1 then error "Is this a Lua function?" end
|
|
local sourcen = info.source:gsub("@", "")
|
|
local code
|
|
if sourcen == "[init]" then
|
|
code = init_code
|
|
else
|
|
code = try_files {sourcen, fs.combine("lib", sourcen), fs.combine("bin", sourcen), fs.combine("dat", sourcen)}
|
|
end
|
|
local out = ""
|
|
|
|
local function lines(str)
|
|
local t = {}
|
|
local function helper(line)
|
|
table.insert(t, line)
|
|
return ""
|
|
end
|
|
helper((str:gsub("(.-)\r?\n", helper)))
|
|
return t
|
|
end
|
|
|
|
for ix, line in pairs(lines(code)) do
|
|
if ix >= info.linedefined and ix <= info.lastlinedefined then
|
|
out = out .. line .. "\n"
|
|
end
|
|
end
|
|
local filename = ".viewsource-" .. thing
|
|
local f = fs.open(filename, "w")
|
|
f.write(out)
|
|
f.close()
|
|
shell.run("edit", filename)
|
|
fs.delete(filename) |