First commit. Not even working prototype yet.
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
local componentlib = {}
|
||||
|
||||
function componentlib.get(address)
|
||||
checkArg(1, address, "string")
|
||||
assert(#address >= 3, "abbreviated address must be at least 3 characters long")
|
||||
local components = component.list()
|
||||
for currentAddress, name in pairs(components) do
|
||||
if currentAddress:find("^" .. address) then
|
||||
return(currentAddress)
|
||||
end
|
||||
end
|
||||
return nil, "full address not found"
|
||||
end
|
||||
|
||||
componentlib.invoke = component.invoke
|
||||
|
||||
return(componentlib)
|
||||
@@ -0,0 +1,69 @@
|
||||
local loadfile = ... -- raw loadfile from boot.lua
|
||||
local component
|
||||
|
||||
if loadfile then
|
||||
component = loadfile("/halyde/lib/component.lua")(loadfile)
|
||||
else
|
||||
component = require("component")
|
||||
end
|
||||
|
||||
local filesystem = {}
|
||||
|
||||
function filesystem.processPath(path) -- returns the address and absolute path of a filesystem path as well as sanitizing it
|
||||
checkArg(1, path, "string")
|
||||
absPath = path:gsub("/+", "/"):gsub("/$", "")
|
||||
local address = nil
|
||||
if absPath:find("^/mnt/.../") then
|
||||
address = component.get(path:sub(6,8))
|
||||
if not address then
|
||||
address = computer.getBootAddress()
|
||||
else
|
||||
absPath = absPath:sub(9)
|
||||
end
|
||||
else
|
||||
address = computer.getBootAddress()
|
||||
end
|
||||
if not address then
|
||||
return nil, "no such device"
|
||||
end
|
||||
return address, absPath
|
||||
end
|
||||
|
||||
function filesystem.exists(path) -- check if path exists
|
||||
checkArg(1, path, "string")
|
||||
local address, absPath = filesystem.processPath(path)
|
||||
if not address then
|
||||
return false
|
||||
end
|
||||
return component.invoke(address, "exists", absPath)
|
||||
end
|
||||
|
||||
function filesystem.open(path, mode) -- opens a file and returns its handle
|
||||
checkArg(1, path, "string")
|
||||
checkArg(2, mode, "string", "nil")
|
||||
if not mode then
|
||||
mode = "r"
|
||||
end
|
||||
if not (mode == "r" or mode == "w" or mode == "rb" or mode == "wb") then
|
||||
return nil, "invalid handle type"
|
||||
end
|
||||
local address, absPath = filesystem.processPath(path)
|
||||
local handle = component.invoke(address, "open", absPath, mode)
|
||||
local properHandle = {}
|
||||
properHandle.handle = handle
|
||||
properHandle.address = address
|
||||
function properHandle.read(self, amount)
|
||||
checkArg(2, amount, "number")
|
||||
return component.invoke(self.address, "read", self.handle, amount)
|
||||
end
|
||||
function properHandle.write(self, data)
|
||||
checkArg(2, data, "string")
|
||||
return component.invoke(self.address, "write", self.handle, data)
|
||||
end
|
||||
function properHandle.close(self)
|
||||
return component.invoke(self.address, "close", self.handle)
|
||||
end
|
||||
return properHandle
|
||||
end
|
||||
|
||||
return(filesystem)
|
||||
@@ -0,0 +1,25 @@
|
||||
local gpu = component.proxy(component.list("gpu")()) -- replace with component.gpu once implemented
|
||||
local lineNumber = 1
|
||||
|
||||
function _G.print(text)
|
||||
local xRes, yRes = gpu.getResolution()
|
||||
if not text or not tostring(text) then
|
||||
return
|
||||
end
|
||||
local printText = tostring(text):gsub("\t", " ")
|
||||
for line in printText:gmatch("([^\n]*)\n?") do
|
||||
while #line > xRes do
|
||||
gpu.set(1,lineNumber,line:sub(1,xRes))
|
||||
line = line:sub(xRes+1)
|
||||
lineNumber = lineNumber + 1
|
||||
end
|
||||
gpu.set(1,lineNumber,line)
|
||||
lineNumber = lineNumber + 1
|
||||
end
|
||||
end
|
||||
|
||||
function _G.clear()
|
||||
local xRes, yRes = gpu.getResolution()
|
||||
gpu.fill(1,1,xRes,yRes," ")
|
||||
lineNumber = 1
|
||||
end
|
||||
Reference in New Issue
Block a user