SMOLNET PORTAL home about changes
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
Original URLgopher://bitreich.org/0/scm/vtv-tools/commit/97eae58b832d...
Content-Typetext/plain; charset=utf-8