1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
# gils: better than Gnu utILS
global commands = {}
fn register(usage, group, help, handler) do
const name = usage:split(" ")[0]
commands:push({ name = name, usage = usage, group = group, help = help, handler = handler })
end
fn lookup(name) do
for index in 0..commands:len() do
if commands[index].name == name return commands[index]
end
return :nil
end
fn make_ctx(line, argv) do
const name = argv[0]
let rest = ""
const cut = name:len() + 1
if line:len() > cut do rest = line[cut..] end
return { line = line, argv = argv, rest = rest }
end
# scripts read their args off env.ctx, stashed here before eval
global env = { ctx = :nil }
# first use of unless in history
global expand_path = fn(path) do
if path:len() == 0 return wd.path
unless (path[0] == "/") do
const slash = unless (wd.path == "/") "/" else ""
path = "#{wd.path}#{slash}#{path}"
end
return path
end
fn run_script_path(path, label, ctx) do
const size = fs:size(path)
if size < 0 return :false
env.ctx = ctx
const error_msg = eval_script(fs:read_bytes(path, 0, size))
if error_msg != :nil do puts("#{label}: #{error_msg}\n") end
return :true
end
fn run_script(name, ctx) run_script_path("/bin/#{name}.rv", name, ctx)
|