iPut VTV handling in separate file. - vtv-tools - virtual terminal video tools Err bitreich.org 70
hgit clone git://bitreich.org/vtv-tools git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/vtv-tools URL:git://bitreich.org/vtv-tools git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/vtv-tools bitreich.org 70
1Log /scm/vtv-tools/log.gph bitreich.org 70
1Files /scm/vtv-tools/files.gph bitreich.org 70
1Refs /scm/vtv-tools/refs.gph bitreich.org 70
1Tags /scm/vtv-tools/tag bitreich.org 70
1README /scm/vtv-tools/file/README.md.gph bitreich.org 70
1LICENSE /scm/vtv-tools/file/LICENSE.gph bitreich.org 70
i--- Err bitreich.org 70
1commit 97eae58b832d521bc35a23b2bec42e8ac957b233 /scm/vtv-tools/commit/97eae58b832d521bc35a23b2bec42e8ac957b233.gph bitreich.org 70
1parent ac749bd30b1f473993b382e75d02f67cf028e501 /scm/vtv-tools/commit/ac749bd30b1f473993b382e75d02f67cf028e501.gph bitreich.org 70
hAuthor: Troels Henriksen <athas@sigkill.dk> URL:mailto:athas@sigkill.dk bitreich.org 70
iDate: Sun, 17 Sep 2023 14:29:49 +0200 Err bitreich.org 70
i Err bitreich.org 70
iPut VTV handling in separate file. Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M Makefile | 4 +++- Err bitreich.org 70
i M src/vtv-viewer.c | 53 ++++++++----------------------- Err bitreich.org 70
i A src/vtv.h | 76 +++++++++++++++++++++++++++++++ Err bitreich.org 70
i Err bitreich.org 70
i3 files changed, 93 insertions(+), 40 deletions(-) Err bitreich.org 70
i--- Err bitreich.org 70
1diff --git a/Makefile b/Makefile /scm/vtv-tools/file/Makefile.gph bitreich.org 70
i@@ -6,7 +6,7 @@ CC?=cc Err bitreich.org 70
i Err bitreich.org 70
i all: bin/vtv-from-ff bin/vtv-viewer Err bitreich.org 70
i Err bitreich.org 70
i-bin/%: src/%.c Err bitreich.org 70
i+bin/%: src/%.c src/vtv.h Err bitreich.org 70
i $(CC) -o $@ $< $(CFLAGS) Err bitreich.org 70
i Err bitreich.org 70
i install: all Err bitreich.org 70
i@@ -19,3 +19,5 @@ install: all Err bitreich.org 70
i install -D -m 644 man/* ${MANPREFIX}/man1/ Err bitreich.org 70
i Err bitreich.org 70
i .PHONY: all install Err bitreich.org 70
i+ Err bitreich.org 70
i+clean: rm bin/vtv-from-ff bin/vtv-viewer Err bitreich.org 70
1diff --git a/src/vtv-viewer.c b/src/vtv-viewer.c /scm/vtv-tools/file/src/vtv-viewer.c.gph bitreich.org 70
i@@ -12,6 +12,8 @@ Err bitreich.org 70
i #include <unistd.h> Err bitreich.org 70
i #include <errno.h> Err bitreich.org 70
i Err bitreich.org 70
i+#include "vtv.h" Err bitreich.org 70
i+ Err bitreich.org 70
i struct termios orig_termios; Err bitreich.org 70
i Err bitreich.org 70
i void cooked_mode() { Err bitreich.org 70
i@@ -47,32 +49,10 @@ void bg_rgb(uint8_t r, uint8_t g, uint8_t b) { Err bitreich.org 70
i printf("\033[48;2;%d;%d;%dm", r, g, b); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i-int read_lines(FILE* f, char*** lines_out, size_t *num_lines_out) { Err bitreich.org 70
i- size_t n, num_lines = 0, capacity = 10; Err bitreich.org 70
i- char** lines = calloc(capacity, sizeof(char*)); Err bitreich.org 70
i- ssize_t len; Err bitreich.org 70
i- Err bitreich.org 70
i- while ((len = getline(&lines[num_lines], &n, f)) > 0) { Err bitreich.org 70
i- lines[num_lines][len-1] = 0; // Strip newline. Err bitreich.org 70
i- if (++num_lines == capacity) { Err bitreich.org 70
i- capacity *= 2; Err bitreich.org 70
i- lines = reallocarray(lines, capacity, sizeof(char*)); Err bitreich.org 70
i- for (unsigned int i = num_lines; i < capacity; i++) { Err bitreich.org 70
i- lines[i] = NULL; Err bitreich.org 70
i- } Err bitreich.org 70
i- } Err bitreich.org 70
i- } Err bitreich.org 70
i- Err bitreich.org 70
i- *lines_out = lines; Err bitreich.org 70
i- *num_lines_out = num_lines; Err bitreich.org 70
i- return 0; Err bitreich.org 70
i-} Err bitreich.org 70
i- Err bitreich.org 70
i struct { Err bitreich.org 70
i int frame; Err bitreich.org 70
i int lines_per_frame; Err bitreich.org 70
i- char** lines; Err bitreich.org 70
i- int num_lines; Err bitreich.org 70
i+ struct vtv* vtv; Err bitreich.org 70
i } state; Err bitreich.org 70
i Err bitreich.org 70
i void show_status() { Err bitreich.org 70
i@@ -81,23 +61,16 @@ void show_status() { Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i void show_frame() { Err bitreich.org 70
i- for (int i = 0; i < state.lines_per_frame; i++) { Err bitreich.org 70
i- int j = state.frame*state.lines_per_frame + i; Err bitreich.org 70
i- if (j < state.num_lines) { Err bitreich.org 70
i- puts(state.lines[j]); Err bitreich.org 70
i- } else { Err bitreich.org 70
i- puts(" MISSING LINE"); Err bitreich.org 70
i- } Err bitreich.org 70
i- } Err bitreich.org 70
i+ vtv_show_frame(state.vtv, stdout, state.frame, state.lines_per_frame, Err bitreich.org 70
i+ "\033[0m MISSING LINE"); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i-int view(char** lines, size_t num_lines) { Err bitreich.org 70
i+int view(struct vtv* vtv) { Err bitreich.org 70
i raw_mode(); Err bitreich.org 70
i Err bitreich.org 70
i state.frame = 0; Err bitreich.org 70
i state.lines_per_frame = 25; Err bitreich.org 70
i- state.lines = lines; Err bitreich.org 70
i- state.num_lines = num_lines; Err bitreich.org 70
i+ state.vtv = vtv; Err bitreich.org 70
i Err bitreich.org 70
i while (1) { Err bitreich.org 70
i home(); Err bitreich.org 70
i@@ -140,12 +113,14 @@ int main(int argc, char** argv) { Err bitreich.org 70
i argv[0], argv[1], strerror(errno)); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i- char** lines; Err bitreich.org 70
i- size_t num_lines; Err bitreich.org 70
i- if (read_lines(f, &lines, &num_lines) != 0) { Err bitreich.org 70
i+ struct vtv *vtv = vtv_read(f); Err bitreich.org 70
i+ Err bitreich.org 70
i+ if (vtv == NULL) { Err bitreich.org 70
i fprintf(stderr, "%s: failed to read from %s: %s\n", Err bitreich.org 70
i argv[0], argv[1], strerror(errno)); Err bitreich.org 70
i- exit(1); Err bitreich.org 70
i } Err bitreich.org 70
i- return view(lines, num_lines); Err bitreich.org 70
i+ Err bitreich.org 70
i+ int ret = view(vtv); Err bitreich.org 70
i+ vtv_free(vtv); Err bitreich.org 70
i+ return ret; Err bitreich.org 70
i } Err bitreich.org 70
1diff --git a/src/vtv.h b/src/vtv.h /scm/vtv-tools/file/src/vtv.h.gph bitreich.org 70
i@@ -0,0 +1,76 @@ Err bitreich.org 70
i+// Single-header library for reading VTV files. Err bitreich.org 70
i+// Err bitreich.org 70
i+// VTV is an almost trivial format, but there are still a few things Err bitreich.org 70
i+// that are convenient to write once and for all (e.g. error Err bitreich.org 70
i+// handling). Err bitreich.org 70
i+// Err bitreich.org 70
i+// Copyright 2023 Troels Henriksen <athas@sigkill.dk> Err bitreich.org 70
i+// Err bitreich.org 70
i+// See LICENSE file for licensing information. Err bitreich.org 70
i+ Err bitreich.org 70
i+#pragma once Err bitreich.org 70
i+ Err bitreich.org 70
i+struct vtv { Err bitreich.org 70
i+ int num_lines; Err bitreich.org 70
i+ char** lines; Err bitreich.org 70
i+}; Err bitreich.org 70
i+ Err bitreich.org 70
i+static void vtv_free(struct vtv* vtv) { Err bitreich.org 70
i+ for (int i = 0; i < vtv->num_lines; i++) { Err bitreich.org 70
i+ free(vtv->lines[i]); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ free(vtv->lines); Err bitreich.org 70
i+ free(vtv); Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+// Returns nonzero on error. Err bitreich.org 70
i+static int vtv_read_lines(FILE* f, char*** lines_out, int *num_lines_out) { Err bitreich.org 70
i+ size_t n, num_lines = 0, capacity = 10; Err bitreich.org 70
i+ char** lines = calloc(capacity, sizeof(char*)); Err bitreich.org 70
i+ ssize_t len; Err bitreich.org 70
i+ Err bitreich.org 70
i+ while ((len = getline(&lines[num_lines], &n, f)) > 0) { Err bitreich.org 70
i+ lines[num_lines][len-1] = 0; // Strip newline. Err bitreich.org 70
i+ if (++num_lines == capacity) { Err bitreich.org 70
i+ capacity *= 2; Err bitreich.org 70
i+ lines = reallocarray(lines, capacity, sizeof(char*)); Err bitreich.org 70
i+ for (unsigned int i = num_lines; i < capacity; i++) { Err bitreich.org 70
i+ lines[i] = NULL; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } Err bitreich.org 70
i+ Err bitreich.org 70
i+ *lines_out = lines; Err bitreich.org 70
i+ *num_lines_out = num_lines; Err bitreich.org 70
i+ return 0; Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+// Show the given frame on the provided file. If there are not enough Err bitreich.org 70
i+// lines, show the provided line instead of the missing ones. Err bitreich.org 70
i+static void vtv_show_frame(struct vtv* vtv, Err bitreich.org 70
i+ FILE* f, Err bitreich.org 70
i+ int frame, Err bitreich.org 70
i+ int lines_per_frame, Err bitreich.org 70
i+ const char *missing_line) { Err bitreich.org 70
i+ for (int i = 0; i < lines_per_frame; i++) { Err bitreich.org 70
i+ int j = frame*lines_per_frame + i; Err bitreich.org 70
i+ if (j < vtv->num_lines) { Err bitreich.org 70
i+ fputs(vtv->lines[j], f); Err bitreich.org 70
i+ fputc('\n', f); Err bitreich.org 70
i+ } else { Err bitreich.org 70
i+ fputs(missing_line, f); Err bitreich.org 70
i+ fputc('\n', f); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+// Returns NULL on error. Err bitreich.org 70
i+static struct vtv* vtv_read(FILE *f) { Err bitreich.org 70
i+ struct vtv* vtv = malloc(sizeof(struct vtv)); Err bitreich.org 70
i+ if (vtv_read_lines(f, &vtv->lines, &vtv->num_lines) == 0) { Err bitreich.org 70
i+ return vtv; Err bitreich.org 70
i+ } else { Err bitreich.org 70
i+ free(vtv); Err bitreich.org 70
i+ return NULL; Err bitreich.org 70
i+ } Err bitreich.org 70
i+} Err bitreich.org 70
.
Response:
text/plain