iploot-farbfeld.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-farbfeld.c (10488B) 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 Err bitreich.org 70 i 12 #include Err bitreich.org 70 i 13 #include Err bitreich.org 70 i 14 #include "tsv.h" Err bitreich.org 70 i 15 #include "font.h" Err bitreich.org 70 i 16 #include "util.h" Err bitreich.org 70 i 17 Err bitreich.org 70 i 18 #ifndef __OpenBSD__ Err bitreich.org 70 i 19 #define pledge(...) 0 Err bitreich.org 70 i 20 #endif Err bitreich.org 70 i 21 Err bitreich.org 70 i 22 #define MARGIN 8 Err bitreich.org 70 i 23 Err bitreich.org 70 i 24 #define IMAGE_H (TITLE_H + PLOT_H + XLABEL_H) Err bitreich.org 70 i 25 #define IMAGE_W (MARGIN + YLABEL_W + PLOT_W + MARGIN) Err bitreich.org 70 i 26 Err bitreich.org 70 i 27 #define TITLE_X (MARGIN) Err bitreich.org 70 i 28 #define TITLE_Y (IMAGE_H - TITLE_H / 2) Err bitreich.org 70 i 29 #define TITLE_H ((font)->height * 2) Err bitreich.org 70 i 30 #define TITLE_W (PLOT_W) Err bitreich.org 70 i 31 Err bitreich.org 70 i 32 #define YLABEL_X (MARGIN) Err bitreich.org 70 i 33 #define YLABEL_Y (PLOT_Y) Err bitreich.org 70 i 34 #define YLABEL_H (PLOT_H) Err bitreich.org 70 i 35 #define YLABEL_W (40 + MARGIN) Err bitreich.org 70 i 36 Err bitreich.org 70 i 37 #define XLABEL_X (PLOT_X) Err bitreich.org 70 i 38 #define XLABEL_Y (0) Err bitreich.org 70 i 39 #define XLABEL_H ((font)->height * 2) Err bitreich.org 70 i 40 #define XLABEL_W (PLOT_W) Err bitreich.org 70 i 41 Err bitreich.org 70 i 42 #define PLOT_X (YLABEL_X + YLABEL_W) Err bitreich.org 70 i 43 #define PLOT_Y (XLABEL_H) Err bitreich.org 70 i 44 #define PLOT_W (700) Err bitreich.org 70 i 45 #define PLOT_H (160) Err bitreich.org 70 i 46 Err bitreich.org 70 i 47 #define LEGEND_X (IMAGE_W / 2) Err bitreich.org 70 i 48 #define LEGEND_Y (TITLE_Y) Err bitreich.org 70 i 49 #define LEGEND_H (PLOT_H) Err bitreich.org 70 i 50 Err bitreich.org 70 i 51 struct ffcolor { Err bitreich.org 70 i 52 uint16_t red; Err bitreich.org 70 i 53 uint16_t green; Err bitreich.org 70 i 54 uint16_t blue; Err bitreich.org 70 i 55 uint16_t alpha; Err bitreich.org 70 i 56 }; Err bitreich.org 70 i 57 Err bitreich.org 70 i 58 struct ffplot { Err bitreich.org 70 i 59 int w, h, x, y; /* width, height and coordinamtes */ Err bitreich.org 70 i 60 struct ffcolor *buf; Err bitreich.org 70 i 61 }; Err bitreich.org 70 i 62 Err bitreich.org 70 i 63 static struct colorname { Err bitreich.org 70 i 64 char *name; Err bitreich.org 70 i 65 struct ffcolor color; Err bitreich.org 70 i 66 } colorname[] = { Err bitreich.org 70 i 67 /* name red green blue alpha */ Err bitreich.org 70 i 68 { "red", { 0xffff, 0x4444, 0x4444, 0xffff } }, Err bitreich.org 70 i 69 { "orange", { 0xffff, 0x9999, 0x4444, 0xffff } }, Err bitreich.org 70 i 70 { "yellow", { 0xffff, 0xffff, 0x4444, 0xffff } }, Err bitreich.org 70 i 71 { "green", { 0x2222, 0xffff, 0x5555, 0xffff } }, Err bitreich.org 70 i 72 { "cyan", { 0x0000, 0xffff, 0xdddd, 0xffff } }, Err bitreich.org 70 i 73 { "blue", { 0x2222, 0x9999, 0xffff, 0xffff } }, Err bitreich.org 70 i 74 { NULL, { 0, 0, 0, 0 } } Err bitreich.org 70 i 75 }; Err bitreich.org 70 i 76 Err bitreich.org 70 i 77 static char *flag_title = ""; Err bitreich.org 70 i 78 static struct font *font = &font13; Err bitreich.org 70 i 79 Err bitreich.org 70 i 80 /* Err bitreich.org 70 i 81 * Convert (x,y) coordinates to (row,col) for printing into the buffer. Err bitreich.org 70 i 82 * The buffer only contain one number, so the coordinate is a single integer: Err bitreich.org 70 i 83 * width * y + y. Err bitreich.org 70 i 84 * The coordinates are shifted by offx and offy to permit relative coordinates. Err bitreich.org 70 i 85 * Err bitreich.org 70 i 86 * The convention used: y Err bitreich.org 70 i 87 * - (0,0) is at the lower left corner of the plotvas. | Err bitreich.org 70 i 88 * - (0,1) is above it. +--x Err bitreich.org 70 i 89 */ Err bitreich.org 70 i 90 static void Err bitreich.org 70 i 91 ffplot_pixel(struct ffplot *plot, struct ffcolor *color, Err bitreich.org 70 i 92 int x, int y) Err bitreich.org 70 i 93 { Err bitreich.org 70 i 94 x += plot->x; Err bitreich.org 70 i 95 y += plot->y; Err bitreich.org 70 i 96 if (x < 0 || x >= plot->w || y < 0 || y >= plot->h) Err bitreich.org 70 i 97 return; Err bitreich.org 70 i 98 memcpy(plot->buf + plot->w * (plot->h - 1 - y) + x, color, sizeof(*plot->buf)); Err bitreich.org 70 i 99 } Err bitreich.org 70 i 100 Err bitreich.org 70 i 101 static void Err bitreich.org 70 i 102 ffplot_rectangle(struct ffplot *plot, struct ffcolor *color, Err bitreich.org 70 i 103 int y1, int x1, Err bitreich.org 70 i 104 int y2, int x2) Err bitreich.org 70 i 105 { Err bitreich.org 70 i 106 int x, y, ymin, xmin, ymax, xmax; Err bitreich.org 70 i 107 Err bitreich.org 70 i 108 ymin = MIN(y1, y2); ymax = MAX(y1, y2); Err bitreich.org 70 i 109 xmin = MIN(x1, x2); xmax = MAX(x1, x2); Err bitreich.org 70 i 110 Err bitreich.org 70 i 111 for (y = ymin; y <= ymax; y++) Err bitreich.org 70 i 112 for (x = xmin; x <= xmax; x++) Err bitreich.org 70 i 113 ffplot_pixel(plot, color, x, y); Err bitreich.org 70 i 114 } Err bitreich.org 70 i 115 Err bitreich.org 70 i 116 /* Err bitreich.org 70 i 117 * From Bresenham's line algorithm and dcat's tplot. Err bitreich.org 70 i 118 */ Err bitreich.org 70 i 119 static void Err bitreich.org 70 i 120 ffplot_line(struct ffplot *plot, struct ffcolor *color, Err bitreich.org 70 i 121 int x0, int y0, Err bitreich.org 70 i 122 int x1, int y1) Err bitreich.org 70 i 123 { Err bitreich.org 70 i 124 int dy, dx, sy, sx, err, e; Err bitreich.org 70 i 125 Err bitreich.org 70 i 126 sx = x0 < x1 ? 1 : -1; Err bitreich.org 70 i 127 sy = y0 < y1 ? 1 : -1; Err bitreich.org 70 i 128 dx = ABS(x1 - x0); Err bitreich.org 70 i 129 dy = ABS(y1 - y0); Err bitreich.org 70 i 130 err = (dy > dx ? dy : -dx) / 2; Err bitreich.org 70 i 131 Err bitreich.org 70 i 132 for (;;) { Err bitreich.org 70 i 133 ffplot_pixel(plot, color, x0, y0); Err bitreich.org 70 i 134 Err bitreich.org 70 i 135 if (y0 == y1 && x0 == x1) Err bitreich.org 70 i 136 break; Err bitreich.org 70 i 137 Err bitreich.org 70 i 138 e = err; Err bitreich.org 70 i 139 if (e > -dy) { Err bitreich.org 70 i 140 y0 += sy; Err bitreich.org 70 i 141 err -= dx; Err bitreich.org 70 i 142 } Err bitreich.org 70 i 143 if (e < dx) { Err bitreich.org 70 i 144 x0 += sx; Err bitreich.org 70 i 145 err += dy; Err bitreich.org 70 i 146 } Err bitreich.org 70 i 147 } Err bitreich.org 70 i 148 } Err bitreich.org 70 i 149 Err bitreich.org 70 i 150 /* Err bitreich.org 70 i 151 * Draw a coloured glyph from font f centered on y. Err bitreich.org 70 i 152 */ Err bitreich.org 70 i 153 static int Err bitreich.org 70 i 154 ffplot_char(struct ffplot *plot, struct ffcolor *color, struct font *ft, char c, Err bitreich.org 70 i 155 int x, int y) Err bitreich.org 70 i 156 { Err bitreich.org 70 i 157 int yf, xf, wf; Err bitreich.org 70 i 158 Err bitreich.org 70 i 159 if (c & 0x80) Err bitreich.org 70 i 160 c = '\0'; Err bitreich.org 70 i 161 y -= ft->height / 2; Err bitreich.org 70 i 162 wf = font_width(ft, c); Err bitreich.org 70 i 163 for (xf = 0; xf < wf; xf++) Err bitreich.org 70 i 164 for (yf = 0; yf < ft->height; yf++) Err bitreich.org 70 i 165 if (ft->glyph[(int)c][wf * (ft->height - yf) + xf] == 3) Err bitreich.org 70 i 166 ffplot_pixel(plot, color, x + xf, y + yf); Err bitreich.org 70 i 167 return wf + 1; Err bitreich.org 70 i 168 } Err bitreich.org 70 i 169 Err bitreich.org 70 i 170 /* Err bitreich.org 70 i 171 * Draw a left aligned string without wrapping it. Err bitreich.org 70 i 172 */ Err bitreich.org 70 i 173 static size_t Err bitreich.org 70 i 174 ffplot_text_left(struct ffplot *plot, struct ffcolor *color, struct font *ft, Err bitreich.org 70 i 175 char *s, int x, int y) Err bitreich.org 70 i 176 { Err bitreich.org 70 i 177 for (; *s != '\0'; s++) Err bitreich.org 70 i 178 x += ffplot_char(plot, color, ft, *s, x, y); Err bitreich.org 70 i 179 return x; Err bitreich.org 70 i 180 } Err bitreich.org 70 i 181 Err bitreich.org 70 i 182 /* Err bitreich.org 70 i 183 * Draw a center aligned string without wrapping it. Err bitreich.org 70 i 184 */ Err bitreich.org 70 i 185 static size_t Err bitreich.org 70 i 186 ffplot_text_center(struct ffplot *plot, struct ffcolor *color, struct font *ft, Err bitreich.org 70 i 187 char *s, int x, int y) Err bitreich.org 70 i 188 { Err bitreich.org 70 i 189 x -= font_strlen(ft, s) / 2; Err bitreich.org 70 i 190 return ffplot_text_left(plot, color, ft, s, x, y); Err bitreich.org 70 i 191 } Err bitreich.org 70 i 192 Err bitreich.org 70 i 193 /* Err bitreich.org 70 i 194 * Draw a right aligned string without wrapping it. Err bitreich.org 70 i 195 */ Err bitreich.org 70 i 196 static size_t Err bitreich.org 70 i 197 ffplot_text_right(struct ffplot *plot, struct ffcolor *color, struct font *ft, Err bitreich.org 70 i 198 char *s, int x, int y) Err bitreich.org 70 i 199 { Err bitreich.org 70 i 200 x -= font_strlen(ft, s); Err bitreich.org 70 i 201 return ffplot_text_left(plot, color, ft, s, x, y); Err bitreich.org 70 i 202 } Err bitreich.org 70 i 203 Err bitreich.org 70 i 204 static void Err bitreich.org 70 i 205 ffplot_print(FILE *fp, struct ffplot *plot) Err bitreich.org 70 i 206 { Err bitreich.org 70 i 207 uint32_t w, h; Err bitreich.org 70 i 208 Err bitreich.org 70 i 209 w = htonl(plot->w); Err bitreich.org 70 i 210 h = htonl(plot->h); Err bitreich.org 70 i 211 Err bitreich.org 70 i 212 fprintf(stdout, "farbfeld"); Err bitreich.org 70 i 213 fwrite(&w, sizeof(w), 1, fp); Err bitreich.org 70 i 214 fwrite(&h, sizeof(h), 1, fp); Err bitreich.org 70 i 215 fwrite(plot->buf, plot->w * plot->h, sizeof(*plot->buf), fp); Err bitreich.org 70 i 216 } Err bitreich.org 70 i 217 Err bitreich.org 70 i 218 static int Err bitreich.org 70 i 219 ffplot_t2x(time_t t, time_t tmin, time_t tmax) Err bitreich.org 70 i 220 { Err bitreich.org 70 i 221 if (tmin == tmax) Err bitreich.org 70 i 222 return PLOT_W; Err bitreich.org 70 i 223 return (t - tmin) * PLOT_W / (tmax - tmin); Err bitreich.org 70 i 224 } Err bitreich.org 70 i 225 Err bitreich.org 70 i 226 static int Err bitreich.org 70 i 227 ffplot_v2y(double v, double vmin, double vmax) Err bitreich.org 70 i 228 { Err bitreich.org 70 i 229 if (vmin == vmax) Err bitreich.org 70 i 230 return PLOT_H; Err bitreich.org 70 i 231 return (v - vmin) * PLOT_H / (vmax - vmin); Err bitreich.org 70 i 232 } Err bitreich.org 70 i 233 Err bitreich.org 70 i 234 static void Err bitreich.org 70 i 235 ffplot_xaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid, Err bitreich.org 70 i 236 time_t tmin, time_t tmax, time_t tstep) Err bitreich.org 70 i 237 { Err bitreich.org 70 i 238 time_t t; Err bitreich.org 70 i 239 int x; Err bitreich.org 70 i 240 char str[sizeof("MM/DD HH/MM")], *fmt; Err bitreich.org 70 i 241 Err bitreich.org 70 i 242 if (tstep < 3600 * 12) Err bitreich.org 70 i 243 fmt = "%H:%M:%S"; Err bitreich.org 70 i 244 else if (tstep < 3600 * 24) Err bitreich.org 70 i 245 fmt = "%m/%d %H:%M"; Err bitreich.org 70 i 246 else Err bitreich.org 70 i 247 fmt = "%X/%m/%d"; Err bitreich.org 70 i 248 Err bitreich.org 70 i 249 for (t = tmax - tmax % tstep; t >= tmin; t -= tstep) { Err bitreich.org 70 i 250 x = ffplot_t2x(t, tmin, tmax); Err bitreich.org 70 i 251 Err bitreich.org 70 i 252 ffplot_line(plot, grid, Err bitreich.org 70 i 253 x, XLABEL_H, Err bitreich.org 70 i 254 x, XLABEL_H + PLOT_H); Err bitreich.org 70 i 255 Err bitreich.org 70 i 256 strftime(str, sizeof(str), fmt, localtime(&t)); Err bitreich.org 70 i 257 ffplot_text_center(plot, label, font, str, Err bitreich.org 70 i 258 x, XLABEL_H / 2); Err bitreich.org 70 i 259 } Err bitreich.org 70 i 260 } Err bitreich.org 70 i 261 Err bitreich.org 70 i 262 static void Err bitreich.org 70 i 263 ffplot_yaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid, Err bitreich.org 70 i 264 double vmin, double vmax, double vstep) Err bitreich.org 70 i 265 { Err bitreich.org 70 i 266 double v; Err bitreich.org 70 i 267 int y; Err bitreich.org 70 i 268 char str[8 + 1]; Err bitreich.org 70 i 269 Err bitreich.org 70 i 270 for (v = vmax - fmod(vmax, vstep); v >= vmin; v -= vstep) { Err bitreich.org 70 i 271 y = ffplot_v2y(v, vmin, vmax); Err bitreich.org 70 i 272 Err bitreich.org 70 i 273 ffplot_line(plot, grid, Err bitreich.org 70 i 274 YLABEL_W, y, Err bitreich.org 70 i 275 YLABEL_W + PLOT_W, y); Err bitreich.org 70 i 276 Err bitreich.org 70 i 277 humanize(str, v); Err bitreich.org 70 i 278 ffplot_text_right(plot, label, font, str, Err bitreich.org 70 i 279 YLABEL_W - MARGIN, y); Err bitreich.org 70 i 280 } Err bitreich.org 70 i 281 } Err bitreich.org 70 i 282 Err bitreich.org 70 i 283 static void Err bitreich.org 70 i 284 ffplot_title(struct ffplot *plot, struct ffcolor *ct, char *title) Err bitreich.org 70 i 285 { Err bitreich.org 70 i 286 ffplot_text_left(plot, ct, font, title, TITLE_H / 2, 0); Err bitreich.org 70 i 287 } Err bitreich.org 70 i 288 Err bitreich.org 70 i 289 static void Err bitreich.org 70 i 290 ffplot_plot(struct ffplot *plot, struct tsv *vl, struct ffcolor *color, Err bitreich.org 70 i 291 double vmin, double vmax, Err bitreich.org 70 i 292 time_t tmin, time_t tmax) Err bitreich.org 70 i 293 { Err bitreich.org 70 i 294 time_t *tp; Err bitreich.org 70 i 295 double *vp; Err bitreich.org 70 i 296 int x, y, n, ylast, xlast, first; Err bitreich.org 70 i 297 Err bitreich.org 70 i 298 first = 1; Err bitreich.org 70 i 299 for (tp = vl->t, vp = vl->v, n = vl->n; n > 0; n--, vp++, tp++) { Err bitreich.org 70 i 300 y = ffplot_v2y(*vp, vmin, vmax); Err bitreich.org 70 i 301 x = ffplot_t2x(*tp, tmin, tmax); Err bitreich.org 70 i 302 Err bitreich.org 70 i 303 if (!first) Err bitreich.org 70 i 304 ffplot_line(plot, color, xlast, ylast, x, y); Err bitreich.org 70 i 305 Err bitreich.org 70 i 306 ylast = y; Err bitreich.org 70 i 307 xlast = x; Err bitreich.org 70 i 308 first = 0; Err bitreich.org 70 i 309 } Err bitreich.org 70 i 310 } Err bitreich.org 70 i 311 Err bitreich.org 70 i 312 static void Err bitreich.org 70 i 313 ffplot_values(struct ffplot *plot, struct tsv *vl, struct ffcolor **cl, size_t ncol, Err bitreich.org 70 i 314 time_t tmin, time_t tmax, Err bitreich.org 70 i 315 double vmin, double vmax) Err bitreich.org 70 i 316 { Err bitreich.org 70 i 317 for (; ncol > 0; ncol--, vl++, cl++) Err bitreich.org 70 i 318 ffplot_plot(plot, vl, *cl, vmin, vmax, tmin, tmax); Err bitreich.org 70 i 319 } Err bitreich.org 70 i 320 Err bitreich.org 70 i 321 static void Err bitreich.org 70 i 322 ffplot_legend(struct ffplot *plot, struct ffcolor *fg, struct tsv *vl, struct ffcolor **cl, size_t ncol) Err bitreich.org 70 i 323 { Err bitreich.org 70 i 324 size_t x, y; Err bitreich.org 70 i 325 Err bitreich.org 70 i 326 x = y = 0; Err bitreich.org 70 i 327 for (; ncol > 0; ncol--, vl++, cl++) { Err bitreich.org 70 i 328 x = ffplot_text_left(plot, *cl, font, "-", x, y) + MARGIN; Err bitreich.org 70 i 329 x = ffplot_text_left(plot, fg, font, vl->label, x, y); Err bitreich.org 70 i 330 x = ffplot_text_left(plot, fg, font, " ", x, y); Err bitreich.org 70 i 331 } Err bitreich.org 70 i 332 } Err bitreich.org 70 i 333 Err bitreich.org 70 i 334 /* Err bitreich.org 70 i 335 * Plot the 'n' values list of the 'v' arrax with title 'name' label. Err bitreich.org 70 i 336 * Err bitreich.org 70 i 337 * Title Legend Err bitreich.org 70 i 338 * x ^ Err bitreich.org 70 i 339 * label | - + - + - + - + - Err bitreich.org 70 i 340 * here | - + - + - + - + - Err bitreich.org 70 i 341 * +---+---+---+---+--> Err bitreich.org 70 i 342 * x label here Err bitreich.org 70 i 343 */ Err bitreich.org 70 i 344 static void Err bitreich.org 70 i 345 plot(struct tsv *vl, struct ffcolor **cl, size_t ncol, char *name) Err bitreich.org 70 i 346 { Err bitreich.org 70 i 347 struct ffplot plot = { IMAGE_W, IMAGE_H, 0, 0, NULL }; Err bitreich.org 70 i 348 struct ffcolor plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff }; Err bitreich.org 70 i 349 struct ffcolor grid_bg = { 0x2929, 0x2929, 0x2929, 0xffff }; Err bitreich.org 70 i 350 struct ffcolor grid_fg = { 0x3737, 0x3737, 0x3737, 0xffff }; Err bitreich.org 70 i 351 struct ffcolor label_fg = { 0x8888, 0x8888, 0x8888, 0xffff }; Err bitreich.org 70 i 352 struct ffcolor title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff }; Err bitreich.org 70 i 353 double vmin, vmax, vstep; Err bitreich.org 70 i 354 time_t tmin, tmax, tstep; Err bitreich.org 70 i 355 Err bitreich.org 70 i 356 tsv_min_max(vl, ncol, &tmin, &tmax, &vmin, &vmax); Err bitreich.org 70 i 357 tstep = scale_time_t(tmin, tmax, 7); Err bitreich.org 70 i 358 vstep = scale_double(vmin, vmax, 7); Err bitreich.org 70 i 359 Err bitreich.org 70 i 360 if ((plot.buf = calloc(IMAGE_H * IMAGE_W, sizeof *plot.buf)) == NULL) Err bitreich.org 70 i 361 err(1, "calloc: %s", strerror(errno)); Err bitreich.org 70 i 362 Err bitreich.org 70 i 363 plot.y = 0; Err bitreich.org 70 i 364 plot.x = 0; Err bitreich.org 70 i 365 ffplot_rectangle(&plot, &plot_bg, 0, 0, IMAGE_H - 1, IMAGE_W - 1); Err bitreich.org 70 i 366 Err bitreich.org 70 i 367 plot.x = PLOT_X; Err bitreich.org 70 i 368 plot.y = PLOT_Y; Err bitreich.org 70 i 369 ffplot_rectangle(&plot, &grid_bg, 0, 0, PLOT_H, PLOT_W); Err bitreich.org 70 i 370 Err bitreich.org 70 i 371 plot.x = XLABEL_X; Err bitreich.org 70 i 372 plot.y = XLABEL_Y; Err bitreich.org 70 i 373 ffplot_xaxis(&plot, &label_fg, &grid_fg, tmin, tmax, tstep); Err bitreich.org 70 i 374 Err bitreich.org 70 i 375 plot.x = YLABEL_X; Err bitreich.org 70 i 376 plot.y = YLABEL_Y; Err bitreich.org 70 i 377 ffplot_yaxis(&plot, &label_fg, &grid_fg, vmin, vmax, vstep); Err bitreich.org 70 i 378 Err bitreich.org 70 i 379 plot.x = TITLE_X; Err bitreich.org 70 i 380 plot.y = TITLE_Y; Err bitreich.org 70 i 381 ffplot_title(&plot, &title_fg, name); Err bitreich.org 70 i 382 Err bitreich.org 70 i 383 plot.x = PLOT_X; Err bitreich.org 70 i 384 plot.y = PLOT_Y; Err bitreich.org 70 i 385 ffplot_values(&plot, vl, cl, ncol, tmin, tmax, vmin, vmax); Err bitreich.org 70 i 386 Err bitreich.org 70 i 387 plot.x = LEGEND_X; Err bitreich.org 70 i 388 plot.y = LEGEND_Y; Err bitreich.org 70 i 389 ffplot_legend(&plot, &label_fg, vl, cl, ncol); Err bitreich.org 70 i 390 Err bitreich.org 70 i 391 ffplot_print(stdout, &plot); Err bitreich.org 70 i 392 } Err bitreich.org 70 i 393 Err bitreich.org 70 i 394 static struct ffcolor * Err bitreich.org 70 i 395 name_to_color(char *name) Err bitreich.org 70 i 396 { Err bitreich.org 70 i 397 struct colorname *cn; Err bitreich.org 70 i 398 Err bitreich.org 70 i 399 for (cn = colorname; cn->name != NULL; cn++) Err bitreich.org 70 i 400 if (strcmp(name, cn->name) == 0) Err bitreich.org 70 i 401 return &cn->color; Err bitreich.org 70 i 402 return NULL; Err bitreich.org 70 i 403 } Err bitreich.org 70 i 404 Err bitreich.org 70 i 405 static void Err bitreich.org 70 i 406 argv_to_color(struct ffcolor **cl, char **argv) Err bitreich.org 70 i 407 { Err bitreich.org 70 i 408 for (; *argv != NULL; cl++, argv++) Err bitreich.org 70 i 409 if ((*cl = name_to_color(*argv)) == NULL) Err bitreich.org 70 i 410 err(1, "unknown color name: %s", *argv); Err bitreich.org 70 i 411 } Err bitreich.org 70 i 412 Err bitreich.org 70 i 413 static void Err bitreich.org 70 i 414 usage(void) Err bitreich.org 70 i 415 { Err bitreich.org 70 i 416 fprintf(stderr, "usage: %s [-t title] {", arg0); Err bitreich.org 70 i 417 fputs(colorname->name, stderr); Err bitreich.org 70 i 418 for (struct colorname *cn = colorname + 1; cn->name != NULL; cn++) Err bitreich.org 70 i 419 fprintf(stderr, ",%s", cn->name); Err bitreich.org 70 i 420 fputs("}...\n", stderr); Err bitreich.org 70 i 421 exit(1); Err bitreich.org 70 i 422 } Err bitreich.org 70 i 423 Err bitreich.org 70 i 424 int Err bitreich.org 70 i 425 main(int argc, char **argv) Err bitreich.org 70 i 426 { Err bitreich.org 70 i 427 struct tsv *vl; Err bitreich.org 70 i 428 struct ffcolor **cl; Err bitreich.org 70 i 429 size_t ncol; Err bitreich.org 70 i 430 int c; Err bitreich.org 70 i 431 Err bitreich.org 70 i 432 if (pledge("stdio", "") < 0) Err bitreich.org 70 i 433 err(1, "pledge: %s", strerror(errno)); Err bitreich.org 70 i 434 Err bitreich.org 70 i 435 arg0 = *argv; Err bitreich.org 70 i 436 while ((c = getopt(argc, argv, "t:")) > -1) { Err bitreich.org 70 i 437 switch (c) { Err bitreich.org 70 i 438 case 't': Err bitreich.org 70 i 439 flag_title = optarg; Err bitreich.org 70 i 440 break; Err bitreich.org 70 i 441 default: Err bitreich.org 70 i 442 usage(); Err bitreich.org 70 i 443 } Err bitreich.org 70 i 444 } Err bitreich.org 70 i 445 argc -= optind; Err bitreich.org 70 i 446 argv += optind; Err bitreich.org 70 i 447 Err bitreich.org 70 i 448 if (argc == 0) Err bitreich.org 70 i 449 usage(); Err bitreich.org 70 i 450 Err bitreich.org 70 i 451 if ((cl = calloc(argc, sizeof *cl)) == NULL) Err bitreich.org 70 i 452 err(1, "calloc: %s", strerror(errno)); Err bitreich.org 70 i 453 Err bitreich.org 70 i 454 tsv_labels(stdin, &vl, &ncol); Err bitreich.org 70 i 455 if (ncol > (size_t)argc) Err bitreich.org 70 i 456 err(1, "too many columns or not enough arguments"); Err bitreich.org 70 i 457 else if (ncol < (size_t)argc) Err bitreich.org 70 i 458 err(1, "too many arguments or not enough columns"); Err bitreich.org 70 i 459 tsv_values(stdin, vl, ncol); Err bitreich.org 70 i 460 argv_to_color(cl, argv); Err bitreich.org 70 i 461 Err bitreich.org 70 i 462 plot(vl, cl, argc, flag_title); Err bitreich.org 70 i 463 Err bitreich.org 70 i 464 free(vl); Err bitreich.org 70 i 465 free(cl); Err bitreich.org 70 i 466 return 0; Err bitreich.org 70 i 467 } Err bitreich.org 70 .