refactor and fix prevous refactoring - ploot - simple plotting tools HTML git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit ca79681acc3c649b67abc21bc0aabe980d5c989c DIR parent 5e3a15dfb77b6b94cba1df9918ce30c6e07d3904 HTML Author: Josuah Demangeon <me@josuah.net> Date: Sat, 22 Feb 2020 23:24:11 +0100 refactor and fix prevous refactoring Diffstat: M Makefile | 4 ++-- M config.mk | 1 + M ploot-braille.c | 59 +++++++++++++++++++++---------- M ploot-feed.c | 31 +++++++++++++++++++------------ A ploot-text.c | 59 +++++++++++++++++++++++++++++++ M src/csv.c | 28 +++++++++++++++++++--------- M src/drawille.c | 9 ++++++--- M src/drawille.h | 2 +- M src/ffplot.c | 2 +- M src/font.c | 2 +- M src/font.h | 3 +-- M src/font13.c | 2 +- D src/font7.c | 743 ------------------------------- M src/font8.c | 304 ++++++++++++++++++++++++++----- M src/tool.c | 31 ++++--------------------------- M src/tool.h | 4 +--- M test.csv | 2 +- 17 files changed, 420 insertions(+), 866 deletions(-) --- DIR diff --git a/Makefile b/Makefile @@ -1,10 +1,10 @@ include config.mk src = src/csv.c src/drawille.c src/ffplot.c src/font.c src/font13.c \ - src/font7.c src/font8.c src/log.c src/scale.c src/tool.c + src/font8.c src/log.c src/scale.c src/tool.c inc = src/csv.h src/drawille.h src/ffplot.h src/font.h src/log.h \ src/scale.h src/tool.h -bin = ploot-farbfeld ploot-feed ploot-braille +bin = ploot-farbfeld ploot-feed ploot-braille ploot-text obj = ${src:.c=.o} lib = -lm DIR diff --git a/config.mk b/config.mk @@ -1,3 +1,4 @@ CFLAGS = -Wall -Wextra -std=c99 -pedantic -fPIC -I"src" -D_POSIX_C_SOURCE=200811L LFLAGS = -static +PREFIX = /usr/local MANDIR = $(PREFIX)/share/man DIR diff --git a/ploot-braille.c b/ploot-braille.c @@ -19,7 +19,7 @@ char const *arg0 = NULL; * Plot the body as an histogram interpolating the gaps and include * a vertical and horizontal axis. */ -int +static int braille_histogram(struct csv *vl, struct drawille *drw, time_t tmin, time_t tmax, double vmin, double vmax) { @@ -37,7 +37,7 @@ braille_histogram(struct csv *vl, struct drawille *drw, continue; y = scale_ypos(*v, vmin, vmax, drw->row * 4); x = scale_xpos(*t, tmin, tmax, drw->col * 2); - if (n < vl->n) + if (n < vl->n) /* only plot when xprev, yprev are set */ drawille_histogram_line(drw, xprev, yprev, x, y, zero); xprev = x; yprev = y; @@ -93,8 +93,10 @@ braille_axis_y(FILE *fp, double vmin, double vmax, int r, int rows) static int braille_render(struct drawille *drw, FILE *fp, double vmin, double vmax) { - for (int row = 0; row < drw->row; row++) { - drawille_put_row(drw, fp, row); + int row; + + for (row = 0; row < drw->row; row++) { + drawille_put_row(fp, drw, row); braille_axis_y(fp, vmin, vmax, row, drw->row); fprintf(fp, "\n"); } @@ -113,17 +115,24 @@ plot(struct csv *vl, FILE *fp, size_t ncol, int row, int col) col -= 8; scale(vl, ncol, &tmin, &tmax, &tstep, &vmin, &vmax, &vstep); - warn("vstep=%lf vstep=%ld", vstep, tstep); - - if ((drw = drawille_new(row, col)) == NULL) - fatal(1, "allocating drawille canvas"); - if (braille_histogram(vl, drw, tmin, tmax, vmin, vmax) == -1) - fatal(1, "allocating drawille canvas"); - if (braille_render(drw, fp, vmin, vmax) == -1) - fatal(1, "rendering braille canvas"); + row -= ncol - 1; /* room for the labels and the scale */ + row /= ncol; /* plot <ncol> times */ + row = MAX(row, 3); /* readable */ + + debug("vstep=%lf vstep=%ld ncol=%zu row=%zu", vstep, tstep, ncol, row); + + for (; ncol > 0; vl++, ncol--) { + assert(drw = drawille_new(row, col)); + fprintf(fp, " %s\n", vl->label); + if (braille_histogram(vl, drw, tmin, tmax, vmin, vmax) == -1) + fatal(1, "allocating drawille canvas"); + if (braille_render(drw, fp, vmin, vmax) == -1) + fatal(1, "rendering braille canvas"); + free(drw); + } if (braille_axis_x(fp, tmin, tmax, tstep, col) == -1) fatal(1, "printing x axis");; - free(drw); + } static void @@ -138,11 +147,27 @@ main(int argc, char **argv) { struct csv *vl; size_t ncol; - int c; + int c, rows, cols; + rows = 20, cols = 80; optind = 0; - while ((c = getopt(argc, argv, "")) > -1) { + while ((c = getopt(argc, argv, "r:c:")) > -1) { switch (c) { + case 'r': + rows = atoi(optarg); + if (rows < 1) { + error("invalid number of rows"); + usage(); + } + break; + case 'c': + cols = atoi(optarg); + if (rows < 1) { + error("invalid number of columns"); + usage(); + } + break; + default: usage(); } @@ -153,12 +178,10 @@ main(int argc, char **argv) if (argc > 0) usage(); - debug("label"); csv_labels(stdin, &vl, &ncol); - debug("values"); csv_values(stdin, vl, ncol); - plot(vl, stdout, ncol, 20, 80); + plot(vl, stdout, ncol, rows, cols); free(vl); return 1; DIR diff --git a/ploot-feed.c b/ploot-feed.c @@ -1,11 +1,12 @@ -#include <time.h> -#include <stdlib.h> -#include <stdio.h> +#include <ctype.h> +#include <errno.h> #include <fcntl.h> #include <limits.h> -#include <string.h> -#include <ctype.h> #include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> #include <unistd.h> #include "tool.h" @@ -57,9 +58,12 @@ plot_row(long *out, char *line, double *max, int nrow, int ncol) int n; char *tok; - if ((tok = strsep(&line, ",")) == NULL) + tok = strsep(&line, ","); + if (!tok) fatal(100, "*** missing epoch value"); - epoch = eatol(tok); + epoch = strtol(tok, NULL, 10); + if (errno) + error("*** parsing epoch '%s'", tok); for (n = 0; (tok = strsep(&line, ",")) != NULL; n++) { if (n >= ncol) @@ -92,7 +96,7 @@ plot_line(long *out, double *max, int ncol) memcpy(o, &rune, sizeof(rune)); out++; - sz = 0; + line = NULL, sz = 0; for (nrow = 0; nrow < 4; nrow++) { if (getline(&line, &sz, stdin) == -1) { if (ferror(stdin)) @@ -172,12 +176,13 @@ read_labels(char **labv) char *cp, *line, *tok; size_t sz; - sz = 0; + line = NULL, sz = 0; if (getline(&line, &sz, stdin) == -1) { if (ferror(stdin)) fatal(111, "reading labels from stdin"); fatal(100, "missing label line", stderr); } + strchomp(line); cp = line; if (strcmp(strsep(&cp, ","), "epoch") != 0) @@ -189,7 +194,6 @@ read_labels(char **labv) if (ncol < 1) fatal(100, "no label found"); - free(line); return ncol; } @@ -236,8 +240,11 @@ main(int argc, char **argv) usage(); nmax = argc; - for (m = max; argc > 0; argc--, argv++, m++) - *m = eatof(*argv); + for (m = max; argc > 0; argc--, argv++, m++) { + *m = strtod(*argv, NULL); + if (errno) + error("*** parsing float '%s'", *argv); + } ncol = read_labels(labv); width = (wflag - sizeof("XXxXXxXX _")) / ncol - sizeof("|"); DIR diff --git a/ploot-text.c b/ploot-text.c @@ -0,0 +1,59 @@ +#include <assert.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> + +#include "drawille.h" +#include "font.h" +#include "tool.h" + +char *arg0 = NULL; + +void +usage(void) +{ + fprintf(stderr, "usage: %s [-123] text\n", arg0); + exit(100); +} + +int +main(int argc, char **argv) +{ + struct font *ft; + struct drawille *drw; + char *text; + int c, row; + + ft = &font8; + optind = 0; + while ((c = getopt(argc, argv, "12")) > -1) { + switch (c) { + case '1': + ft = &font8; + break; + case '2': + ft = &font13; + break; + default: + usage(); + } + } + arg0 = *argv; + argc -= optind; + argv += optind; + + if (argc != 1) + usage(); + + text = *argv; + + assert(drw = drawille_new((ft->height + 3) / 4, font_strlen(ft, text) / 2)); + drawille_text(drw, 0, 0, ft, text); + + for (row = 0; row < drw->row; row++) { + drawille_put_row(stdout, drw, row); + fprintf(stdout, "\n"); + } + + free(drw); +} DIR diff --git a/src/csv.c b/src/csv.c @@ -1,9 +1,11 @@ #include "csv.h" +#include <errno.h> #include <assert.h> #include <string.h> #include <time.h> #include <stdlib.h> +#include <limits.h> #include "log.h" #include "tool.h" @@ -35,22 +37,29 @@ csv_addrow(struct csv *vl, size_t ncol, char *line) { char *field; time_t *tbuf; + long l; + double d; - if ((field = strsep(&line, ",")) == NULL) + field = strsep(&line, ","); + if (!field) fatal(1, "missing epoch at row %zu", vl->n); - csv_addtime(vl, eatol(field)); - for (; (field = strsep(&line, ",")) != NULL; ncol--, vl->n++, vl++) { + l = strtol(field, NULL, 10); + if (errno) + fatal(100, "parsing number '%s'", field); + csv_addtime(vl, l); + tbuf = vl[0].t; + for (; (field = strsep(&line, ",")); ncol--, vl->n++, vl++) { if (ncol == 0) fatal(1, "too many fields at line %zu", vl->n); - csv_addval(vl, eatof(field)); + d = strtod(field, NULL); + if (errno) + fatal(100, "parsing double '%s'", field); + csv_addval(vl, d); + vl->t = tbuf; } if (ncol > 0) fatal(1, "too few fields at line %zu", vl->n); - - /* the same time buffer can be used for all columns */ - for (tbuf = vl->t; ncol > 0; ncol--, vl++) - vl->t = tbuf; } /* @@ -64,6 +73,7 @@ csv_labels(FILE *fp, struct csv **vl, size_t *ncol) size_t sz; ssize_t r; + sz = 0, line = NULL; r = getline(&line, &sz, fp); if (ferror(fp)) fatal(111, "error while reading from file"); @@ -97,7 +107,7 @@ csv_values(FILE *fp, struct csv *vl, size_t ncol) char *line; size_t sz; - sz = 0; + sz = 0, line = NULL; while (getline(&line, &sz, fp) > -1) csv_addrow(vl, ncol, line); if (vl->n == 0) DIR diff --git a/src/drawille.c b/src/drawille.c @@ -8,6 +8,8 @@ #include "font.h" +#include "log.h" /* XXX */ + /* * Terminal-based plotting using drawille character, aka drawille. */ @@ -55,7 +57,7 @@ drawille_get(struct drawille *drw, int row, int col) } size_t -drawille_put_row(struct drawille *drw, FILE *fp, int row) +drawille_put_row(FILE *fp, struct drawille *drw, int row) { char txt[] = "xxx"; size_t n; @@ -145,8 +147,9 @@ drawille_histogram_dot(struct drawille *drw, int x, int y, int zero) int sign; sign = (y > zero) ? (+1) : (-1); - for (; y != zero + sign; y -= sign) + for (; y != zero; y -= sign) drawille_dot(drw, x, y); + drawille_dot(drw, x, y); } void @@ -187,7 +190,7 @@ drawille_text(struct drawille *drw, int x, int y, struct font *font, char *s) { if (drw->row*4 < font->height) return NULL; - for (; *s != '\0' && x < drw->col/2; s++, x++) + for (; *s != '\0' && x < drw->col * 2; s++, x++) x += drawille_text_glyph(drw, x, y, font, *s); return s; } DIR diff --git a/src/drawille.h b/src/drawille.h @@ -17,7 +17,7 @@ struct drawille { }; /**/ -size_t drawille_put_row (struct drawille *, FILE *, int); +size_t drawille_put_row (FILE *, struct drawille *, int); void drawille_dot (struct drawille *, int, int); struct drawille *drawille_new (int, int); void drawille_line (struct drawille *, int, int, int, int); DIR diff --git a/src/ffplot.c b/src/ffplot.c @@ -140,7 +140,7 @@ ffplot_print(FILE *fp, struct ffplot *plot) w = htonl(plot->w); h = htonl(plot->h); - fputs("ffplot", stdout); + fprintf(stdout, "farbfeld"); fwrite(&w, sizeof(w), 1, fp); fwrite(&h, sizeof(h), 1, fp); fwrite(plot->buf, plot->w * plot->h, sizeof(*plot->buf), fp); DIR diff --git a/src/font.c b/src/font.c @@ -15,6 +15,6 @@ font_strlen(struct font *ft, char *s) len = 0; for (; *s != '\0'; s++) - len += font_width(ft, *s); + len += font_width(ft, *s) + 1; return len; } DIR diff --git a/src/font.h b/src/font.h @@ -11,9 +11,8 @@ struct font { char *glyph[128]; /* 0: end, 1: off, 2: on. */ }; -struct font font13; -struct font font7; struct font font8; +struct font font13; /**/ size_t font_width (struct font *, int); DIR diff --git a/src/font13.c b/src/font13.c @@ -1039,7 +1039,7 @@ C(underscore) = { _,_,_,_,_, _,_,_,_,_, _,_,_,_,_, -X ,X,X,X,X,X, + X,X,X,X,X, _,_,_,_,_, _,_,_,_,_, 0}; DIR diff --git a/src/font7.c b/src/font7.c @@ -1,743 +0,0 @@ -#include "font.h" - -#define C(x) static char glyph_##x[] -#define _ 2 -#define X 3 - -C(err) = { - X,X,X,X, - X,_,_,X, - X,_,_,X, - X,_,_,X, - X,_,_,X, - X,_,_,X, - X,_,_,X, - X,X,X,X, -0}; - -C(A) = { - _,_,_,_, - _,X,X,_, - X,_,_,X, - X,_,_,X, - X,X,X,X, - X,_,_,X, - _,_,_,_, - _,_,_,_, -0}; - -C(B) = { - _,_,_,_, - X,X,X,_, - X,_,_,X, - X,X,X,_, - X,_,_,X, - X,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(C) = { - _,_,_,_, - _,X,X,X, - X,_,_,_, - X,_,_,_, - X,_,_,_, - _,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(D) = { - _,_,_,_, - X,X,X,_, - X,_,_,X, - X,_,_,X, - X,_,_,X, - X,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(E) = { - _,_,_,_, - X,X,X,X, - X,_,_,_, - X,X,X,_, - X,_,_,_, - X,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(F) = { - _,_,_,_, - X,X,X,X, - X,_,_,_, - X,X,X,_, - X,_,_,_, - X,_,_,_, - _,_,_,_, - _,_,_,_, -0}; - -C(G) = { - _,_,_,_, - _,X,X,X, - X,_,_,_, - X,_,X,X, - X,_,_,X, - _,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(H) = { - _,_,_,_, - X,_,_,X, - X,_,_,X, - X,X,X,X, - X,_,_,X, - X,_,_,X, - _,_,_,_, - _,_,_,_, -0}; - -C(I) = { - _,_,_, - X,X,X, - _,X,_, - _,X,_, - _,X,_, - X,X,X, - _,_,_, - _,_,_, -0}; - -C(J) = { - _,_,_,_, - _,X,X,X, - _,_,X,_, - _,_,X,_, - _,_,X,_, - X,X,_,_, - _,_,_,_, - _,_,_,_, -0}; - -C(K) = { - _,_,_,_, - X,_,_,X, - X,_,X,_, - X,X,_,_, - X,_,X,_, - X,_,_,X, - _,_,_,_, - _,_,_,_, -0}; - -C(L) = { - _,_,_,_, - X,_,_,_, - X,_,_,_, - X,_,_,_, - X,_,_,_, - X,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(M) = { - _,_,_,_,_, - X,_,_,_,X, - X,X,_,X,X, - X,_,X,_,X, - X,_,_,_,X, - X,_,_,_,X, - _,_,_,_,_, - _,_,_,_,_, -0}; - -C(N) = { - _,_,_,_, - X,_,_,X, - X,X,_,X, - X,X,X,X, - X,_,X,X, - X,_,_,X, - _,_,_,_, - _,_,_,_, -0}; - -C(O) = { - _,_,_,_, - _,X,X,_, - X,_,_,X, - X,_,_,X, - X,_,_,X, - _,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(P) = { - _,_,_,_, - X,X,X,_, - X,_,_,X, - X,X,X,_, - X,_,_,_, - X,_,_,_, - _,_,_,_, - _,_,_,_, -0}; - -C(Q) = { - _,_,_,_, - _,X,X,_, - X,_,_,X, - X,_,_,X, - X,_,X,X, - _,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(R) = { - _,_,_,_, - X,X,X,_, - X,_,_,X, - X,X,X,_, - X,_,X,_, - X,_,_,X, - _,_,_,_, - _,_,_,_, -0}; - -C(S) = { - _,_,_,_, - _,X,X,X, - X,_,_,_, - _,X,X,_, - _,_,_,X, - X,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(T) = { - _,_,_,_, - X,X,X,X, - _,X,X,_, - _,X,X,_, - _,X,X,_, - _,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(U) = { - _,_,_,_, - X,_,_,X, - X,_,_,X, - X,_,_,X, - X,_,_,X, - _,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(V) = { - _,_,_,_, - X,_,_,X, - X,_,_,X, - X,_,X,_, - X,_,X,_, - X,X,_,_, - _,_,_,_, - _,_,_,_, -0}; - -C(W) = { - _,_,_,_,_, - X,_,_,_,X, - X,_,_,_,X, - X,_,X,_,X, - X,_,X,_,X, - _,X,_,X,_, - _,_,_,_,_, - _,_,_,_,_, -0}; - -C(X) = { - _,_,_,_, - X,_,_,X, - X,_,_,X, - _,X,X,_, - X,_,_,X, - X,_,_,X, - _,_,_,_, - _,_,_,_, -0}; - -C(Y) = { - _,_,_,_, - X,_,_,X, - X,_,_,X, - _,X,X,_, - _,X,_,_, - X,_,_,_, - _,_,_,_, - _,_,_,_, -0}; - -C(Z) = { - _,_,_,_, - X,X,X,X, - _,_,_,X, - _,X,X,_, - X,_,_,_, - X,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(a) = { - _,_,_,_, - _,_,_,_, - _,X,X,X, - X,_,_,X, - X,_,_,X, - _,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(b) = { - X,_,_,_, - X,_,_,_, - X,X,X,_, - X,_,_,X, - X,_,_,X, - X,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(c) = { - _,_,_,_, - _,_,_,_, - _,X,X,X, - X,_,_,_, - X,_,_,_, - _,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(d) = { - _,_,_,X, - _,_,_,X, - _,X,X,X, - X,_,_,X, - X,_,_,X, - _,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(e) = { - _,_,_,_, - _,_,_,_, - _,X,X,X, - X,X,X,X, - X,_,_,_, - _,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(f) = { - _,X,X, - X,_,_, - X,_,_, - X,X,_, - X,_,_, - X,_,_, - _,_,_, - _,_,_, -0}; - -C(g) = { - _,_,_,_, - _,_,_,_, - _,X,X,X, - X,_,_,X, - X,_,_,X, - _,X,X,X, - _,_,_,X, - _,X,X,_, -0}; - -C(h) = { - X,_,_,_, - X,_,_,_, - X,X,X,_, - X,_,_,X, - X,_,_,X, - X,_,_,X, - _,_,_,_, - _,_,_,_, -0}; - -C(i) = { - _,X,_, - _,_,_, - X,X,_, - _,X,_, - _,X,_, - _,X,X, - _,_,_, - _,_,_, -0}; - -C(j) = { - _,X,_, - _,_,_, - X,X,_, - _,X,_, - _,X,_, - _,X,_, - _,X,_, - X,_,_, -0}; - -C(k) = { - X,_,_,_, - X,_,_,_, - X,_,_,X, - X,_,X,_, - X,X,X,_, - X,_,_,X, - _,_,_,_, - _,_,_,_, -0}; - -C(l) = { - X,X,_, - _,X,_, - _,X,_, - _,X,_, - _,X,_, - X,X,X, - _,_,_, - _,_,_, -0}; - -C(m) = { - _,_,_,_,_, - _,_,_,_,_, - X,X,X,X,_, - X,_,X,_,X, - X,_,X,_,X, - X,_,X,_,X, - _,_,_,_,_, - _,_,_,_,_, -0}; - -C(n) = { - _,_,_,_, - _,_,_,_, - X,X,X,_, - X,_,_,X, - X,_,_,X, - X,_,_,X, - _,_,_,_, - _,_,_,_, -0}; - -C(o) = { - _,_,_,_, - _,_,_,_, - _,X,X,_, - X,_,_,X, - X,_,_,X, - _,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(p) = { - _,_,_,_, - _,_,_,_, - X,X,X,_, - X,_,_,X, - X,_,_,X, - X,X,X,_, - X,_,_,_, - X,_,_,_, -0}; - -C(q) = { - _,_,_,_, - _,_,_,_, - _,X,X,X, - X,_,_,X, - X,_,_,X, - _,X,X,X, - _,_,_,X, - _,_,_,X, -0}; - -C(r) = { - _,_,_,_, - _,_,_,_, - X,_,X,X, - X,X,_,_, - X,_,_,_, - X,_,_,_, - _,_,_,_, - _,_,_,_, -0}; - -C(s) = { - _,_,_,_, - _,_,_,_, - _,X,X,X, - X,X,_,_, - _,_,X,X, - X,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(t) = { - X,_,_, - X,_,_, - X,X,X, - X,_,_, - X,_,_, - _,X,X, - _,_,_, - _,_,_, -0}; - -C(u) = { - _,_,_,_, - _,_,_,_, - X,_,_,X, - X,_,_,X, - X,_,_,X, - _,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(v) = { - _,_,_,_,_, - _,_,_,_,_, - X,_,_,_,X, - X,_,_,_,X, - _,X,_,X,_, - _,_,X,_,_, - _,_,_,_,_, - _,_,_,_,_, -0}; - -C(w) = { - _,_,_,_,_, - _,_,_,_,_, - X,_,_,_,X, - X,_,X,_,X, - X,_,X,_,X, - _,X,_,X,_, - _,_,_,_,_, - _,_,_,_,_, -0}; - -C(x) = { - _,_,_,_, - _,_,_,_, - X,_,_,X, - _,X,X,_, - _,X,X,_, - X,_,_,X, - _,_,_,_, - _,_,_,_, -0}; - -C(y) = { - _,_,_,_, - _,_,_,_, - X,_,_,X, - X,_,_,X, - X,_,_,X, - _,X,X,X, - _,_,_,X, - _,X,X,_, -0}; - -C(z) = { - _,_,_,_, - _,_,_,_, - X,X,X,X, - _,_,X,_, - _,X,_,_, - X,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(0) = { - _,X,X,_, - X,_,_,X, - X,_,X,X, - X,X,_,X, - X,_,_,X, - _,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(1) = { - _,X,_, - X,X,_, - _,X,_, - _,X,_, - _,X,_, - X,X,X, - _,_,_, - _,_,_, -0}; - -C(2) = { - _,X,X,_, - X,_,_,X, - _,_,_,X, - _,_,X,_, - _,X,_,_, - X,X,X,X, - _,_,_,_, - _,_,_,_, -0}; - -C(3) = { - X,X,X,_, - _,_,_,X, - _,X,X,X, - _,_,_,X, - _,_,_,X, - X,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(4) = { - _,_,X,X, - _,X,_,X, - X,_,_,X, - X,X,X,X, - _,_,_,X, - _,_,_,X, - _,_,_,_, - _,_,_,_, -0}; - -C(5) = { - X,X,X,X, - X,_,_,_, - X,X,X,_, - _,_,_,X, - _,_,_,X, - X,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(6) = { - _,X,X,_, - X,_,_,_, - X,X,X,_, - X,_,_,X, - X,_,_,X, - _,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(7) = { - X,X,X,X, - _,_,_,X, - _,_,X,_, - _,_,X,_, - _,X,_,_, - _,X,_,_, - _,_,_,_, - _,_,_,_, -0}; - -C(8) = { - _,X,X,_, - X,_,_,X, - _,X,X,_, - X,_,_,X, - X,_,_,X, - _,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(9) = { - _,X,X,_, - X,_,_,X, - X,_,_,X, - _,X,X,X, - _,_,_,X, - _,X,X,_, - _,_,_,_, - _,_,_,_, -0}; - -C(space) = { - _,_,_, - _,_,_, - _,_,_, - _,_,_, - _,_,_, - _,_,_, - _,_,_, -0}; - -struct font font7 = { 8, { - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_space, glyph_err, glyph_err, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_0, glyph_1, glyph_2, glyph_3, - glyph_4, glyph_5, glyph_6, glyph_7, - glyph_8, glyph_9, glyph_err, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_err, glyph_A, glyph_B, glyph_C, - glyph_D, glyph_E, glyph_F, glyph_G, - glyph_H, glyph_I, glyph_J, glyph_K, - glyph_L, glyph_M, glyph_N, glyph_O, - glyph_P, glyph_Q, glyph_R, glyph_S, - glyph_T, glyph_U, glyph_V, glyph_W, - glyph_X, glyph_Y, glyph_Z, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err, - glyph_err, glyph_a, glyph_b, glyph_c, - glyph_d, glyph_e, glyph_f, glyph_g, - glyph_h, glyph_i, glyph_j, glyph_k, - glyph_l, glyph_m, glyph_n, glyph_o, - glyph_p, glyph_q, glyph_r, glyph_s, - glyph_t, glyph_u, glyph_v, glyph_w, - glyph_x, glyph_y, glyph_z, glyph_err, - glyph_err, glyph_err, glyph_err, glyph_err -} }; DIR diff --git a/src/font8.c b/src/font8.c @@ -16,64 +16,64 @@ C(error) = { 0}; C(A) = { - _,_,_,_, _,X,X,_, X,_,_,X, X,_,_,X, X,X,X,X, X,_,_,X, + X,_,_,X, _,_,_,_, _,_,_,_, 0}; C(B) = { - _,_,_,_, X,X,X,_, X,_,_,X, X,X,X,_, X,_,_,X, + X,_,_,X, X,X,X,_, _,_,_,_, _,_,_,_, 0}; C(C) = { - _,_,_,_, _,X,X,X, X,_,_,_, X,_,_,_, X,_,_,_, + X,_,_,_, _,X,X,X, _,_,_,_, _,_,_,_, 0}; C(D) = { - _,_,_,_, X,X,X,_, X,_,_,X, X,_,_,X, X,_,_,X, + X,_,_,X, X,X,X,_, _,_,_,_, _,_,_,_, 0}; C(E) = { - _,_,_,_, X,X,X,X, X,_,_,_, X,X,X,_, X,_,_,_, + X,_,_,_, X,X,X,X, _,_,_,_, _,_,_,_, 0}; C(F) = { - _,_,_,_, X,X,X,X, X,_,_,_, + X,_,_,_, X,X,X,_, X,_,_,_, X,_,_,_, @@ -82,9 +82,9 @@ C(F) = { 0}; C(G) = { - _,_,_,_, _,X,X,X, X,_,_,_, + X,_,_,_, X,_,X,X, X,_,_,X, _,X,X,X, @@ -93,7 +93,7 @@ C(G) = { 0}; C(H) = { - _,_,_,_, + X,_,_,X, X,_,_,X, X,_,_,X, X,X,X,X, @@ -104,32 +104,32 @@ C(H) = { 0}; C(I) = { - _,_,_, X,X,X, _,X,_, _,X,_, _,X,_, + _,X,_, X,X,X, _,_,_, _,_,_, 0}; C(J) = { - _,_,_,_, _,X,X,X, _,_,X,_, _,_,X,_, _,_,X,_, + _,_,X,_, X,X,_,_, _,_,_,_, _,_,_,_, 0}; C(K) = { - _,_,_,_, X,_,_,X, X,_,X,_, X,X,_,_, + X,X,_,_, X,_,X,_, X,_,_,X, _,_,_,_, @@ -137,7 +137,7 @@ C(K) = { 0}; C(L) = { - _,_,_,_, + X,_,_,_, X,_,_,_, X,_,_,_, X,_,_,_, @@ -148,21 +148,21 @@ C(L) = { 0}; C(M) = { - _,_,_,_,_, X,_,_,_,X, X,X,_,X,X, X,_,X,_,X, X,_,_,_,X, X,_,_,_,X, + X,_,_,_,X, _,_,_,_,_, _,_,_,_,_, 0}; C(N) = { - _,_,_,_, X,_,_,X, X,X,_,X, - X,X,X,X, + X,X,_,X, + X,_,X,X, X,_,X,X, X,_,_,X, _,_,_,_, @@ -170,20 +170,20 @@ C(N) = { 0}; C(O) = { - _,_,_,_, _,X,X,_, X,_,_,X, X,_,_,X, X,_,_,X, + X,_,_,X, _,X,X,_, _,_,_,_, _,_,_,_, 0}; C(P) = { - _,_,_,_, X,X,X,_, X,_,_,X, + X,_,_,X, X,X,X,_, X,_,_,_, X,_,_,_, @@ -192,10 +192,10 @@ C(P) = { 0}; C(Q) = { - _,_,_,_, _,X,X,_, X,_,_,X, X,_,_,X, + X,_,_,X, X,_,X,X, _,X,X,X, _,_,_,_, @@ -203,9 +203,9 @@ C(Q) = { 0}; C(R) = { - _,_,_,_, X,X,X,_, X,_,_,X, + X,_,_,X, X,X,X,_, X,_,X,_, X,_,_,X, @@ -214,10 +214,10 @@ C(R) = { 0}; C(S) = { - _,_,_,_, _,X,X,X, X,_,_,_, - _,X,X,_, + _,X,_,_, + _,_,X,_, _,_,_,X, X,X,X,_, _,_,_,_, @@ -225,18 +225,18 @@ C(S) = { 0}; C(T) = { - _,_,_,_, - X,X,X,X, - _,X,X,_, - _,X,X,_, - _,X,X,_, - _,X,X,_, - _,_,_,_, - _,_,_,_, + X,X,X,X,X, + _,_,X,_,_, + _,_,X,_,_, + _,_,X,_,_, + _,_,X,_,_, + _,_,X,_,_, + _,_,_,_,_, + _,_,_,_,_, 0}; C(U) = { - _,_,_,_, + X,_,_,X, X,_,_,X, X,_,_,X, X,_,_,X, @@ -247,7 +247,7 @@ C(U) = { 0}; C(V) = { - _,_,_,_, + X,_,_,X, X,_,_,X, X,_,_,X, X,_,X,_, @@ -258,7 +258,7 @@ C(V) = { 0}; C(W) = { - _,_,_,_,_, + X,_,_,_,X, X,_,_,_,X, X,_,_,_,X, X,_,X,_,X, @@ -269,10 +269,10 @@ C(W) = { 0}; C(X) = { - _,_,_,_, X,_,_,X, X,_,_,X, _,X,X,_, + _,X,X,_, X,_,_,X, X,_,_,X, _,_,_,_, @@ -280,7 +280,7 @@ C(X) = { 0}; C(Y) = { - _,_,_,_, + X,_,_,X, X,_,_,X, X,_,_,X, _,X,X,_, @@ -291,10 +291,10 @@ C(Y) = { 0}; C(Z) = { - _,_,_,_, X,X,X,X, _,_,_,X, - _,X,X,_, + _,_,X,_, + _,X,_,_, X,_,_,_, X,X,X,X, _,_,_,_, @@ -707,6 +707,226 @@ C(space) = { _,_,_, 0}; +C(exclam) = { + _,X,_, + _,X,_, + _,X,_, + _,X,_, + _,_,_, + _,X,_, + _,_,_, + _,_,_, +0}; + +C(dquote) = { + X,_,X, + X,_,X, + X,_,X, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, +0}; + +C(hash) = { + _,_,_,_,_, + _,X,_,X,_, + X,X,X,X,X, + _,X,_,X,_, + X,X,X,X,X, + _,X,_,X,_, + _,_,_,_,_, + _,_,_,_,_, +0}; + +C(dollar) = { + _,X,_,_, + X,X,X,X, + X,X,_,_, + _,X,X,_, + _,X,_,X, + X,X,X,X, + _,X,_,_, + _,_,_,_, +0}; + +C(percent) = { + _,_,_,_, + _,_,_,_, + X,_,_,X, + _,_,X,_, + _,X,_,_, + X,_,_,X, + _,_,_,_, + _,_,_,_, +0}; + +C(amp) = { + _,X,_,_, + X,_,X,_, + _,X,_,_, + X,_,X,X, + X,_,X,_, + _,X,X,X, + _,_,_,_, + _,_,_,_, +0}; + +C(squote) = { + _,X,_, + _,X,_, + _,X,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, +0}; + +C(lparen) = { + _,X, + X,_, + X,_, + X,_, + X,_, + X,_, + _,X, + _,_, +0}; + +C(rparen) = { + X,_, + _,X, + _,X, + _,X, + _,X, + _,X, + X,_, + _,_, +0}; + +C(star) = { + _,_,_,_,_, + _,_,X,_,_, + X,_,X,_,X, + _,X,X,X,_, + X,_,X,_,X, + _,_,X,_,_, + _,_,_,_,_, + _,_,_,_,_, +0}; + +C(plus) = { + _,_,_,_,_, + _,_,X,_,_, + _,_,X,_,_, + X,X,X,X,X, + _,_,X,_,_, + _,_,X,_,_, + _,_,_,_,_, + _,_,_,_,_, +0}; + +C(coma) = { + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,X,_, + _,X,_, + X,_,_, + _,_,_, +0}; + +C(minus) = { + _,_,_,_, + _,_,_,_, + _,_,_,_, + X,X,X,X, + _,_,_,_, + _,_,_,_, + _,_,_,_, + _,_,_,_, +0}; + +C(dot) = { + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,X,_, + _,_,_, + _,_,_, +0}; + +C(slash) = { + _,_,X, + _,_,X, + _,X,_, + _,X,_, + X,_,_, + X,_,_, + _,_,_, + _,_,_, +0}; + +C(lbracket) = { + X,X, + _,_, + X,_, + X,_, + X,_, + X,_, + X,X, + _,_, +0}; + +C(rbracket) = { + X,X, + _,X, + _,X, + _,X, + _,X, + _,X, + X,X, + _,_, +0}; + +C(bkslash) = { + X,_,_, + X,_,_, + _,X,_, + _,X,_, + _,_,X, + _,_,X, + _,_,_, + _,_,_, +0}; + +C(hat) = { + _,X,_, + X,_,X, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, +0}; + +C(underscore) = { + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + X,X,X, + _,_,_, + _,_,_, +0}; + struct font font8 = { 8, { glyph_error, glyph_error, glyph_error, glyph_error, glyph_error, glyph_error, glyph_error, glyph_error, @@ -716,10 +936,10 @@ struct font font8 = { 8, { glyph_error, glyph_error, glyph_error, glyph_error, glyph_error, glyph_error, glyph_error, glyph_error, glyph_error, glyph_error, glyph_error, glyph_error, - glyph_space, glyph_error, glyph_error, glyph_error, - glyph_error, glyph_error, glyph_error, glyph_error, - glyph_error, glyph_error, glyph_error, glyph_error, - glyph_error, glyph_error, glyph_error, glyph_error, + glyph_space, glyph_exclam, glyph_dquote, glyph_hash, + glyph_dollar, glyph_percent, glyph_amp, glyph_squote, + glyph_lparen, glyph_rparen, glyph_star, glyph_plus, + glyph_coma, glyph_minus, glyph_dot, glyph_slash, glyph_0, glyph_1, glyph_2, glyph_3, glyph_4, glyph_5, glyph_6, glyph_7, glyph_8, glyph_9, glyph_error, glyph_error, @@ -730,8 +950,8 @@ struct font font8 = { 8, { glyph_L, glyph_M, glyph_N, glyph_O, glyph_P, glyph_Q, glyph_R, glyph_S, glyph_T, glyph_U, glyph_V, glyph_W, - glyph_X, glyph_Y, glyph_Z, glyph_error, - glyph_error, glyph_error, glyph_error, glyph_error, + glyph_X, glyph_Y, glyph_Z, glyph_lbracket, + glyph_bkslash, glyph_rbracket, glyph_hat, glyph_underscore, glyph_error, glyph_a, glyph_b, glyph_c, glyph_d, glyph_e, glyph_f, glyph_g, glyph_h, glyph_i, glyph_j, glyph_k, DIR diff --git a/src/tool.c b/src/tool.c @@ -46,35 +46,12 @@ strsep(char **strp, const char *sep) } void -estriplf(char *line) +strchomp(char *s) { - char *lf; + char *x = s + strlen(s); - if ((lf = strchr(line, '\n')) == NULL || lf[1] != '\0') - fputs("invalid input\n", stderr), exit(1); - *lf = '\0'; -} - -double -eatof(char *str) -{ - char *s; - - for (s = str; *s != '\0'; s++) - if (!isdigit(*s) && *s != '-' && *s != '.') - fputs("invalid float format\n", stderr), exit(1); - return atof(str); -} - -long -eatol(char *str) -{ - char *s; - - for (s = str; *s != '\0'; s++) - if (!isdigit(*s) && *s != '-') - fputs("invalid number format\n", stderr), exit(1); - return atol(str); + while (--x >= s && (*x == '\r' || *x == '\n')) + *x = '\0'; } /* DIR diff --git a/src/tool.h b/src/tool.h @@ -12,9 +12,7 @@ size_t strlcpy (char *, const char *, size_t); void put3utf (long); char * strsep (char **, const char *); -void estriplf (char *); -double eatof (char *); -long eatol (char *); +void strchomp (char *); int humanize (char *, double); #endif DIR diff --git a/test.csv b/test.csv @@ -109,6 +109,6 @@ epoch,shortterm,midterm,longterm 1525294298,0.278198,0.260864,0.242920 1525295198,0.192505,0.183716,0.200806 1525296098,0.109375,0.185669,0.207153 -1525296098,-0.109375,0.185669,0.207153 +1525296098,0.109375,0.185669,0.207153 1525296998,0.137085,0.126221,0.138184 1525297898,0.077881,0.092529,0.109619