iploot-feed.c - ploot - simple plotting tools Err bitreich.org 70 hgit clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot URL:git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot bitreich.org 70 1Log /scm/ploot/log.gph bitreich.org 70 1Files /scm/ploot/files.gph bitreich.org 70 1Refs /scm/ploot/refs.gph bitreich.org 70 1Tags /scm/ploot/tag bitreich.org 70 1README /scm/ploot/file/README.md.gph bitreich.org 70 1LICENSE /scm/ploot/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 iploot-feed.c (4792B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #include Err bitreich.org 70 i 2 #include Err bitreich.org 70 i 3 #include Err bitreich.org 70 i 4 #include Err bitreich.org 70 i 5 #include Err bitreich.org 70 i 6 #include Err bitreich.org 70 i 7 #include Err bitreich.org 70 i 8 #include Err bitreich.org 70 i 9 #include Err bitreich.org 70 i 10 #include Err bitreich.org 70 i 11 #include "util.h" Err bitreich.org 70 i 12 Err bitreich.org 70 i 13 #ifndef __OpenBSD__ Err bitreich.org 70 i 14 #define pledge(...) 0 Err bitreich.org 70 i 15 #endif Err bitreich.org 70 i 16 Err bitreich.org 70 i 17 #define WIDTH_MAX 1024 Err bitreich.org 70 i 18 #define BRAILLE_START 10240 Err bitreich.org 70 i 19 Err bitreich.org 70 i 20 static int wflag = 80; Err bitreich.org 70 i 21 static int width = 0; Err bitreich.org 70 i 22 Err bitreich.org 70 i 23 /* Err bitreich.org 70 i 24 * Turn the bit at position (row, col) on in the . Err bitreich.org 70 i 25 */ Err bitreich.org 70 i 26 static void Err bitreich.org 70 i 27 plot_dot(long *out, int row, int col) Err bitreich.org 70 i 28 { Err bitreich.org 70 i 29 long flags[4][2] = { Err bitreich.org 70 i 30 { 0x01, 0x08 }, Err bitreich.org 70 i 31 { 0x02, 0x10 }, Err bitreich.org 70 i 32 { 0x04, 0x20 }, Err bitreich.org 70 i 33 { 0x40, 0x80 }, Err bitreich.org 70 i 34 }; Err bitreich.org 70 i 35 Err bitreich.org 70 i 36 *out |= flags[row][col];; Err bitreich.org 70 i 37 } Err bitreich.org 70 i 38 Err bitreich.org 70 i 39 static void Err bitreich.org 70 i 40 plot_val(long *out, double val, double max, int row) Err bitreich.org 70 i 41 { Err bitreich.org 70 i 42 int col, c; Err bitreich.org 70 i 43 Err bitreich.org 70 i 44 val = MIN(max, val); Err bitreich.org 70 i 45 col = (int)(val * (double)(width - 1) / max * 2); Err bitreich.org 70 i 46 for (c = 0; c < col; c++) Err bitreich.org 70 i 47 plot_dot(out + c / 2, row, c % 2); Err bitreich.org 70 i 48 } Err bitreich.org 70 i 49 Err bitreich.org 70 i 50 /* Err bitreich.org 70 i 51 * Change the braille characters on a whole row, this for all the Err bitreich.org 70 i 52 * values line. Err bitreich.org 70 i 53 */ Err bitreich.org 70 i 54 static time_t Err bitreich.org 70 i 55 plot_row(long *out, char *line, double *max, int nrow, int ncol) Err bitreich.org 70 i 56 { Err bitreich.org 70 i 57 time_t epoch; Err bitreich.org 70 i 58 double val; Err bitreich.org 70 i 59 int n; Err bitreich.org 70 i 60 char *tok; Err bitreich.org 70 i 61 Err bitreich.org 70 i 62 tok = strsep(&line, "\t"); Err bitreich.org 70 i 63 if (!tok) Err bitreich.org 70 i 64 err(100, "*** missing epoch value"); Err bitreich.org 70 i 65 epoch = strtol(tok, NULL, 10); Err bitreich.org 70 i 66 if (errno) Err bitreich.org 70 i 67 warn("*** parsing epoch '%s'", tok); Err bitreich.org 70 i 68 Err bitreich.org 70 i 69 for (n = 0; (tok = strsep(&line, "\t")) != NULL; n++) { Err bitreich.org 70 i 70 if (n >= ncol) Err bitreich.org 70 i 71 err(100, "too many values"); Err bitreich.org 70 i 72 val = atof(tok); Err bitreich.org 70 i 73 plot_val(out + n * width, val, max[n], nrow); Err bitreich.org 70 i 74 } Err bitreich.org 70 i 75 if (n < ncol) Err bitreich.org 70 i 76 err(100, "not enough values"); Err bitreich.org 70 i 77 Err bitreich.org 70 i 78 return epoch; Err bitreich.org 70 i 79 } Err bitreich.org 70 i 80 Err bitreich.org 70 i 81 /* Err bitreich.org 70 i 82 * Read enough input in order to print one line and plot it into 'out'. Err bitreich.org 70 i 83 */ Err bitreich.org 70 i 84 static time_t Err bitreich.org 70 i 85 plot_line(long *out, double *max, int ncol) Err bitreich.org 70 i 86 { Err bitreich.org 70 i 87 time_t epoch; Err bitreich.org 70 i 88 int n, nrow; Err bitreich.org 70 i 89 long *o, rune; Err bitreich.org 70 i 90 char *line; Err bitreich.org 70 i 91 size_t sz; Err bitreich.org 70 i 92 Err bitreich.org 70 i 93 for (rune = BRAILLE_START, o = out, n = ncol * width; n > 0; o++, n--) Err bitreich.org 70 i 94 memcpy(o, &rune, sizeof(rune)); Err bitreich.org 70 i 95 *o = '\0'; Err bitreich.org 70 i 96 for (rune = 0x2502, o = out, n = 0; n < ncol; o += width, n++) Err bitreich.org 70 i 97 memcpy(o, &rune, sizeof(rune)); Err bitreich.org 70 i 98 out++; Err bitreich.org 70 i 99 Err bitreich.org 70 i 100 line = NULL, sz = 0; Err bitreich.org 70 i 101 for (nrow = 0; nrow < 4; nrow++) { Err bitreich.org 70 i 102 if (getline(&line, &sz, stdin) == -1) { Err bitreich.org 70 i 103 if (ferror(stdin)) Err bitreich.org 70 i 104 err(111, "reading row from stdin"); Err bitreich.org 70 i 105 exit(0); Err bitreich.org 70 i 106 } Err bitreich.org 70 i 107 epoch = plot_row(out, line, max, nrow, ncol); Err bitreich.org 70 i 108 } Err bitreich.org 70 i 109 Err bitreich.org 70 i 110 free(line); Err bitreich.org 70 i 111 return epoch; Err bitreich.org 70 i 112 } Err bitreich.org 70 i 113 Err bitreich.org 70 i 114 static void Err bitreich.org 70 i 115 put_time(time_t epoch, time_t last, int nline) Err bitreich.org 70 i 116 { Err bitreich.org 70 i 117 char *out, buf[sizeof("XXxXXxXX ")]; Err bitreich.org 70 i 118 Err bitreich.org 70 i 119 switch (nline % 3) { Err bitreich.org 70 i 120 case 0: Err bitreich.org 70 i 121 strftime(buf, sizeof(buf), "%H:%M:%S _", localtime(&epoch)); Err bitreich.org 70 i 122 out = buf; Err bitreich.org 70 i 123 break; Err bitreich.org 70 i 124 case 1: Err bitreich.org 70 i 125 strftime(buf, sizeof(buf), "%y/%m/%d ", localtime(&last)); Err bitreich.org 70 i 126 out = buf; Err bitreich.org 70 i 127 break; Err bitreich.org 70 i 128 case 2: Err bitreich.org 70 i 129 out = " "; Err bitreich.org 70 i 130 break; Err bitreich.org 70 i 131 } Err bitreich.org 70 i 132 Err bitreich.org 70 i 133 fputs(out, stdout); Err bitreich.org 70 i 134 } Err bitreich.org 70 i 135 Err bitreich.org 70 i 136 static void Err bitreich.org 70 i 137 put_line(long *out) Err bitreich.org 70 i 138 { Err bitreich.org 70 i 139 for (; *out != '\0'; out++) Err bitreich.org 70 i 140 put3utf(*out); Err bitreich.org 70 i 141 puts("│"); Err bitreich.org 70 i 142 } Err bitreich.org 70 i 143 Err bitreich.org 70 i 144 static void Err bitreich.org 70 i 145 plot(char labels[4069], double *max, int ncol) Err bitreich.org 70 i 146 { Err bitreich.org 70 i 147 time_t epoch, last_epoch; Err bitreich.org 70 i 148 long out[WIDTH_MAX + 1]; Err bitreich.org 70 i 149 int n; Err bitreich.org 70 i 150 Err bitreich.org 70 i 151 last_epoch = epoch = 0; Err bitreich.org 70 i 152 Err bitreich.org 70 i 153 for (n = 0;; n = (n == 25 ? 0 : n + 1)) { Err bitreich.org 70 i 154 if (n == 0) { Err bitreich.org 70 i 155 put_time(0, 0, 2); Err bitreich.org 70 i 156 fputs(labels, stdout); Err bitreich.org 70 i 157 puts("│"); Err bitreich.org 70 i 158 } Err bitreich.org 70 i 159 Err bitreich.org 70 i 160 epoch = plot_line(out, max, ncol); Err bitreich.org 70 i 161 put_time(epoch, last_epoch, n); Err bitreich.org 70 i 162 last_epoch = epoch; Err bitreich.org 70 i 163 put_line(out); Err bitreich.org 70 i 164 Err bitreich.org 70 i 165 fflush(stdout); Err bitreich.org 70 i 166 } Err bitreich.org 70 i 167 } Err bitreich.org 70 i 168 Err bitreich.org 70 i 169 /* Err bitreich.org 70 i 170 * Label must be able to store all pointers to token buf has to Err bitreich.org 70 i 171 * offer: sizeof(*buf / 2). Err bitreich.org 70 i 172 */ Err bitreich.org 70 i 173 static int Err bitreich.org 70 i 174 read_labels(char **labv) Err bitreich.org 70 i 175 { Err bitreich.org 70 i 176 int ncol; Err bitreich.org 70 i 177 char *cp, *line, *tok; Err bitreich.org 70 i 178 size_t sz; Err bitreich.org 70 i 179 Err bitreich.org 70 i 180 line = NULL, sz = 0; Err bitreich.org 70 i 181 if (getline(&line, &sz, stdin) == -1) { Err bitreich.org 70 i 182 if (ferror(stdin)) Err bitreich.org 70 i 183 err(111, "reading labels from stdin"); Err bitreich.org 70 i 184 err(100, "missing label line", stderr); Err bitreich.org 70 i 185 } Err bitreich.org 70 i 186 strchomp(line); Err bitreich.org 70 i 187 cp = line; Err bitreich.org 70 i 188 Err bitreich.org 70 i 189 if (strcmp(strsep(&cp, "\t"), "epoch") != 0) Err bitreich.org 70 i 190 err(100, "first label must be 'epoch'"); Err bitreich.org 70 i 191 Err bitreich.org 70 i 192 for (ncol = 0; (tok = strsep(&cp, "\t")) != NULL; ncol++, labv++) Err bitreich.org 70 i 193 *labv = tok; Err bitreich.org 70 i 194 *labv = NULL; Err bitreich.org 70 i 195 Err bitreich.org 70 i 196 if (ncol < 1) Err bitreich.org 70 i 197 err(100, "no label found"); Err bitreich.org 70 i 198 return ncol; Err bitreich.org 70 i 199 } Err bitreich.org 70 i 200 Err bitreich.org 70 i 201 static void Err bitreich.org 70 i 202 fmt_labels(char out[4069], int ncol, char *labels[4069 / 2]) Err bitreich.org 70 i 203 { Err bitreich.org 70 i 204 int i, n; Err bitreich.org 70 i 205 Err bitreich.org 70 i 206 for (i = 0; i < ncol; labels++, i++) { Err bitreich.org 70 i 207 n = 4069 - (width + sizeof("│")) * i; Err bitreich.org 70 i 208 out += snprintf(out, n, "│%-*s", width - 1, *labels); Err bitreich.org 70 i 209 } Err bitreich.org 70 i 210 } Err bitreich.org 70 i 211 Err bitreich.org 70 i 212 static void Err bitreich.org 70 i 213 usage(void) Err bitreich.org 70 i 214 { Err bitreich.org 70 i 215 fprintf(stderr, "usage: %s [-w width] maxval... -1) { Err bitreich.org 70 i 232 switch (c) { Err bitreich.org 70 i 233 case 'w': Err bitreich.org 70 i 234 wflag = atoi(optarg); Err bitreich.org 70 i 235 break; Err bitreich.org 70 i 236 default: Err bitreich.org 70 i 237 usage(); Err bitreich.org 70 i 238 } Err bitreich.org 70 i 239 } Err bitreich.org 70 i 240 argc -= optind; Err bitreich.org 70 i 241 argv += optind; Err bitreich.org 70 i 242 Err bitreich.org 70 i 243 if (argc == 0) Err bitreich.org 70 i 244 usage(); Err bitreich.org 70 i 245 Err bitreich.org 70 i 246 nmax = argc; Err bitreich.org 70 i 247 for (m = max; argc > 0; argc--, argv++, m++) { Err bitreich.org 70 i 248 *m = strtod(*argv, NULL); Err bitreich.org 70 i 249 if (errno) Err bitreich.org 70 i 250 warn("*** parsing float '%s'", *argv); Err bitreich.org 70 i 251 } Err bitreich.org 70 i 252 Err bitreich.org 70 i 253 ncol = read_labels(labv); Err bitreich.org 70 i 254 width = (wflag - sizeof("XXxXXxXX _")) / ncol - sizeof("|"); Err bitreich.org 70 i 255 fmt_labels(labels, ncol, labv); Err bitreich.org 70 i 256 if (ncol != nmax) Err bitreich.org 70 i 257 err(100, "not as many labels and arguments"); Err bitreich.org 70 i 258 plot(labels, max, ncol); Err bitreich.org 70 i 259 Err bitreich.org 70 i 260 return 0; Err bitreich.org 70 i 261 } Err bitreich.org 70 .