[examples/cat] Add cat example.
This commit is contained in:
parent
ba72d29ef9
commit
b62adb2316
|
@ -0,0 +1,78 @@
|
||||||
|
#!/bin/env lua
|
||||||
|
-- Trimmed down cat(1) utility.
|
||||||
|
--
|
||||||
|
-- Concatenate files to stdout, making sure bytes are actually written
|
||||||
|
-- out successfully.
|
||||||
|
--
|
||||||
|
-- SYNOPSIS:
|
||||||
|
-- cat.lua [-u] <FILES...>
|
||||||
|
--
|
||||||
|
-- NOTE: utility doesn't explicitly allow to concatenate stdin.
|
||||||
|
local osx = require 'osx'
|
||||||
|
local io = require 'io'
|
||||||
|
|
||||||
|
local uflag = false
|
||||||
|
|
||||||
|
local function cat(path)
|
||||||
|
local ferr = io.stderr
|
||||||
|
|
||||||
|
local f, err = io.open(path, 'r')
|
||||||
|
if err then
|
||||||
|
ferr:write(err, "\n")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local success = true -- unless it happens to be a failure
|
||||||
|
local fout = io.stdout
|
||||||
|
|
||||||
|
while true do
|
||||||
|
local buf, err = f:read(4096)
|
||||||
|
if err then
|
||||||
|
ferr:write(err, "\n")
|
||||||
|
success = false
|
||||||
|
end
|
||||||
|
if not buf then
|
||||||
|
break -- done with file
|
||||||
|
end
|
||||||
|
assert(fout:write(buf))
|
||||||
|
end
|
||||||
|
f:close()
|
||||||
|
|
||||||
|
assert(fout:flush())
|
||||||
|
if not osx.isatty(fout) then
|
||||||
|
assert(osx.commit(fout))
|
||||||
|
end
|
||||||
|
return success
|
||||||
|
end
|
||||||
|
|
||||||
|
local function parseargs(...)
|
||||||
|
local files = {}
|
||||||
|
for i = 1, select('#', ...) do
|
||||||
|
local arg = select(i, ...)
|
||||||
|
if arg == '-u' then
|
||||||
|
uflag = true
|
||||||
|
else
|
||||||
|
files[#files+1] = arg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if #files == 0 then
|
||||||
|
error("Missing file arguments")
|
||||||
|
end
|
||||||
|
return files
|
||||||
|
end
|
||||||
|
|
||||||
|
local files = parseargs(...)
|
||||||
|
|
||||||
|
io.stdout:setvbuf(uflag and 'no' or 'full')
|
||||||
|
|
||||||
|
local success = true
|
||||||
|
for _, path in ipairs(files) do
|
||||||
|
if not cat(path) then
|
||||||
|
success = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not success then
|
||||||
|
os.exit(1)
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in New Issue