diff --git a/module/buffer.lua b/module/buffer.lua index 3d64b1b..5b1e164 100644 --- a/module/buffer.lua +++ b/module/buffer.lua @@ -1,4 +1,4 @@ -local buffer = {} +buffer = {} local metatable = { __index = buffer, __metatable = "file", diff --git a/module/io.lua b/module/io.lua new file mode 100644 index 0000000..59bf90a --- /dev/null +++ b/module/io.lua @@ -0,0 +1,116 @@ +do +io = {} + +function io.close(file) + return (file or io.output()):close() +end + +function io.flush() + return io.output():flush() +end + +function io.lines(filename, ...) + if filename then + local file, reason = io.open(filename) + if not file then + error(reason, 2) + end + local args = table.pack(...) + return function() + local result = table.pack(file:read(table.unpack(args, 1, args.n))) + if not result[1] then + if result[2] then + error(result[2], 2) + else -- eof + file:close() + return nil + end + end + return table.unpack(result, 1, result.n) + end + else + return io.input():lines() + end +end + +function io.open(path, mode) + local stream, result = fs.open(path, mode) + if stream then + return buffer.new(mode, stream) + else + return nil, result + end +end + +local fdt = {[0]="STDIN","STDOUT","STDERR"} +local function getfh(fd) + return os.getenv(fdt[fd] or "FILE"..tostring(fd)) +end +local function setfh(fd,fh) + os.setenv(fdt[fd] or "FILE"..tostring(fd),fh) +end + +function io.stream(fd,file,mode) + checkArg(1,fd,'number') + assert(fd>=0,'fd must be >= 0. 0 is input, 1 is stdout, 2 is stderr') + if file then + if type(file) == "string" then + local result, reason = io.open(file, mode) + if not result then + error(reason, 2) + end + file = result + elseif not io.type(file) then + error("bad argument #1 (string or file expected, got " .. type(file) .. ")", 2) + end + setfh(fd,file) + end + return getfh(fd) +end + +function io.input(file) + return io.stream(0, file, 'r') +end + +function io.output(file) + return io.stream(1, file,'w') +end + +function io.error(file) + return io.stream(2, file,'w') +end + +function io.read(...) + return io.input():read(...) +end + +function io.tmpfile() + local name = os.tmpname() + if name then + return io.open(name, "a") + end +end + +function io.type(object) + if type(object) == "table" then + if getmetatable(object) == "file" then + if object.stream.handle then + return "file" + else + return "closed file" + end + end + end + return nil +end + +function io.write(...) + return io.output():write(...) +end + +function print(...) + for k,v in ipairs({...}) do + io.write(tostring(v).."\n") + end +end +end diff --git a/module/oldio.lua b/module/oldio.lua deleted file mode 100644 index abd3417..0000000 --- a/module/oldio.lua +++ /dev/null @@ -1,82 +0,0 @@ -do -io = {} - -function io.type(fh) - if type(fh) ~= "table" then return nil end - if fh.state == "open" then - return "file" - elseif fh.state == "closed" then - return "closed file" - end - return nil -end - -function io.read(buf, n) - n = n or buf - buf = buf or io.input() - print("bread",type(buf),n) - if not buf.aread then return nil end - if not buf.abmode then - buffer.write(buf,buf.fh:read(buf.m - buf.b:len())) - end - local rv = buffer.read(buf,n) - buffer.write(buf,buf.fh:read(buf.m - buf.b:len())) - return rv -end -function io.write(buf, d) - d = d or buf - buf = buf or io.output() - print("bwrite",type(buf),d) - if not buf.awrite then return nil end - if buf.b:len() + d:len() > buf.m then - buf.fh:write(buffer.read(buf,buf.m)) - end - local rv = buffer.write(buf,d) - if not buf.abmode then - buf.fh:write(buffer.read(buf,buf.m)) - end - return rv -end - -function io.close(fh) - fh.fh.close() - fh.state = "closed" -end - -function io.flush() -end - -function io.open(fname,mode) - mode=mode or "r" - local buf = buffer.new() - buf.fh, er = fs.open(fname,mode) - if not buf.fh then - error(er) - end - buf.state = "open" - buf.aread = mode:match("r") - buf.awrite = mode:match("w") or mode:match("a") - setmetatable(buf,{__index=io}) - return buf -end - -function print(...) - for k,v in ipairs({...}) do - io.write(string.format("%s\n",tostring(v))) - end -end - -io.stdin = io.open("/dev/null") -io.stdout = io.open("/dev/null","w") - -function io.input(fname) - if not fname then return os.getenv("STDIN") or io.stdin end - os.setenv("STDIN",io.open(fname)) -end - -function io.output(fname) - if not fname then return os.getenv("STDOUT") or io.stdout end - os.setenv("STDOUT",io.open(fname,"w")) -end - -end