added handling invalid invoke functions and ported a couple of apps

stopped component.invoke from throwing a cryptic error, and ported over cat, cd, clear, cp, edit, ls, lsdrv, and mkdir
This commit is contained in:
Ponali
2025-09-14 17:45:36 +02:00
parent 8244f1590c
commit 3c087aaddf
9 changed files with 49 additions and 33 deletions
+3 -2
View File
@@ -1,4 +1,5 @@
local files = {...} local files = {...}
local shell = require("shell")
local fs = require("filesystem") local fs = require("filesystem")
if not files or not files[1] then if not files or not files[1] then
shell.run("help cat") shell.run("help cat")
@@ -6,7 +7,7 @@ if not files or not files[1] then
end end
for _, file in ipairs(files) do for _, file in ipairs(files) do
if file:sub(1, 1) ~= "/" then if file:sub(1, 1) ~= "/" then
file = fs.concat(shell.workingDirectory, file) file = fs.concat(shell.getWorkingDirectory(), file)
end end
if not fs.exists(file) then if not fs.exists(file) then
print("\27[91mFile does not exist.") print("\27[91mFile does not exist.")
@@ -15,6 +16,6 @@ for _, file in ipairs(files) do
local data local data
repeat repeat
data = handle:read(math.huge or math.maxinteger) data = handle:read(math.huge or math.maxinteger)
termlib.write(data) terminal.write(data)
until not data until not data
end end
+3 -2
View File
@@ -1,14 +1,15 @@
local directory = ... local directory = ...
local fs = require("filesystem") local fs = require("filesystem")
local shell = require("shell")
if not directory then if not directory then
return return
end end
if directory:sub(1, 1) ~= "/" then if directory:sub(1, 1) ~= "/" then
directory = fs.concat(shell.workingDirectory, directory) directory = fs.concat(shell.getWorkingDirectory(), directory)
end end
if fs.exists(directory) and fs.isDirectory(directory) then if fs.exists(directory) and fs.isDirectory(directory) then
shell.workingDirectory = fs.canonical(directory) shell.setWorkingDirectory(fs.canonical(directory))
else else
print("\27[91mNo such directory.") print("\27[91mNo such directory.")
end end
+1 -1
View File
@@ -1,2 +1,2 @@
clear() terminal.clear()
-- truly so much going on here -- truly so much going on here
+3 -2
View File
@@ -1,15 +1,16 @@
local fromFile, toFile = ... local fromFile, toFile = ...
local fs = require("filesystem") local fs = require("filesystem")
local shell = require("shell")
if not fromFile or not toFile then if not fromFile or not toFile then
shell.run("help cp") shell.run("help cp")
return return
end end
if fromFile:sub(1, 1) ~= "/" then if fromFile:sub(1, 1) ~= "/" then
fromFile = fs.concat(shell.workingDirectory, fromFile) fromFile = fs.concat(shell.getWorkingDirectory(), fromFile)
end end
if toFile:sub(1, 1) ~= "/" then if toFile:sub(1, 1) ~= "/" then
toFile = fs.concat(shell.workingDirectory, toFile) toFile = fs.concat(shell.getWorkingDirectory(), toFile)
end end
if fromFile == toFile then if fromFile == toFile then
print("\27[91mSource and destination are the same.") print("\27[91mSource and destination are the same.")
+13 -15
View File
@@ -3,6 +3,7 @@ local fs = require("filesystem")
local event = require("event") local event = require("event")
local component = require("component") local component = require("component")
local unicode = require("unicode") local unicode = require("unicode")
local workingDirectory = require("shell").getWorkingDirectory()
local gpu = component.gpu local gpu = component.gpu
local width, height = gpu.getResolution() local width, height = gpu.getResolution()
local scrollPosX, scrollPosY = 1, 1 local scrollPosX, scrollPosY = 1, 1
@@ -15,9 +16,8 @@ local tab = " "
--local ocelot = component.ocelot --local ocelot = component.ocelot
local function rawset(x, y, text) local function rawset(x, y, text)
termlib.cursorPosX = x terminal.setCursorPos(x,y)
termlib.cursorPosY = y terminal.write(text, false)
termlib.write(text, false)
end end
local filestring, filepath, handle, data, tmpdata local filestring, filepath, handle, data, tmpdata
@@ -25,7 +25,7 @@ if file then
if file:sub(1, 1) == "/" then if file:sub(1, 1) == "/" then
filepath = file filepath = file
else else
filepath = shell.workingDirectory .. file filepath = workingDirectory .. file
end end
handle, data, tmpdata = fs.open(filepath, "r"), "", nil handle, data, tmpdata = fs.open(filepath, "r"), "", nil
if fs.exists(filepath) then if fs.exists(filepath) then
@@ -44,7 +44,7 @@ if file then
tmpdata = {data} tmpdata = {data}
end end
else else
filepath = shell.workingDirectory .. file filepath = workingDirectory .. file
filestring = "[NEW FILE]" filestring = "[NEW FILE]"
tmpdata = {""} tmpdata = {""}
end end
@@ -55,7 +55,7 @@ else
end end
local function render() local function render()
gpu.setActiveBuffer(renderBuffer) gpu.setActiveBuffer(renderBuffer)
clear() terminal.clear()
--ocelot.log(tostring(scrollPosY)) --ocelot.log(tostring(scrollPosY))
local realCursorX = math.min(cursorPosX, unicode.wlen(tmpdata[cursorPosY + scrollPosY - 1]) - scrollPosX + 2) local realCursorX = math.min(cursorPosX, unicode.wlen(tmpdata[cursorPosY + scrollPosY - 1]) - scrollPosX + 2)
if realCursorX < 1 then if realCursorX < 1 then
@@ -152,7 +152,7 @@ local function processEvent(args)
if args[1] == "key_down" then if args[1] == "key_down" then
local keycode = args[4] local keycode = args[4]
local key = keyboard.keys[keycode] local key = keyboard.keys[keycode]
if keyboard.ctrlDown then if keyboard.getCtrlDown() then
return false, false, key return false, false, key
end end
if key == "down" and cursorPosY < #tmpdata then if key == "down" and cursorPosY < #tmpdata then
@@ -261,14 +261,13 @@ local function save()
gpu.setBackground(0xFFFFFF) gpu.setBackground(0xFFFFFF)
gpu.setForeground(0) gpu.setForeground(0)
gpu.set(1, height - 1, string.rep(" ", width)) gpu.set(1, height - 1, string.rep(" ", width))
termlib.cursorPosX = 1 terminal.setCursorPos(1, height - 1)
termlib.cursorPosY = height - 1 local savepath = terminal.read(nil, "\27[107m\27[30mSave location: ", filepath)
local savepath = read(nil, "\27[107m\27[30mSave location: ", filepath)
gpu.setBackground(0xFFFFFF) gpu.setBackground(0xFFFFFF)
gpu.setForeground(0) gpu.setForeground(0)
if fs.exists(savepath) then if fs.exists(savepath) then
gpu.set(1, height - 1, string.rep(" ", width)) gpu.set(1, height - 1, string.rep(" ", width))
local answer = read(nil, "\27[107m\27[30mFile already exists. Overwrite it? [Y/n] ") local answer = terminal.read(nil, "\27[107m\27[30mFile already exists. Overwrite it? [Y/n] ")
if answer:lower() == "n" then if answer:lower() == "n" then
gpu.setBackground(0xFFFFFF) gpu.setBackground(0xFFFFFF)
gpu.setForeground(0) gpu.setForeground(0)
@@ -301,15 +300,14 @@ while true do
renderFlag, cursorRenderFlag, specialKey = processEvent(args) renderFlag, cursorRenderFlag, specialKey = processEvent(args)
if specialKey == "x" then if specialKey == "x" then
if changesMade then if changesMade then
termlib.cursorPosX = 1 terminal.setCursorPos(1, height - 1)
termlib.cursorPosY = height - 1 local response = terminal.read(nil, "\27[107m\27[30mWould you like to save changes? [Y/n] ")
local response = read(nil, "\27[107m\27[30mWould you like to save changes? [Y/n] ")
if response:lower() ~= "n" then if response:lower() ~= "n" then
save() save()
end end
end end
gpu.freeAllBuffers() gpu.freeAllBuffers()
clear() terminal.clear()
return return
end end
if specialKey == "s" then if specialKey == "s" then
+3 -2
View File
@@ -7,13 +7,14 @@ local maxLength = 0
local margin = 2 -- minimum space between filename and size local margin = 2 -- minimum space between filename and size
local dirTable = {} local dirTable = {}
local fileTable = {} local fileTable = {}
local workingDirectory = require("shell").getWorkingDirectory()
if target then if target then
if target:sub(1, 1) ~= "/" then if target:sub(1, 1) ~= "/" then
target = fs.concat(shell.workingDirectory, target) target = fs.concat(workingDirectory, target)
end end
else else
target = shell.workingDirectory target = workingDirectory
end end
local files = fs.list(target) local files = fs.list(target)
+20 -7
View File
@@ -106,7 +106,7 @@ local function formatSize(mem)
end end
local function fileExists(proxy,path) local function fileExists(proxy,path)
return proxy.exists(path) and not proxy.isDirectory(path) return proxy.exists and proxy.isDirectory and proxy.exists(path) and not proxy.isDirectory(path)
end end
local function getBootCode(proxy) local function getBootCode(proxy)
@@ -140,24 +140,37 @@ local function handleComponent(id,type)
-- for i=1,#tableOut do table.insert(out,"unknown") end -- for i=1,#tableOut do table.insert(out,"unknown") end
local slot,capacity,managed,readOnly,mount,bootable,label local slot,capacity,managed,readOnly,mount,bootable,label
local virtual,vproc = component.virtual.check(id)
local cslot = component.slot(id) local cslot = component.slot(id)
if cslot==-1 then if virtual then
slot="Virtual" if vproc and vproc.name then
slot="Virtual ("..vproc.name..")"
else
slot="Virtual (unknown)"
end
elseif cslot==-1 then
slot="External"
elseif cslot==9 then elseif cslot==9 then
slot="EEPROM" slot="EEPROM"
elseif cslot==5 or cslot==6 then
slot="HDD #"..(cslot-4)
elseif cslot==7 then
slot="Floppy"
else else
slot="#"..(cslot+2) slot="#"..(cslot+2)
end end
managed="Yes" managed="No"
readOnly="No" readOnly="No"
if type=="drive" then if type=="drive" then
managed="No"
capacity=formatSize(proxy.getCapacity()) capacity=formatSize(proxy.getCapacity())
mount="/special/drive/"..id:sub(1,3) mount="/special/drive/"..id:sub(1,3)
elseif type=="filesystem" then elseif type=="filesystem" then
capacity=formatSize(proxy.spaceTotal()) managed="Yes"
if proxy.isReadOnly() then if proxy.spaceTotal then
capacity=formatSize(proxy.spaceTotal())
end
if not proxy.isReadOnly or proxy.isReadOnly() then
readOnly="Yes" readOnly="Yes"
end end
mount="/mnt/"..id:sub(1,3) mount="/mnt/"..id:sub(1,3)
+2 -2
View File
@@ -2,11 +2,11 @@ local directory = ...
local fs = require("filesystem") local fs = require("filesystem")
if not directory then if not directory then
shell.run("help mkdir") require("shell").run("help mkdir")
return return
end end
if directory:sub(1, 1) ~= "/" then if directory:sub(1, 1) ~= "/" then
directory = fs.concat(shell.workingDirectory, directory) directory = fs.concat(require("shell").getWorkingDirectory(), directory)
end end
if fs.exists(directory) then if fs.exists(directory) then
print("\27[91mAn object already exists at the specified path.") print("\27[91mAn object already exists at the specified path.")
+1
View File
@@ -79,6 +79,7 @@ function compLib.invoke(address, funcName, ...)
--ocelot.log("Invoking " .. funcName .. " from " .. address) --ocelot.log("Invoking " .. funcName .. " from " .. address)
if componentlib.additions[address] then if componentlib.additions[address] then
--ocelot.log("vcomponent") --ocelot.log("vcomponent")
if not componentlib.additions[address].proxy[funcName] then error("no such method") end
return componentlib.additions[address].proxy[funcName](...) return componentlib.additions[address].proxy[funcName](...)
else else
return LLcomponent.invoke(address, funcName, ...) return LLcomponent.invoke(address, funcName, ...)