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