summary refs log tree commit diff
path: root/nav.c
diff options
context:
space:
mode:
authorwrmr2024-11-02 19:33:08 -0500
committerwrmr2024-11-02 19:33:08 -0500
commit610808a5902adad751a4acdbcc310803a51fed5d (patch)
tree76599dc60cccf6a3765f484dfa1b19e1af88efa1 /nav.c
parent58214ec5f982c1b97aadce254c958a5f922c9724 (diff)
very different document data structure
Diffstat (limited to 'nav.c')
-rw-r--r--nav.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/nav.c b/nav.c
new file mode 100644
index 0000000..82cf71a
--- /dev/null
+++ b/nav.c
@@ -0,0 +1,62 @@
+#include <string.h>
+#include <stdio.h>
+#include "nav.h"
+
+void nav_init(struct nav_state *ns) {
+	memset(ns, 0, sizeof *ns);
+	ns->histc = 1;
+	doc_init(&ns->histv[0]);
+	doc_add_text(&ns->histv[0], "Type ? for command help.");
+}
+
+void nav_fini(struct nav_state *ns) {
+	for (size_t i = 0; i < ns->histc; i++) {
+		doc_fini(&ns->histv[i]);
+	}
+}
+
+size_t pg_lines(void) {
+	return 24;
+}
+
+struct doc_line *nav_cur_line(struct nav_state *ns) {
+	return (struct doc_line *)&ns->histv[ns->cur_doc].txt.buf[ns->cur_ofs[ns->cur_doc]];
+}
+
+int nav_line_up(struct nav_state *ns) {
+	if (ns->cur_ofs[ns->cur_doc] > 0) {
+		ns->cur_ofs[ns->cur_doc] -= nav_cur_line(ns)->prev; 
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+int nav_line_down(struct nav_state *ns) {
+	struct doc_line *l = nav_cur_line(ns);
+	if (ns->cur_ofs[ns->cur_doc] + sizeof(struct doc_line) + l->len < ns->histv[ns->cur_doc].txt.sz) {
+		ns->cur_ofs[ns->cur_doc] += l->len + sizeof(struct doc_line); 
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+void nav_pg_up(struct nav_state *ns) {
+	size_t lines = pg_lines() << 1;
+	while (lines-- && nav_line_up(ns));
+	nav_pg_down(ns);
+}
+
+void nav_pg_down(struct nav_state *ns) {
+	size_t lines = pg_lines();
+	while (lines--) {
+		struct doc_line *l = nav_cur_line(ns);
+		fwrite(l->txt, 1, l->len, stdout);
+		putchar('\n');
+		if (!nav_line_down(ns)) break;
+	}
+}
+
+void nav_redraw(struct nav_state *ns) {
+}