itsv.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 itsv.c (3148B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #include "tsv.h" 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 "util.h" Err bitreich.org 70 i 10 Err bitreich.org 70 i 11 /* Err bitreich.org 70 i 12 * Read TSV data onto a set of (struct tsv) and some utilities to work on these data. Err bitreich.org 70 i 13 */ Err bitreich.org 70 i 14 Err bitreich.org 70 i 15 int Err bitreich.org 70 i 16 tsv_min_max(struct tsv *vl, int ncol, Err bitreich.org 70 i 17 time_t *tmin, time_t *tmax, Err bitreich.org 70 i 18 double *vmin, double *vmax) Err bitreich.org 70 i 19 { Err bitreich.org 70 i 20 double *v; Err bitreich.org 70 i 21 time_t *t; Err bitreich.org 70 i 22 size_t n; Err bitreich.org 70 i 23 Err bitreich.org 70 i 24 *vmin = *vmax = 0; /* always show 0 on the scale */ Err bitreich.org 70 i 25 *tmin = *tmax = *vl->t; Err bitreich.org 70 i 26 Err bitreich.org 70 i 27 for (; ncol > 0; ncol--, vl++) { Err bitreich.org 70 i 28 for (t = vl->t, v = vl->v, n = vl->n; n > 0; t++, v++, n--) { Err bitreich.org 70 i 29 if (*v < *vmin) *vmin = *v; Err bitreich.org 70 i 30 if (*v > *vmax) *vmax = *v; Err bitreich.org 70 i 31 if (*t < *tmin) *tmin = *t; Err bitreich.org 70 i 32 if (*t > *tmax) *tmax = *t; Err bitreich.org 70 i 33 } Err bitreich.org 70 i 34 } Err bitreich.org 70 i 35 if (*tmin == *tmax) Err bitreich.org 70 i 36 return -1; Err bitreich.org 70 i 37 return 0; Err bitreich.org 70 i 38 } Err bitreich.org 70 i 39 Err bitreich.org 70 i 40 static void Err bitreich.org 70 i 41 tsv_add_time(struct tsv *vl, time_t epoch) Err bitreich.org 70 i 42 { Err bitreich.org 70 i 43 void *mem; Err bitreich.org 70 i 44 Err bitreich.org 70 i 45 if ((mem = realloc(vl->t, (vl->n + 1) * sizeof *vl->t)) == NULL) Err bitreich.org 70 i 46 err(1, "realloc: %s", strerror(errno)); Err bitreich.org 70 i 47 vl->t = mem; Err bitreich.org 70 i 48 vl->t[vl->n] = epoch; Err bitreich.org 70 i 49 } Err bitreich.org 70 i 50 Err bitreich.org 70 i 51 static void Err bitreich.org 70 i 52 tsv_add_val(struct tsv *vl, double field) Err bitreich.org 70 i 53 { Err bitreich.org 70 i 54 void *mem; Err bitreich.org 70 i 55 Err bitreich.org 70 i 56 if ((mem = realloc(vl->v, (vl->n + 1) * sizeof *vl->v)) == NULL) Err bitreich.org 70 i 57 err(1, "", strerror(errno)); Err bitreich.org 70 i 58 vl->v = mem; Err bitreich.org 70 i 59 vl->v[vl->n] = field; Err bitreich.org 70 i 60 } Err bitreich.org 70 i 61 Err bitreich.org 70 i 62 /* Err bitreich.org 70 i 63 * Add to each column the value on the current row. The time_t Err bitreich.org 70 i 64 * buffer is shared among all fields. Err bitreich.org 70 i 65 */ Err bitreich.org 70 i 66 static void Err bitreich.org 70 i 67 tsv_add_row(struct tsv *vl, size_t ncol, char *line) Err bitreich.org 70 i 68 { Err bitreich.org 70 i 69 char *field; Err bitreich.org 70 i 70 time_t *tbuf; Err bitreich.org 70 i 71 long l; Err bitreich.org 70 i 72 double d; Err bitreich.org 70 i 73 Err bitreich.org 70 i 74 if ((field = strsep(&line, "\t")) == NULL) Err bitreich.org 70 i 75 err(1, "missing epoch at row %zu", vl->n); Err bitreich.org 70 i 76 Err bitreich.org 70 i 77 l = strtol(field, NULL, 10); Err bitreich.org 70 i 78 if (errno) Err bitreich.org 70 i 79 err(100, "parsing number '%s'", field); Err bitreich.org 70 i 80 Err bitreich.org 70 i 81 tsv_add_time(vl, l); Err bitreich.org 70 i 82 tbuf = vl[0].t; Err bitreich.org 70 i 83 for (; (field = strsep(&line, "\t")); ncol--, vl->n++, vl++) { Err bitreich.org 70 i 84 if (ncol == 0) Err bitreich.org 70 i 85 err(1, "too many fields at line %zu", vl->n); Err bitreich.org 70 i 86 d = strtod(field, NULL); Err bitreich.org 70 i 87 if (errno) Err bitreich.org 70 i 88 err(100, "parsing double '%s'", field); Err bitreich.org 70 i 89 tsv_add_val(vl, d); Err bitreich.org 70 i 90 vl->t = tbuf; Err bitreich.org 70 i 91 } Err bitreich.org 70 i 92 if (ncol > 0) Err bitreich.org 70 i 93 err(1, "too few fields at line %zu", vl->n); Err bitreich.org 70 i 94 } Err bitreich.org 70 i 95 Err bitreich.org 70 i 96 /* Err bitreich.org 70 i 97 * < (ncol) > Err bitreich.org 70 i 98 * label1,label2,label3 Err bitreich.org 70 i 99 */ Err bitreich.org 70 i 100 void Err bitreich.org 70 i 101 tsv_labels(FILE *fp, struct tsv **vlp, size_t *ncol) Err bitreich.org 70 i 102 { Err bitreich.org 70 i 103 char *field, *line, *cp; Err bitreich.org 70 i 104 struct tsv *vl, *col; Err bitreich.org 70 i 105 size_t sz; Err bitreich.org 70 i 106 Err bitreich.org 70 i 107 sz = 0, line = NULL; Err bitreich.org 70 i 108 getline(&line, &sz, fp); Err bitreich.org 70 i 109 if (ferror(fp)) Err bitreich.org 70 i 110 err(111, "error while reading from file"); Err bitreich.org 70 i 111 if (feof(fp)) Err bitreich.org 70 i 112 err(100, "missing label line"); Err bitreich.org 70 i 113 strchomp(line); Err bitreich.org 70 i 114 Err bitreich.org 70 i 115 cp = line; Err bitreich.org 70 i 116 if (strcmp(strsep(&cp, "\t"), "epoch") != 0) Err bitreich.org 70 i 117 err(1, "first label must be 'epoch'"); Err bitreich.org 70 i 118 Err bitreich.org 70 i 119 sz = 0, vl = NULL, *ncol = 0; Err bitreich.org 70 i 120 while ((field = strsep(&cp, "\t"))) { Err bitreich.org 70 i 121 if ((vl = realloc(vl, sz += sizeof *vl)) == NULL) Err bitreich.org 70 i 122 err(1, "realloc: %s", strerror(errno)); Err bitreich.org 70 i 123 col = vl + (*ncol)++; Err bitreich.org 70 i 124 memset(col, 0, sizeof *vl); Err bitreich.org 70 i 125 strlcpy(col->label, field, sizeof col->label); Err bitreich.org 70 i 126 } Err bitreich.org 70 i 127 free(line); Err bitreich.org 70 i 128 *vlp = vl; Err bitreich.org 70 i 129 } Err bitreich.org 70 i 130 Err bitreich.org 70 i 131 /* Err bitreich.org 70 i 132 * < (ncol) > Err bitreich.org 70 i 133 * val1a,val1b,val1c ^ Err bitreich.org 70 i 134 * val2a,val2b,val2c | Err bitreich.org 70 i 135 * val3a,val3b,val3c (vl->n) Err bitreich.org 70 i 136 * val4a,val4b,val4c | Err bitreich.org 70 i 137 * val5a,val5b,val5c v Err bitreich.org 70 i 138 */ Err bitreich.org 70 i 139 void Err bitreich.org 70 i 140 tsv_values(FILE *fp, struct tsv *vl, size_t ncol) Err bitreich.org 70 i 141 { Err bitreich.org 70 i 142 char *line; Err bitreich.org 70 i 143 size_t sz; Err bitreich.org 70 i 144 Err bitreich.org 70 i 145 sz = 0, line = NULL; Err bitreich.org 70 i 146 while (getline(&line, &sz, fp) > -1) Err bitreich.org 70 i 147 tsv_add_row(vl, ncol, line); Err bitreich.org 70 i 148 if (vl->n == 0) Err bitreich.org 70 i 149 err(1, "no value could be read"); Err bitreich.org 70 i 150 if (vl->n == 1) Err bitreich.org 70 i 151 err(1, "only one value could be read"); Err bitreich.org 70 i 152 free(line); Err bitreich.org 70 i 153 } Err bitreich.org 70 .