ivtv.h - 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 ivtv.h (2139B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 // Single-header library for reading VTV files. Err bitreich.org 70 i 2 // Err bitreich.org 70 i 3 // VTV is an almost trivial format, but there are still a few things Err bitreich.org 70 i 4 // that are convenient to write once and for all (e.g. error Err bitreich.org 70 i 5 // handling). Err bitreich.org 70 i 6 // Err bitreich.org 70 i 7 // Copyright 2023 Troels Henriksen Err bitreich.org 70 i 8 // Err bitreich.org 70 i 9 // See LICENSE file for licensing information. Err bitreich.org 70 i 10 Err bitreich.org 70 i 11 #pragma once Err bitreich.org 70 i 12 Err bitreich.org 70 i 13 struct vtv { Err bitreich.org 70 i 14 int num_lines; Err bitreich.org 70 i 15 char** lines; Err bitreich.org 70 i 16 }; Err bitreich.org 70 i 17 Err bitreich.org 70 i 18 void vtv_free(struct vtv* vtv) { Err bitreich.org 70 i 19 for (int i = 0; i < vtv->num_lines; i++) { Err bitreich.org 70 i 20 free(vtv->lines[i]); Err bitreich.org 70 i 21 } Err bitreich.org 70 i 22 free(vtv->lines); Err bitreich.org 70 i 23 free(vtv); Err bitreich.org 70 i 24 } Err bitreich.org 70 i 25 Err bitreich.org 70 i 26 // Returns nonzero on error. Err bitreich.org 70 i 27 int vtv_read_lines(FILE* f, char*** lines_out, int *num_lines_out) { Err bitreich.org 70 i 28 size_t n, num_lines = 0, capacity = 10; Err bitreich.org 70 i 29 char** lines = calloc(capacity, sizeof(char*)); Err bitreich.org 70 i 30 ssize_t len; Err bitreich.org 70 i 31 Err bitreich.org 70 i 32 while ((len = getline(&lines[num_lines], &n, f)) > 0) { Err bitreich.org 70 i 33 lines[num_lines][len-1] = 0; // Strip newline. Err bitreich.org 70 i 34 if (++num_lines == capacity) { Err bitreich.org 70 i 35 capacity *= 2; Err bitreich.org 70 i 36 lines = reallocarray(lines, capacity, sizeof(char*)); Err bitreich.org 70 i 37 for (unsigned int i = num_lines; i < capacity; i++) { Err bitreich.org 70 i 38 lines[i] = NULL; Err bitreich.org 70 i 39 } Err bitreich.org 70 i 40 } Err bitreich.org 70 i 41 } Err bitreich.org 70 i 42 Err bitreich.org 70 i 43 *lines_out = lines; Err bitreich.org 70 i 44 *num_lines_out = num_lines; Err bitreich.org 70 i 45 return 0; Err bitreich.org 70 i 46 } Err bitreich.org 70 i 47 Err bitreich.org 70 i 48 // Show the given frame on the provided file. If there are not enough Err bitreich.org 70 i 49 // lines, show the provided line instead of the missing ones. Err bitreich.org 70 i 50 void vtv_show_frame(struct vtv* vtv, Err bitreich.org 70 i 51 FILE* f, Err bitreich.org 70 i 52 int frame, Err bitreich.org 70 i 53 int lines_per_frame, Err bitreich.org 70 i 54 const char *missing_line) { Err bitreich.org 70 i 55 for (int i = 0; i < lines_per_frame; i++) { Err bitreich.org 70 i 56 int j = frame*lines_per_frame + i; Err bitreich.org 70 i 57 if (j < vtv->num_lines) { Err bitreich.org 70 i 58 fputs(vtv->lines[j], f); Err bitreich.org 70 i 59 fputc('\n', f); Err bitreich.org 70 i 60 } else { Err bitreich.org 70 i 61 fputs(missing_line, f); Err bitreich.org 70 i 62 fputc('\n', f); Err bitreich.org 70 i 63 } Err bitreich.org 70 i 64 } Err bitreich.org 70 i 65 } Err bitreich.org 70 i 66 Err bitreich.org 70 i 67 // Returns NULL on error. Err bitreich.org 70 i 68 struct vtv* vtv_read(FILE *f) { Err bitreich.org 70 i 69 struct vtv* vtv = malloc(sizeof(struct vtv)); Err bitreich.org 70 i 70 if (vtv_read_lines(f, &vtv->lines, &vtv->num_lines) == 0) { Err bitreich.org 70 i 71 return vtv; Err bitreich.org 70 i 72 } else { Err bitreich.org 70 i 73 free(vtv); Err bitreich.org 70 i 74 return NULL; Err bitreich.org 70 i 75 } Err bitreich.org 70 i 76 } Err bitreich.org 70 i 77 Err bitreich.org 70 i 78 // Returns NULL on error. Err bitreich.org 70 i 79 struct vtv* vtv_read_from_file(const char *fname) { Err bitreich.org 70 i 80 FILE *f = fopen(fname, "r"); Err bitreich.org 70 i 81 if (f == NULL) { Err bitreich.org 70 i 82 return NULL; Err bitreich.org 70 i 83 } else { Err bitreich.org 70 i 84 struct vtv* vtv = vtv_read(f); Err bitreich.org 70 i 85 fclose(f); Err bitreich.org 70 i 86 return vtv; Err bitreich.org 70 i 87 } Err bitreich.org 70 i 88 } Err bitreich.org 70 .