diff --git a/todo b/todo new file mode 100755 index 0000000..49bee41 --- /dev/null +++ b/todo @@ -0,0 +1,90 @@ +#!/usr/bin/env lua + +local usage = function(stream) + stream:write(arg[0] .. [[ -- manage a todo stack +todo pop +todo peek +todo push + +for more info see `man todo.1` +]]) +end + +local peek = function(stack) + if #stack == 0 then os.exit(2) end + io.write(stack[#stack]) + io.write("\n") + return stack +end + +local pop = function(stack) + peek(stack) + stack[#stack] = nil + return stack +end + +local push = function(stack, args) + if not args[2] then + io.stderr:write("Invalid syntax\nUsage:\n") + usage(io.stderr) + os.exit(1) + end + stack[#stack + 1] = args[2] + return stack +end + +local exists = function(path) + return os.rename(path,path) or false +end + +local read_stack = function(path) + local f = io.open(path, "r") + if not f then os.exit(1) end + local t = {} + for l in f:lines() do + t[#t + 1] = l + end + f:close() + return t +end + +local write_stack = function(path, stack) + local f = io.open(path, "w") + if not f then os.exit(1) end + for _, v in ipairs(stack) do + f:write(v) + f:write("\n") + end + f:close() +end + +local stack_path = os.getenv("HOME") .. "/.local/share/todostack" + +if not exists(stack_path) then + local f = io.open(stack_path, "w") + f:close() +end + +local commands = { + peek = peek, + pop = pop, + push = push, + help = function() + usage(io.stdout) + end + } + +local c = commands[arg[1]] +if not c then + if arg[1] then + io.stderr:write("unknown command: " .. arg[1] .. "\nUsage:\n") + else + io.stderr:write("Please specify a command\n Usage:\n") + end + usage(io.stderr) + os.exit(1) +else + local stack = read_stack(stack_path) + stack = c(stack, arg) + write_stack(stack_path, stack) +end diff --git a/todo.1 b/todo.1 new file mode 100644 index 0000000..9b648af --- /dev/null +++ b/todo.1 @@ -0,0 +1,38 @@ +.\" Man page for the todo utility ./todo.1 +.TH TODO 1 + +.SH NAME +todo \- manages a todo stack +.SH SYNOPSIS +.B todo +.IR command " [" option "]" +.SH DESCRIPTION +.P +.B todo +is a small utility to manage a todo stack. It can push onto the stack, read the top element, and pop the top element. +.SH OPTIONS +.TP +.BI push " task" +Pushes a new task on the user's todo stack. +.TP +.B peek +Outputs the task at the top of the stack. +Does not alter the stack. +.TP +.B pop +Outputs the task at the top of the stack, then pops it off. +.SH EXIT STATUS +.TP +.B 0 +Operation successful. +.TP +.B 1 +General error +.TP +.B 2 +Todo stack underflow on a \fBpop\fR command or a \fBpeek\fR command. +.SH FILES +.TP +.B $HOME/.local/share/todostack +The user's todo stack. +.SH