SMOLNET PORTAL home about changes
iRewrite vtv-player in C. - 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 3995532c578c1894a08817a4b6c463bcb892243f	/scm/vtv-tools/commit/3995532c578c1894a08817a4b6c463bcb892243f.gph	bitreich.org	70
1parent 97eae58b832d521bc35a23b2bec42e8ac957b233	/scm/vtv-tools/commit/97eae58b832d521bc35a23b2bec42e8ac957b233.gph	bitreich.org	70
hAuthor: Troels Henriksen <athas@sigkill.dk>	URL:mailto:athas@sigkill.dk	bitreich.org	70
iDate:   Sun, 17 Sep 2023 15:00:16 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
iRewrite vtv-player in C.	Err	bitreich.org	70
i	Err	bitreich.org	70
iThis is much more efficient when the files are large.	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M .gitignore                          |       1 +	Err	bitreich.org	70
i  M Makefile                            |       8 +++++---	Err	bitreich.org	70
i  D bin/vtv-player                      |      39 -------------------------------	Err	bitreich.org	70
i  M man/vtv-player.1                    |       2 ++	Err	bitreich.org	70
i  A src/vtv-player.c                    |      79 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  M src/vtv-viewer.c                    |       8 --------	Err	bitreich.org	70
i  M src/vtv.h                           |      28 ++++++++++++++++++++--------	Err	bitreich.org	70
i	Err	bitreich.org	70
i7 files changed, 107 insertions(+), 58 deletions(-)	Err	bitreich.org	70
i---	Err	bitreich.org	70
1diff --git a/.gitignore b/.gitignore	/scm/vtv-tools/file/.gitignore.gph	bitreich.org	70
i@@ -1,2 +1,3 @@	Err	bitreich.org	70
i bin/vtv-from-ff	Err	bitreich.org	70
i bin/vtv-viewer	Err	bitreich.org	70
i+bin/vtv-player	Err	bitreich.org	70
1diff --git a/Makefile b/Makefile	/scm/vtv-tools/file/Makefile.gph	bitreich.org	70
i@@ -4,9 +4,10 @@ MANPREFIX ?= ${PREFIX}/share/man	Err	bitreich.org	70
i CFLAGS?=-O -Wall -Wextra -pedantic	Err	bitreich.org	70
i 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+all: bin/vtv-from-ff bin/vtv-viewer bin/vtv-player	Err	bitreich.org	70
i 	Err	bitreich.org	70
i bin/%: src/%.c src/vtv.h	Err	bitreich.org	70
i+        @mkdir -p bin	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@@ -18,6 +19,7 @@ install: all	Err	bitreich.org	70
i         @echo \# Installing manpages to ${MANPREFIX}/man1/	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+.PHONY: all install clean	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-clean: rm bin/vtv-from-ff bin/vtv-viewer	Err	bitreich.org	70
i+clean:	Err	bitreich.org	70
i+        rm -f bin/vtv-from-ff bin/vtv-viewer bin/vtv-player	Err	bitreich.org	70
1diff --git a/bin/vtv-player b/bin/vtv-player	/scm/vtv-tools/file/bin/vtv-player.gph	bitreich.org	70
i@@ -1,39 +0,0 @@	Err	bitreich.org	70
i-#!/bin/sh	Err	bitreich.org	70
i-#	Err	bitreich.org	70
i-# Play a single vtv file in an infinite loop.	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-trap 'clear; tput reset; exit 0' SIGINT	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-fps=20	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-if [ "$1" = "-r" ]; then	Err	bitreich.org	70
i-    fps=$2	Err	bitreich.org	70
i-    shift; shift;	Err	bitreich.org	70
i-fi	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-if [ $# -ne 1 ]; then	Err	bitreich.org	70
i-    echo "Usage: $0 FILE" >&2	Err	bitreich.org	70
i-    exit 1	Err	bitreich.org	70
i-fi	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-vtv="$1"	Err	bitreich.org	70
i-frametime=$(echo "scale =2; 1 / $fps" | bc)	Err	bitreich.org	70
i-framelines=25	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-tput civis	Err	bitreich.org	70
i-clear	Err	bitreich.org	70
i-i=0	Err	bitreich.org	70
i-nframes=$(echo "$(wc -l < "${vtv}")" / "$framelines" | bc)	Err	bitreich.org	70
i-while true; do	Err	bitreich.org	70
i-    tput cup 0 0	Err	bitreich.org	70
i-    tail -n +$(echo "(1+${i} % ${nframes} * ${framelines})" | bc) "$vtv" | head -n $framelines	Err	bitreich.org	70
i-    i=$(($i + 1))	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-    userinput=""	Err	bitreich.org	70
i-    sleep $frametime	Err	bitreich.org	70
i-done	Err	bitreich.org	70
i-	Err	bitreich.org	70
1diff --git a/man/vtv-player.1 b/man/vtv-player.1	/scm/vtv-tools/file/man/vtv-player.1.gph	bitreich.org	70
i@@ -22,6 +22,8 @@ Plays a VTV file in the terminal.  Loops until manually terminated.	Err	bitreich.org	70
i .Bl -tag -width Ds	Err	bitreich.org	70
i .It Fl r Ar fps	Err	bitreich.org	70
i Show this many frames per second.  Defaults to 20.	Err	bitreich.org	70
i+.It Fl h Ar lines	Err	bitreich.org	70
i+The number of lines in a frame.  Defaults to 25.	Err	bitreich.org	70
i .El	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Sh FORMAT	Err	bitreich.org	70
1diff --git a/src/vtv-player.c b/src/vtv-player.c	/scm/vtv-tools/file/src/vtv-player.c.gph	bitreich.org	70
i@@ -0,0 +1,79 @@	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+#include <stdio.h>	Err	bitreich.org	70
i+#include <stdlib.h>	Err	bitreich.org	70
i+#include <unistd.h>	Err	bitreich.org	70
i+#include <errno.h>	Err	bitreich.org	70
i+#include <string.h>	Err	bitreich.org	70
i+#include <signal.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include "vtv.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void hide_cursor() { printf("\033[?25l"); }	Err	bitreich.org	70
i+void show_cursor() { printf("\033[?25h"); }	Err	bitreich.org	70
i+void move(int x, int y) { printf("\033[%d;%dH", y, x); }	Err	bitreich.org	70
i+void home() { printf("\033[;H"); }	Err	bitreich.org	70
i+void clear_screen() { printf("\033[2J"); }	Err	bitreich.org	70
i+void clear_line() { printf("\033[2K"); }	Err	bitreich.org	70
i+void def() { printf("\033[0m"); }	Err	bitreich.org	70
i+void reset() { printf("\033c"); }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void sigint(int unused) {	Err	bitreich.org	70
i+  (void)unused;	Err	bitreich.org	70
i+  reset();	Err	bitreich.org	70
i+  exit(0);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int main(int argc, char* argv[]) {	Err	bitreich.org	70
i+  int fps = 20;	Err	bitreich.org	70
i+  int frame_lines = 25;	Err	bitreich.org	70
i+  const char *vtv_file;	Err	bitreich.org	70
i+  struct vtv* vtv;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+  while (1) {	Err	bitreich.org	70
i+    switch (getopt(argc, argv, "r:h:")) {	Err	bitreich.org	70
i+    case 'r':	Err	bitreich.org	70
i+      fps = atoi(optarg);	Err	bitreich.org	70
i+      break;	Err	bitreich.org	70
i+    case 'h':	Err	bitreich.org	70
i+      frame_lines = atoi(optarg);	Err	bitreich.org	70
i+      break;	Err	bitreich.org	70
i+    case -1:	Err	bitreich.org	70
i+      if (optind == argc-1) {	Err	bitreich.org	70
i+        vtv_file = argv[optind];	Err	bitreich.org	70
i+        goto done;	Err	bitreich.org	70
i+      }	Err	bitreich.org	70
i+      // fallthrough	Err	bitreich.org	70
i+    default:	Err	bitreich.org	70
i+      fprintf(stderr, "Usage: %s [-r INT] FILE\n", argv[0]);	Err	bitreich.org	70
i+      exit(1);	Err	bitreich.org	70
i+    }	Err	bitreich.org	70
i+  }	Err	bitreich.org	70
i+ done:	Err	bitreich.org	70
i+  vtv = vtv_read_from_file(vtv_file);	Err	bitreich.org	70
i+  if (vtv == NULL) {	Err	bitreich.org	70
i+    fprintf(stderr, "%s: cannot read %s: %s\n",	Err	bitreich.org	70
i+            argv[0], vtv_file, strerror(errno));	Err	bitreich.org	70
i+    exit(1);	Err	bitreich.org	70
i+  }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+  int num_frames = vtv->num_lines / frame_lines;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+  hide_cursor();	Err	bitreich.org	70
i+  clear_screen();	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+  int frame = 0;	Err	bitreich.org	70
i+  signal(SIGINT, sigint);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+  while (1) {	Err	bitreich.org	70
i+    useconds_t nap = 1000000.0 / fps;	Err	bitreich.org	70
i+    frame = (frame+1) % num_frames;	Err	bitreich.org	70
i+    home();	Err	bitreich.org	70
i+    vtv_show_frame(vtv, stdout, frame, frame_lines,	Err	bitreich.org	70
i+                   "\033[0m   MISSING LINE");	Err	bitreich.org	70
i+    usleep(nap);	Err	bitreich.org	70
i+  }	Err	bitreich.org	70
i+  def();	Err	bitreich.org	70
i+}	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@@ -41,14 +41,6 @@ void clear_screen() { printf("\033[2J"); }	Err	bitreich.org	70
i void clear_line() { printf("\033[2K"); }	Err	bitreich.org	70
i void def() { printf("\033[0m"); }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-void fg_rgb(uint8_t r, uint8_t g, uint8_t b) {	Err	bitreich.org	70
i-  printf("\033[38;2;%d;%d;%dm", r, g, b);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-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 struct {	Err	bitreich.org	70
i   int frame;	Err	bitreich.org	70
i   int lines_per_frame;	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@@ -15,7 +15,7 @@ struct vtv {	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+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@@ -24,7 +24,7 @@ static void vtv_free(struct vtv* 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+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@@ -47,11 +47,11 @@ static int vtv_read_lines(FILE* f, char*** lines_out, int *num_lines_out) {	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+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@@ -65,7 +65,7 @@ static void vtv_show_frame(struct vtv* vtv,	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_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@@ -74,3 +74,15 @@ static struct vtv* vtv_read(FILE *f) {	Err	bitreich.org	70
i     return NULL;	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+struct vtv* vtv_read_from_file(const char *fname) {	Err	bitreich.org	70
i+  FILE *f = fopen(fname, "r");	Err	bitreich.org	70
i+  if (f == NULL) {	Err	bitreich.org	70
i+    return NULL;	Err	bitreich.org	70
i+  } else {	Err	bitreich.org	70
i+    struct vtv* vtv = vtv_read(f);	Err	bitreich.org	70
i+    fclose(f);	Err	bitreich.org	70
i+    return vtv;	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/3995532c578c...
Content-Typetext/plain; charset=utf-8