From 6337a8d398a223345e2e22ede0911d5e6dcab019 Mon Sep 17 00:00:00 2001 From: Autumn Date: Sun, 23 Aug 2026 11:33:35 +0100 Subject: [bunnytask] added basic TODO.TXT reading --- lib/slice.ha | 21 +++++++++++++++++++++ main.ha | 20 ++++++++++++++++++++ todo/open.ha | 23 +++++++++++++++++++++++ todo/print.ha | 5 +++++ 4 files changed, 69 insertions(+) create mode 100644 lib/slice.ha create mode 100644 main.ha create mode 100644 todo/open.ha create mode 100644 todo/print.ha diff --git a/lib/slice.ha b/lib/slice.ha new file mode 100644 index 0000000..7cd2e30 --- /dev/null +++ b/lib/slice.ha @@ -0,0 +1,21 @@ +use fmt; + +export fn slice_remove_empty(slice: *[]str) void = { + for (let i = 0z; i < len(slice); i += 1) { + if (slice[i] == "") { + delete(slice[i]); + i -= 1; + }; + }; +}; + +@test fn slice_remove_empty() void = { + const slice: []str = alloc(["autumn", "", "winter"])!; + defer free(slice); + + slice_remove_empty(&slice); + + assert(len(slice) == 2); + assert(slice[0] == "autumn"); + assert(slice[1] == "winter"); +}; diff --git a/main.ha b/main.ha new file mode 100644 index 0000000..995d5d4 --- /dev/null +++ b/main.ha @@ -0,0 +1,20 @@ +use fmt; +use strings; +use todo; +use fs; + +def TODO_FILE = "todo.txt"; + +export fn main() void = { + const todos = match(todo::open(TODO_FILE)) { + case let todos: []str => yield todos; + case let err: fs::error => fmt::fatalf("Error opening {}: {}", TODO_FILE, fs::strerror(err)); + }; + defer strings::freeall(todos); + + fmt::println("To-dos:")!; + + for (let item .. todos) { + if (item != "") todo::print(item); + }; +}; diff --git a/todo/open.ha b/todo/open.ha new file mode 100644 index 0000000..7692635 --- /dev/null +++ b/todo/open.ha @@ -0,0 +1,23 @@ +use fs; +use io; +use lib; +use os; +use strings; + +export fn open(file: str) ([]str | fs::error) = { + + // open + const todos = os::open(file)?; + defer io::close(todos)!; + + const todos = io::drain(todos)!; + defer free(todos); + + // read + const todos = strings::fromutf8(todos)!; + const todos = strings::split(todos, "\n")!; + + lib::slice_remove_empty(&todos); + + return strings::dupall(todos)?; +}; diff --git a/todo/print.ha b/todo/print.ha new file mode 100644 index 0000000..4106fd9 --- /dev/null +++ b/todo/print.ha @@ -0,0 +1,5 @@ +use fmt; + +export fn print(todo: str) void = { + fmt::printfln("* {}", todo)!; +}; -- cgit v1.3