SMOLNET PORTAL home about changes
iflatten the repository and simplify Makefile - 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
1commit a546b97f9fe7f4a9e30b514bfc257ba85cd9a7f9	/scm/ploot/commit/a546b97f9fe7f4a9e30b514bfc257ba85cd9a7f9.gph	bitreich.org	70
1parent 1a7e49697644fe2740519b2c5f62a314e675c616	/scm/ploot/commit/1a7e49697644fe2740519b2c5f62a314e675c616.gph	bitreich.org	70
hAuthor: Josuah Demangeon <me@josuah.net>	URL:mailto:me@josuah.net	bitreich.org	70
iDate:   Tue, 22 Jun 2021 00:32:54 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
iflatten the repository and simplify Makefile	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M Makefile                            |      34 +++++++++++++++++--------------	Err	bitreich.org	70
i  D README                              |      60 -------------------------------	Err	bitreich.org	70
i  A README.md                           |      57 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  D config.mk                           |       4 ----	Err	bitreich.org	70
i  A csv.c                               |     132 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A csv.h                               |      22 ++++++++++++++++++++++	Err	bitreich.org	70
i  A drawille.c                          |     194 ++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A drawille.h                          |      25 +++++++++++++++++++++++++	Err	bitreich.org	70
i  R test.csv -> example.csv             |       0 	Err	bitreich.org	70
i  A ffplot.c                            |     148 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A ffplot.h                            |      34 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  R src/font.c -> font.c                |       0 	Err	bitreich.org	70
i  A font.h                              |      20 ++++++++++++++++++++	Err	bitreich.org	70
i  R src/font13.c -> font13.c            |       0 	Err	bitreich.org	70
i  R src/font8.c -> font8.c              |       0 	Err	bitreich.org	70
i  M ploot-braille.c                     |      36 ++++++++++++++-----------------	Err	bitreich.org	70
i  M ploot-csv.5                         |       6 +++---	Err	bitreich.org	70
i  M ploot-farbfeld.1                    |      16 ++++++++--------	Err	bitreich.org	70
i  M ploot-farbfeld.c                    |      67 +++++++++++++++----------------	Err	bitreich.org	70
i  M ploot-feed.1                        |       2 +-	Err	bitreich.org	70
i  M ploot-feed.c                        |      27 ++++++++++++---------------	Err	bitreich.org	70
i  M ploot-text.c                        |      19 ++++++++++++-------	Err	bitreich.org	70
i  D proto.sh                            |      73 -------------------------------	Err	bitreich.org	70
i  A scale.c                             |      94 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A scale.h                             |      14 ++++++++++++++	Err	bitreich.org	70
i  D src/csv.c                           |     122 -------------------------------	Err	bitreich.org	70
i  D src/csv.h                           |      23 -----------------------	Err	bitreich.org	70
i  D src/drawille.c                      |     196 -------------------------------	Err	bitreich.org	70
i  D src/drawille.h                      |      28 ----------------------------	Err	bitreich.org	70
i  D src/ffplot.c                        |     148 -------------------------------	Err	bitreich.org	70
i  D src/ffplot.h                        |      35 -------------------------------	Err	bitreich.org	70
i  D src/font.h                          |      21 ---------------------	Err	bitreich.org	70
i  D src/log.c                           |      97 ------------------------------	Err	bitreich.org	70
i  D src/log.h                           |      15 ---------------	Err	bitreich.org	70
i  D src/scale.c                         |      95 ------------------------------	Err	bitreich.org	70
i  D src/scale.h                         |      16 ----------------	Err	bitreich.org	70
i  D src/util.c                          |      80 -------------------------------	Err	bitreich.org	70
i  D src/util.h                          |      18 ------------------	Err	bitreich.org	70
i  A util.c                              |     124 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A util.h                              |      22 ++++++++++++++++++++++	Err	bitreich.org	70
i	Err	bitreich.org	70
i40 files changed, 990 insertions(+), 1134 deletions(-)	Err	bitreich.org	70
i---	Err	bitreich.org	70
1diff --git a/Makefile b/Makefile	/scm/ploot/file/Makefile.gph	bitreich.org	70
i@@ -1,27 +1,31 @@	Err	bitreich.org	70
i-include config.mk	Err	bitreich.org	70
i+NAME = ploot	Err	bitreich.org	70
i+VERSION = v0.1	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-src = src/csv.c src/drawille.c src/ffplot.c src/font.c src/font13.c \	Err	bitreich.org	70
i-        src/font8.c src/log.c src/scale.c src/util.c	Err	bitreich.org	70
i-inc = src/csv.h src/drawille.h src/ffplot.h src/font.h src/log.h \	Err	bitreich.org	70
i-        src/scale.h src/util.h	Err	bitreich.org	70
i-bin = ploot-farbfeld ploot-feed ploot-braille ploot-text	Err	bitreich.org	70
i-obj = ${src:.c=.o}	Err	bitreich.org	70
i-lib = -lm	Err	bitreich.org	70
i+D = -D_POSIX_C_SOURCE=200811L -D_BSD_SOURCE	Err	bitreich.org	70
i+CFLAGS = -Wall -Wextra -std=c99 -pedantic $W $D -fPIC	Err	bitreich.org	70
i+LFLAGS = -static -lm	Err	bitreich.org	70
i+PREFIX = /usr/local	Err	bitreich.org	70
i+MANOREFIX = $(PREFIX)/share/man	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-all: ${bin}	Err	bitreich.org	70
i+SRC = csv.c drawille.c ffplot.c font.c font13.c font8.c scale.c util.c	Err	bitreich.org	70
i+INC = csv.h drawille.h ffplot.h font.h scale.h util.h	Err	bitreich.org	70
i+BIN = ploot-farbfeld ploot-feed ploot-braille ploot-text	Err	bitreich.org	70
i+OBJ = ${SRC:.c=.o}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+all: ${BIN}	Err	bitreich.org	70
i 	Err	bitreich.org	70
i .c.o:	Err	bitreich.org	70
i         ${CC} -c ${CFLAGS} -o $@ $<	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-${obj} ${bin:=.o}: ${inc} Makefile	Err	bitreich.org	70
i-${bin}: ${obj} ${bin:=.o}	Err	bitreich.org	70
i-        ${CC} ${LFLAGS} -o $@ $@.o ${obj} ${lib}	Err	bitreich.org	70
i+${OBJ} ${BIN:=.o}: ${INC} Makefile	Err	bitreich.org	70
i+${BIN}: ${OBJ} ${BIN:=.o}	Err	bitreich.org	70
i+        ${CC} ${LFLAGS} -o $@ $@.o ${OBJ}	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-install: ${bin}	Err	bitreich.org	70
i+install: ${BIN}	Err	bitreich.org	70
i         mkdir -p ${PREFIX}/bin ${MANDIR}/man1 ${MANDIR}/man5	Err	bitreich.org	70
i-        cp ${bin} ${PREFIX}/bin	Err	bitreich.org	70
i+        cp ${BIN} ${PREFIX}/bin	Err	bitreich.org	70
i         cp *.1 ${MANDIR}/man1	Err	bitreich.org	70
i         cp *.5 ${MANDIR}/man5	Err	bitreich.org	70
i 	Err	bitreich.org	70
i clean:	Err	bitreich.org	70
i-        rm -f *.o */*.o ${bin}	Err	bitreich.org	70
i+        rm -f *.o ${BIN}	Err	bitreich.org	70
1diff --git a/README b/README	/scm/ploot/file/README.gph	bitreich.org	70
i@@ -1,60 +0,0 @@	Err	bitreich.org	70
i-ploot	Err	bitreich.org	70
i-=====	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-ploot-farbfeld	Err	bitreich.org	70
i---------------	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-*ploot-farbfeld* reads collectd-style comma separated values (CSV) and produces a plot	Err	bitreich.org	70
i-in the farbfeld [1] image format (pipe it to ff2png). It is an alternative to	Err	bitreich.org	70
i-RRDtool [2].	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-It is targetting at generating monitoring graph, and it always read unix	Err	bitreich.org	70
i-timestamp as first column on standard input.  The first line determines the	Err	bitreich.org	70
i-name of the curves.	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-[1]: https://tools.suckless.org/farbfeld/	Err	bitreich.org	70
i-[2]: https://oss.oetiker.ch/rrdtool/	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-ploot-feed	Err	bitreich.org	70
i-----------	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-*ploot-feed* also reads collectd-style comma separated values (CSV) but produces	Err	bitreich.org	70
i-a plain text continuous waterfall chart for live monitoring in the terminal. it	Err	bitreich.org	70
i-is an alternative to grafana [1].	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        % plootxt 1 1 1 <load-average.csv	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-                  │shortterm           │midterm             │longterm            │	Err	bitreich.org	70
i-        17:34:00 _│⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣯⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        18/05/01  │⣟⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-                  │⣛⣂⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        20:34:00 _│⣧⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣧⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        18/05/01  │⣧⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣇⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-                  │⣟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⡃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        23:34:00 _│⣿⡒⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        18/05/01  │⡧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡷⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-                  │⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        05:44:41 _│⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⡉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⡉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        18/05/02  │⣛⣁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣟⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-                  │⣷⠶⠶⠶⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⡷⠶⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⣷⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        08:44:41 _│⡗⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡟⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        18/05/02  │⡯⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-                  │⠗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        11:44:41 _│⠗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        18/05/02  │⡿⠶⠒⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⠖⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-                  │⠖⠒⠒⠒⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        14:44:41 _│⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣟⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        18/05/02  │⣿⠟⠓⠒⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠓⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-                  │⣿⠤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡿⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        17:44:41 _│⡟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        18/05/02  │⣭⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-                  │⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        20:51:38 _│⣶⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        18/05/02  │⣿⣷⣶⣶⣶⣶⣶⠖⠒⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⣶⣶⣶⣶⣶⣶⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⣶⣶⣶⣦⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-                  │shortterm           │midterm             │longterm            │	Err	bitreich.org	70
i-        22:51:38 _│⣿⣿⣿⣟⣛⡋⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⣿⣿⣟⣛⠛⠛⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⣿⣿⣿⡟⠛⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-        18/05/02  │⣿⡿⠍⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⡿⠟⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⣿⠟⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-[1]: https://grafana.com	Err	bitreich.org	70
1diff --git a/README.md b/README.md	/scm/ploot/file/README.md.gph	bitreich.org	70
i@@ -0,0 +1,57 @@	Err	bitreich.org	70
i+ploot	Err	bitreich.org	70
i+=====	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+ploot-ffplot	Err	bitreich.org	70
i+--------------	Err	bitreich.org	70
i+*ploot-ffplot* reads collectd-style comma separated values (CSV) and produces a plot	Err	bitreich.org	70
i+in the ffplot [1] image format (pipe it to ff2png). It is an alternative to	Err	bitreich.org	70
i+RRDtool [2].	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+It is targetting at generating monitoring graph, and it always read unix	Err	bitreich.org	70
i+timestamp as first column on standard input.  The first line determines the	Err	bitreich.org	70
i+name of the curves.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+[1]: https://tools.suckless.org/ffplot/	Err	bitreich.org	70
i+[2]: https://oss.oetiker.ch/rrdtool/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+ploot-feed	Err	bitreich.org	70
i+----------	Err	bitreich.org	70
i+*ploot-feed* also reads collectd-style comma separated values (CSV) but produces	Err	bitreich.org	70
i+a plain text continuous waterfall chart for live monitoring in the terminal. it	Err	bitreich.org	70
i+is an alternative to grafana [1].	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+```	Err	bitreich.org	70
i+% plootxt 1 1 1 <load-average.csv	Err	bitreich.org	70
i+          │shortterm           │midterm             │longterm            │	Err	bitreich.org	70
i+17:34:00 _│⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣯⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+18/05/01  │⣟⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+          │⣛⣂⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+20:34:00 _│⣧⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣧⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+18/05/01  │⣧⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣇⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+          │⣟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⡃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+23:34:00 _│⣿⡒⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+18/05/01  │⡧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡷⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+          │⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+05:44:41 _│⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⡉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⡉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+18/05/02  │⣛⣁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣟⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+          │⣷⠶⠶⠶⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⡷⠶⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⣷⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+08:44:41 _│⡗⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡟⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+18/05/02  │⡯⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+          │⠗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+11:44:41 _│⠗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+18/05/02  │⡿⠶⠒⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⠖⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+          │⠖⠒⠒⠒⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+14:44:41 _│⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣟⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+18/05/02  │⣿⠟⠓⠒⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠓⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+          │⣿⠤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡿⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+17:44:41 _│⡟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+18/05/02  │⣭⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+          │⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+20:51:38 _│⣶⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣷⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+18/05/02  │⣿⣷⣶⣶⣶⣶⣶⠖⠒⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⣶⣶⣶⣶⣶⣶⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⣶⣶⣶⣦⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+          │shortterm           │midterm             │longterm            │	Err	bitreich.org	70
i+22:51:38 _│⣿⣿⣿⣟⣛⡋⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⣿⣿⣟⣛⠛⠛⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⣿⣿⣿⡟⠛⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+18/05/02  │⣿⡿⠍⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⡿⠟⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⣿⠟⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i+```	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+[1]: https://grafana.com	Err	bitreich.org	70
1diff --git a/config.mk b/config.mk	/scm/ploot/file/config.mk.gph	bitreich.org	70
i@@ -1,4 +0,0 @@	Err	bitreich.org	70
i-CFLAGS        = -Wall -Wextra -std=c99 -pedantic -fPIC -I"src" -D_POSIX_C_SOURCE=200811L	Err	bitreich.org	70
i-LFLAGS        = -static	Err	bitreich.org	70
i-PREFIX        = /usr/local	Err	bitreich.org	70
i-MANDIR        = $(PREFIX)/share/man	Err	bitreich.org	70
1diff --git a/csv.c b/csv.c	/scm/ploot/file/csv.c.gph	bitreich.org	70
i@@ -0,0 +1,132 @@	Err	bitreich.org	70
i+#include "csv.h"	Err	bitreich.org	70
i+#include <errno.h>	Err	bitreich.org	70
i+#include <assert.h>	Err	bitreich.org	70
i+#include <string.h>	Err	bitreich.org	70
i+#include <time.h>	Err	bitreich.org	70
i+#include <stdlib.h>	Err	bitreich.org	70
i+#include <limits.h>	Err	bitreich.org	70
i+#include <time.h>	Err	bitreich.org	70
i+#include "util.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Read CSV data onto a set of (struct csv).	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+csv_addtime(struct csv *vl, time_t epoch)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        void *mem;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        debug("csv_addtime %p", vl->t);	Err	bitreich.org	70
i+        if ((mem = realloc(vl->t, (vl->n + 1) * sizeof *vl->t)) == NULL)	Err	bitreich.org	70
i+                err(1, "realloc: %s", strerror(errno));	Err	bitreich.org	70
i+        vl->t = mem;	Err	bitreich.org	70
i+        vl->t[vl->n] = epoch;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+csv_addval(struct csv *vl, double field)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        void *mem;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        debug("csv_addval %p", vl->t);	Err	bitreich.org	70
i+        if ((mem = realloc(vl->v, (vl->n + 1) * sizeof *vl->v)) == NULL)	Err	bitreich.org	70
i+                err(1, "", strerror(errno));	Err	bitreich.org	70
i+        vl->v = mem;	Err	bitreich.org	70
i+        vl->v[vl->n] = field;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Add to each column the value on the current row.  The time_t	Err	bitreich.org	70
i+ * buffer is shared among all fields.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+csv_addrow(struct csv *vl, size_t ncol, char *line)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *field;	Err	bitreich.org	70
i+        time_t *tbuf;	Err	bitreich.org	70
i+        long l;	Err	bitreich.org	70
i+        double d;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if ((field = strsep(&line, ",")) == NULL)	Err	bitreich.org	70
i+                err(1, "missing epoch at row %zu", vl->n);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        l = strtol(field, NULL, 10);	Err	bitreich.org	70
i+        if (errno)	Err	bitreich.org	70
i+                err(100, "parsing number '%s'", field);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        csv_addtime(vl, l);	Err	bitreich.org	70
i+        tbuf = vl[0].t;	Err	bitreich.org	70
i+        for (; (field = strsep(&line, ",")); ncol--, vl->n++, vl++) {	Err	bitreich.org	70
i+                if (ncol == 0)	Err	bitreich.org	70
i+                        err(1, "too many fields at line %zu", vl->n);	Err	bitreich.org	70
i+                d = strtod(field, NULL);	Err	bitreich.org	70
i+                if (errno)	Err	bitreich.org	70
i+                        err(100, "parsing double '%s'", field);	Err	bitreich.org	70
i+                csv_addval(vl, d);	Err	bitreich.org	70
i+                vl->t = tbuf;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (ncol > 0)	Err	bitreich.org	70
i+                err(1, "too few fields at line %zu", vl->n);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ *      < (ncol) >	Err	bitreich.org	70
i+ * label1,label2,label3	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+csv_labels(FILE *fp, struct csv **vl, size_t *ncol)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *field, *line, *cp;	Err	bitreich.org	70
i+        struct csv *col;	Err	bitreich.org	70
i+        size_t sz;	Err	bitreich.org	70
i+        ssize_t r;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        sz = 0, line = NULL;	Err	bitreich.org	70
i+        r = getline(&line, &sz, fp);	Err	bitreich.org	70
i+        if (ferror(fp))	Err	bitreich.org	70
i+                err(111, "error while reading from file");	Err	bitreich.org	70
i+        if (feof(fp))	Err	bitreich.org	70
i+                err(100, "missing label line");	Err	bitreich.org	70
i+        strchomp(line);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        cp = line;	Err	bitreich.org	70
i+        if (strcmp(strsep(&cp, ","), "epoch") != 0)	Err	bitreich.org	70
i+                err(1, "first label must be 'epoch'");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        *vl = NULL;	Err	bitreich.org	70
i+        *ncol = 0;	Err	bitreich.org	70
i+        while ((field = strsep(&cp, ","))) {	Err	bitreich.org	70
i+                if ((*vl = realloc(*vl, sz += sizeof **vl)) == NULL)	Err	bitreich.org	70
i+                        err(1, "realloc: %s", strerror(errno));	Err	bitreich.org	70
i+                col = (*vl) + (*ncol)++;	Err	bitreich.org	70
i+                strlcpy(col->label, field, sizeof(col->label));	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        free(line);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ *    < (ncol) >	Err	bitreich.org	70
i+ * val1a,val1b,val1c    ^	Err	bitreich.org	70
i+ * val2a,val2b,val2c    |	Err	bitreich.org	70
i+ * val3a,val3b,val3c (vl->n)	Err	bitreich.org	70
i+ * val4a,val4b,val4c    |	Err	bitreich.org	70
i+ * val5a,val5b,val5c    v	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+csv_values(FILE *fp, struct csv *vl, size_t ncol)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *line;	Err	bitreich.org	70
i+        size_t sz;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        sz = 0, line = NULL;	Err	bitreich.org	70
i+        while (getline(&line, &sz, fp) > -1)	Err	bitreich.org	70
i+                csv_addrow(vl, ncol, line);	Err	bitreich.org	70
i+        if (vl->n == 0)	Err	bitreich.org	70
i+                err(1, "no value could be read");	Err	bitreich.org	70
i+        if (vl->n == 1)	Err	bitreich.org	70
i+                err(1, "only one value could be read");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        free(line);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/csv.h b/csv.h	/scm/ploot/file/csv.h.gph	bitreich.org	70
i@@ -0,0 +1,22 @@	Err	bitreich.org	70
i+#ifndef CSV_H	Err	bitreich.org	70
i+#define CSV_H	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <time.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * List of values and timestamps.  Both have their dedicated buffer	Err	bitreich.org	70
i+ * so that the timestamp buffer can be shared across csv objects.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+struct csv {	Err	bitreich.org	70
i+        time_t                *t;                /* array of timestamps */	Err	bitreich.org	70
i+        double                *v;                /* array of values */	Err	bitreich.org	70
i+        size_t                n;                /* number of values */	Err	bitreich.org	70
i+        char                label[64];        /* for the legend */	Err	bitreich.org	70
i+};	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void        csv_addrow(struct csv *, size_t, char *);	Err	bitreich.org	70
i+void        csv_labels(FILE *, struct csv **, size_t *);	Err	bitreich.org	70
i+void        csv_values(FILE *, struct csv *, size_t);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
1diff --git a/drawille.c b/drawille.c	/scm/ploot/file/drawille.c.gph	bitreich.org	70
i@@ -0,0 +1,194 @@	Err	bitreich.org	70
i+#include "drawille.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include <stdint.h>	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <stdlib.h>	Err	bitreich.org	70
i+#include <string.h>	Err	bitreich.org	70
i+#include <math.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include "font.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Terminal-based plotting using drawille character, aka drawille.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/* parameters used to draw a line */	Err	bitreich.org	70
i+struct line {	Err	bitreich.org	70
i+        int x0, y0, x1, y1;                /* point of the line */	Err	bitreich.org	70
i+        int dx, dy, sx, sy, err;        /* parameters for the algorythm */	Err	bitreich.org	70
i+};	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Turn on the bit at position (row, col) of a single cell.  The	Err	bitreich.org	70
i+ * pattern is not linear (1-4-2-5-3-6-7-8), because it matches the	Err	bitreich.org	70
i+ * drawille pattern.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+drawille_cell_dot(uint8_t *cell, int row, int col)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        uint8_t flags[4][2] = {	Err	bitreich.org	70
i+                { 0x01, 0x08 },	Err	bitreich.org	70
i+                { 0x02, 0x10 },	Err	bitreich.org	70
i+                { 0x04, 0x20 },	Err	bitreich.org	70
i+                { 0x40, 0x80 },	Err	bitreich.org	70
i+        };	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        *cell |= flags[row][col];	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static size_t	Err	bitreich.org	70
i+drawille_cell_utf(uint8_t cell, char *utf)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        long rune;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        rune = 10240 + cell;	Err	bitreich.org	70
i+        utf[0] = (char)(0xe0 | (0x0f & (rune >> 12)));        /* 1110xxxx */	Err	bitreich.org	70
i+        utf[1] = (char)(0x80 | (0x3f & (rune >> 6)));        /* 10xxxxxx */	Err	bitreich.org	70
i+        utf[2] = (char)(0x80 | (0x3f & (rune)));        /* 10xxxxxx */	Err	bitreich.org	70
i+        return 3;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static uint8_t	Err	bitreich.org	70
i+drawille_get(struct drawille *drw, int row, int col)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        return drw->buf[row * drw->col + col];	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+size_t	Err	bitreich.org	70
i+drawille_put_row(FILE *fp, struct drawille *drw, int row)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char txt[] = "xxx";	Err	bitreich.org	70
i+        size_t n;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        n = 0;	Err	bitreich.org	70
i+        for (int col = 0; col < drw->col; col++) {	Err	bitreich.org	70
i+                drawille_cell_utf(drawille_get(drw, row, col), txt);	Err	bitreich.org	70
i+                n += fputs(txt, fp);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        return n;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Coordinates are passed as (x, y), but the canvas stores bits as	Err	bitreich.org	70
i+ * (row, col).  Conversion is made by this function.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+drawille_dot(struct drawille *drw, int x, int y)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        if (x < 0 || x / 2 >= drw->col || y < 0 || y / 4 >= drw->row)	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+        drawille_cell_dot(drw->buf + (drw->row - y / 4 - 1) * drw->col + (x / 2),	Err	bitreich.org	70
i+            3 - y % 4,	Err	bitreich.org	70
i+            x % 2);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+struct drawille *	Err	bitreich.org	70
i+drawille_new(int row, int col)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        struct drawille *drw;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if ((drw = calloc(sizeof(struct drawille) + row * col, 1)) == NULL)	Err	bitreich.org	70
i+                return NULL;	Err	bitreich.org	70
i+        drw->row = row;	Err	bitreich.org	70
i+        drw->col = col;	Err	bitreich.org	70
i+        return drw;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+drawille_line_init(struct line *l, int x0, int y0, int x1, int y1)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        l->x0 = x0;	Err	bitreich.org	70
i+        l->y0 = y0;	Err	bitreich.org	70
i+        l->x1 = x1;	Err	bitreich.org	70
i+        l->y1 = y1;	Err	bitreich.org	70
i+        l->sx = x0 < x1 ? 1 : -1;	Err	bitreich.org	70
i+        l->sy = y0 < y1 ? 1 : -1;	Err	bitreich.org	70
i+        l->dx = abs(x1 - x0);	Err	bitreich.org	70
i+        l->dy = abs(y1 - y0);	Err	bitreich.org	70
i+        l->err = (l->dx > l->dy ? l->dx : -l->dy) / 2;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static int	Err	bitreich.org	70
i+drawille_line_next(struct line *l)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int e;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (l->x0 == l->x1 && l->y0 == l->y1)	Err	bitreich.org	70
i+                return 0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        e = l->err;	Err	bitreich.org	70
i+        if (e > -l->dx) {	Err	bitreich.org	70
i+                l->x0 += l->sx;	Err	bitreich.org	70
i+                l->err -= l->dy;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (e < l->dy) {	Err	bitreich.org	70
i+                l->y0 += l->sy;	Err	bitreich.org	70
i+                l->err += l->dx;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        return 1;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+drawille_line(struct drawille *drw, int x0, int y0, int x1, int y1)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        struct line l;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        drawille_line_init(&l, x0, y0, x1, y1);	Err	bitreich.org	70
i+        do {	Err	bitreich.org	70
i+                drawille_dot(drw, l.x0, l.y0);	Err	bitreich.org	70
i+        } while (drawille_line_next(&l));	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+drawille_histogram_dot(struct drawille *drw, int x, int y, int zero)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int sign;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        sign = (y > zero) ? (+1) : (-1);	Err	bitreich.org	70
i+        for (; y != zero; y -= sign)	Err	bitreich.org	70
i+                drawille_dot(drw, x, y);	Err	bitreich.org	70
i+        drawille_dot(drw, x, y);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+drawille_histogram_line(struct drawille *drw, int x0, int y0, int x1, int y1, int zero)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        struct line l;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        drawille_line_init(&l, x0, y0, x1, y1);	Err	bitreich.org	70
i+        do {	Err	bitreich.org	70
i+                drawille_histogram_dot(drw, l.x0, l.y0, zero);	Err	bitreich.org	70
i+        } while (drawille_line_next(&l));	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static int	Err	bitreich.org	70
i+drawille_text_glyph(struct drawille *drw, int x, int y, struct font *font, char c)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int width;	Err	bitreich.org	70
i+        char *glyph;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if ((unsigned)c > 127)	Err	bitreich.org	70
i+                glyph = font->glyph[0];	Err	bitreich.org	70
i+        else	Err	bitreich.org	70
i+                glyph = font->glyph[(unsigned)c];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        width = strlen(glyph) / font->height;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (int ix = 0; ix < width; ix++)	Err	bitreich.org	70
i+        for (int iy = 0; iy < font->height; iy++) {	Err	bitreich.org	70
i+                if (glyph[ix + (font->height - 1) * width - iy * width] == 3)	Err	bitreich.org	70
i+                        drawille_dot(drw, x + ix, y + iy);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return width;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+char *	Err	bitreich.org	70
i+drawille_text(struct drawille *drw, int x, int y, struct font *font, char *s)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        if (drw->row*4 < font->height)	Err	bitreich.org	70
i+                return NULL;	Err	bitreich.org	70
i+        for (; *s != '\0' && x < drw->col * 2; s++, x++)	Err	bitreich.org	70
i+                x += drawille_text_glyph(drw, x, y, font, *s);	Err	bitreich.org	70
i+        return s;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/drawille.h b/drawille.h	/scm/ploot/file/drawille.h.gph	bitreich.org	70
i@@ -0,0 +1,25 @@	Err	bitreich.org	70
i+#ifndef DRAWILLE_H	Err	bitreich.org	70
i+#define DRAWILLE_H	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include <stddef.h>	Err	bitreich.org	70
i+#include <stdint.h>	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include "font.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Canvas to draw on with braille characters.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+struct drawille {	Err	bitreich.org	70
i+        int                col, row;        /* number of dots in total */	Err	bitreich.org	70
i+        uint8_t                buf[];                /* buffer of size (col * row) */	Err	bitreich.org	70
i+};	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+size_t         drawille_put_row(FILE *, struct drawille *, int);	Err	bitreich.org	70
i+void         drawille_dot(struct drawille *, int, int);	Err	bitreich.org	70
i+struct drawille *drawille_new(int, int);	Err	bitreich.org	70
i+void         drawille_line(struct drawille *, int, int, int, int);	Err	bitreich.org	70
i+void         drawille_histogram_dot(struct drawille *, int, int, int);	Err	bitreich.org	70
i+void         drawille_histogram_line(struct drawille *, int, int, int, int, int);	Err	bitreich.org	70
i+char        *drawille_text(struct drawille *, int, int, struct font *, char *);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
1diff --git a/test.csv b/example.csv	/scm/ploot/file/example.csv.gph	bitreich.org	70
1diff --git a/ffplot.c b/ffplot.c	/scm/ploot/file/ffplot.c.gph	bitreich.org	70
i@@ -0,0 +1,148 @@	Err	bitreich.org	70
i+#include "ffplot.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include <arpa/inet.h>	Err	bitreich.org	70
i+#include <stddef.h>	Err	bitreich.org	70
i+#include <string.h>	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <stdint.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include "font.h"	Err	bitreich.org	70
i+#include "util.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Convert (x,y) coordinates to (row,col) for printing into the buffer.	Err	bitreich.org	70
i+ * The buffer only contain one number, so the coordinate is a single integer:	Err	bitreich.org	70
i+ *        width * y + y.	Err	bitreich.org	70
i+ * The coordinates are shifted by offx and offy to permit relative coordinates.	Err	bitreich.org	70
i+ *	Err	bitreich.org	70
i+ * The convention used:                                      y	Err	bitreich.org	70
i+ * - (0,0) is at the lower left corner of the plotvas.        |	Err	bitreich.org	70
i+ * - (0,1) is above it.                                      +--x	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+ffplot_pixel(struct ffplot *plot, struct ffcolor *color,	Err	bitreich.org	70
i+        int x, int y)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        x += plot->x;	Err	bitreich.org	70
i+        y += plot->y;	Err	bitreich.org	70
i+        if (x < 0 || x >= plot->w || y < 0 || y >= plot->h)	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+        memcpy(plot->buf + plot->w * (plot->h - 1 - y) + x, color, sizeof(*plot->buf));	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+ffplot_rectangle(struct ffplot *plot, struct ffcolor *color,	Err	bitreich.org	70
i+        int y1, int x1,	Err	bitreich.org	70
i+        int y2, int x2)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int x, y, ymin, xmin, ymax, xmax;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        ymin = MIN(y1, y2); ymax = MAX(y1, y2);	Err	bitreich.org	70
i+        xmin = MIN(x1, x2); xmax = MAX(x1, x2);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (y = ymin; y <= ymax; y++)	Err	bitreich.org	70
i+                for (x = xmin; x <= xmax; x++)	Err	bitreich.org	70
i+                        ffplot_pixel(plot, color, x, y);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * From Bresenham's line algorithm and dcat's tplot.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+ffplot_line(struct ffplot *plot, struct ffcolor *color,	Err	bitreich.org	70
i+        int x0, int y0,	Err	bitreich.org	70
i+        int x1, int y1)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int dy, dx, sy, sx, err, e;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        sx = x0 < x1 ? 1 : -1;	Err	bitreich.org	70
i+        sy = y0 < y1 ? 1 : -1;	Err	bitreich.org	70
i+        dx = ABS(x1 - x0);	Err	bitreich.org	70
i+        dy = ABS(y1 - y0);	Err	bitreich.org	70
i+        err = (dy > dx ? dy : -dx) / 2;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (;;) {	Err	bitreich.org	70
i+                ffplot_pixel(plot, color, x0, y0);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                if (y0 == y1 && x0 == x1)	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                e = err;	Err	bitreich.org	70
i+                if (e > -dy) {	Err	bitreich.org	70
i+                        y0 += sy;	Err	bitreich.org	70
i+                        err -= dx;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                if (e < dx) {	Err	bitreich.org	70
i+                        x0 += sx;	Err	bitreich.org	70
i+                        err += dy;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Draw a coloured glyph from font f centered on y.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+int	Err	bitreich.org	70
i+ffplot_char(struct ffplot *plot, struct ffcolor *color, struct font *ft, char c,	Err	bitreich.org	70
i+        int x, int y)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int yf, xf, wf;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (c & 0x80)	Err	bitreich.org	70
i+                c = '\0';	Err	bitreich.org	70
i+        y -= ft->height / 2;	Err	bitreich.org	70
i+        wf = font_width(ft, c);	Err	bitreich.org	70
i+        for (xf = 0; xf < wf; xf++)	Err	bitreich.org	70
i+                for (yf = 0; yf < ft->height; yf++)	Err	bitreich.org	70
i+                        if (ft->glyph[(int)c][wf * (ft->height - yf) + xf] == 3)	Err	bitreich.org	70
i+                                ffplot_pixel(plot, color, x + xf, y + yf);	Err	bitreich.org	70
i+        return wf + 1;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Draw a left aligned string without wrapping it.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+size_t	Err	bitreich.org	70
i+ffplot_text_left(struct ffplot *plot, struct ffcolor *color, struct font *ft,	Err	bitreich.org	70
i+        char *s, int x, int y)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        for (; *s != '\0'; s++)	Err	bitreich.org	70
i+                x += ffplot_char(plot, color, ft, *s, x, y);	Err	bitreich.org	70
i+        return x;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Draw a center aligned string without wrapping it.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+size_t	Err	bitreich.org	70
i+ffplot_text_center(struct ffplot *plot, struct ffcolor *color, struct font *ft,	Err	bitreich.org	70
i+        char *s, int x, int y)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        x -= font_strlen(ft, s) / 2;	Err	bitreich.org	70
i+        return ffplot_text_left(plot, color, ft, s, x, y);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Draw a right aligned string without wrapping it.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+size_t	Err	bitreich.org	70
i+ffplot_text_right(struct ffplot *plot, struct ffcolor *color, struct font *ft,	Err	bitreich.org	70
i+        char *s, int x, int y)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        x -= font_strlen(ft, s);	Err	bitreich.org	70
i+        return ffplot_text_left(plot, color, ft, s, x, y);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+ffplot_print(FILE *fp, struct ffplot *plot)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        uint32_t w, h;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        w = htonl(plot->w);	Err	bitreich.org	70
i+        h = htonl(plot->h);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fprintf(stdout, "ffplot");	Err	bitreich.org	70
i+        fwrite(&w, sizeof(w), 1, fp);	Err	bitreich.org	70
i+        fwrite(&h, sizeof(h), 1, fp);	Err	bitreich.org	70
i+        fwrite(plot->buf, plot->w * plot->h, sizeof(*plot->buf), fp);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/ffplot.h b/ffplot.h	/scm/ploot/file/ffplot.h.gph	bitreich.org	70
i@@ -0,0 +1,34 @@	Err	bitreich.org	70
i+#ifndef FFPLOT_H	Err	bitreich.org	70
i+#define FFPLOT_H	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <stddef.h>	Err	bitreich.org	70
i+#include <stdint.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include "font.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+struct ffcolor {	Err	bitreich.org	70
i+        uint16_t red;	Err	bitreich.org	70
i+        uint16_t green;	Err	bitreich.org	70
i+        uint16_t blue;	Err	bitreich.org	70
i+        uint16_t alpha;	Err	bitreich.org	70
i+};	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+struct ffplot {	Err	bitreich.org	70
i+        int w;                /* width */	Err	bitreich.org	70
i+        int h;                /* height */	Err	bitreich.org	70
i+        int x;                /* x offset */	Err	bitreich.org	70
i+        int y;                /* y offset */	Err	bitreich.org	70
i+        struct ffcolor *buf;	Err	bitreich.org	70
i+};	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void        ffplot_pixel(struct ffplot *, struct ffcolor *, int, int);	Err	bitreich.org	70
i+void        ffplot_rectangle(struct ffplot *, struct ffcolor *, int, int, int, int);	Err	bitreich.org	70
i+void        ffplot_line(struct ffplot *, struct ffcolor *, int, int, int, int);	Err	bitreich.org	70
i+int        ffplot_char(struct ffplot *, struct ffcolor *, struct font *, char, int, int);	Err	bitreich.org	70
i+size_t        ffplot_text_left(struct ffplot *, struct ffcolor *, struct font *, char *, int, int);	Err	bitreich.org	70
i+size_t        ffplot_text_center(struct ffplot *, struct ffcolor *, struct font *, char *, int, int);	Err	bitreich.org	70
i+size_t        ffplot_text_right(struct ffplot *, struct ffcolor *, struct font *, char *, int, int);	Err	bitreich.org	70
i+void        ffplot_print(FILE *, struct ffplot *);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
1diff --git a/src/font.c b/font.c	/scm/ploot/file/font.c.gph	bitreich.org	70
1diff --git a/font.h b/font.h	/scm/ploot/file/font.h.gph	bitreich.org	70
i@@ -0,0 +1,20 @@	Err	bitreich.org	70
i+#ifndef FONT_H	Err	bitreich.org	70
i+#define FONT_H	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include <stddef.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Bitmapped font saved as a '_' and 'X' pattern in a C source file.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+struct font {	Err	bitreich.org	70
i+        int                height;                /* The width is variable. */	Err	bitreich.org	70
i+        char                *glyph[128];        /* 0: end, 1: off, 2: on.  */	Err	bitreich.org	70
i+};	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+extern struct font font8;	Err	bitreich.org	70
i+extern struct font font13;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+size_t        font_width(struct font *, int);	Err	bitreich.org	70
i+size_t        font_strlen(struct font *, char *);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
1diff --git a/src/font13.c b/font13.c	/scm/ploot/file/font13.c.gph	bitreich.org	70
1diff --git a/src/font8.c b/font8.c	/scm/ploot/file/font8.c.gph	bitreich.org	70
1diff --git a/ploot-braille.c b/ploot-braille.c	/scm/ploot/file/ploot-braille.c.gph	bitreich.org	70
i@@ -7,13 +7,9 @@	Err	bitreich.org	70
i #include <time.h>	Err	bitreich.org	70
i #include <math.h>	Err	bitreich.org	70
i #include <unistd.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i #include "drawille.h"	Err	bitreich.org	70
i #include "scale.h"	Err	bitreich.org	70
i #include "util.h"	Err	bitreich.org	70
i-#include "log.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-char const *arg0 = NULL;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /*	Err	bitreich.org	70
i  * Plot the body as an histogram interpolating the gaps and include	Err	bitreich.org	70
i@@ -46,7 +42,7 @@ braille_histogram(struct csv *vl, struct drawille *drw,	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-braille_axis_x(FILE *fp, time_t tmin, time_t tmax, time_t tstep, int col)	Err	bitreich.org	70
i+braille_axis_x(FILE *fp, time_t tmin, time_t tmax, time_t csvep, int col)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         int x, o, prec;	Err	bitreich.org	70
i         char tmp[sizeof("MM/DD HH:MM")], *fmt;	Err	bitreich.org	70
i@@ -54,13 +50,13 @@ braille_axis_x(FILE *fp, time_t tmin, time_t tmax, time_t tstep, int col)	Err	bitreich.org	70
i         time_t t;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         fmt =	Err	bitreich.org	70
i-          (tstep < 3600 * 12) ? "^%H:%M:%S" :	Err	bitreich.org	70
i-          (tstep < 3600 * 24) ? "^%m/%d %H:%M" :	Err	bitreich.org	70
i+          (csvep < 3600 * 12) ? "^%H:%M:%S" :	Err	bitreich.org	70
i+          (csvep < 3600 * 24) ? "^%m/%d %H:%M" :	Err	bitreich.org	70
i           "^%Y/%m/%d";	Err	bitreich.org	70
i         n = x = 0;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        t = tmin + tstep - tmin % tstep;	Err	bitreich.org	70
i-        for (; t < tmax; t += tstep) {	Err	bitreich.org	70
i+        t = tmin + csvep - tmin % csvep;	Err	bitreich.org	70
i+        for (; t < tmax; t += csvep) {	Err	bitreich.org	70
i                 x = (t - tmin) * col / (tmax - tmin);	Err	bitreich.org	70
i                 strftime(tmp, sizeof tmp, fmt, localtime(&t));	Err	bitreich.org	70
i                 prec = x - n + strlen(tmp);	Err	bitreich.org	70
i@@ -107,32 +103,33 @@ static void	Err	bitreich.org	70
i plot(struct csv *vl, FILE *fp, size_t ncol, int rows, int cols)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         double vmin, vmax, vstep;	Err	bitreich.org	70
i-        time_t tmin, tmax, tstep;	Err	bitreich.org	70
i+        time_t tmin, tmax, csvep;	Err	bitreich.org	70
i         struct drawille *drw;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         cols -= 9;                /* scale printed at the right */	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         scale_minmax(vl, ncol, &tmin, &tmax, &vmin, &vmax);	Err	bitreich.org	70
i-        tstep = scale_tstep(tmin, tmax, cols / 10);	Err	bitreich.org	70
i+        csvep = scale_csvep(tmin, tmax, cols / 10);	Err	bitreich.org	70
i         vstep = scale_vstep(vmin, vmax, rows / 10);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         rows -= ncol - 1;        /* room for the labels and the scale */	Err	bitreich.org	70
i         rows /= ncol;                /* plot <ncol> times */	Err	bitreich.org	70
i         rows = MAX(rows, 3);        /* readable */	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        debug("vstep=%lf vstep=%ld ncol=%zu rows=%zu", vstep, tstep, ncol, rows);	Err	bitreich.org	70
i+        debug("vstep=%lf vstep=%ld ncol=%zu rows=%zu", vstep, csvep, ncol, rows);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         for (; ncol > 0; vl++, ncol--) {	Err	bitreich.org	70
i-                assert(drw = drawille_new(rows, cols));	Err	bitreich.org	70
i+                if ((drw = drawille_new(rows, cols)) == NULL)	Err	bitreich.org	70
i+                        err(1, "drawille_new: %s", strerror(errno));	Err	bitreich.org	70
i                 fprintf(fp, " %s\n", vl->label);	Err	bitreich.org	70
i                 if (braille_histogram(vl, drw, tmin, tmax, vmin, vmax) == -1)	Err	bitreich.org	70
i-                        die(1, "allocating drawille canvas");	Err	bitreich.org	70
i+                        err(1, "allocating drawille canvas");	Err	bitreich.org	70
i                 if (braille_render(drw, fp, vmin, vmax) == -1)	Err	bitreich.org	70
i-                        die(1, "rendering braille canvas");	Err	bitreich.org	70
i+                        err(1, "rendering braille canvas");	Err	bitreich.org	70
i                 free(drw);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i-        if (braille_axis_x(fp, tmin, tmax, tstep, cols) == -1)	Err	bitreich.org	70
i-                die(1, "printing x axis");;	Err	bitreich.org	70
i+        if (braille_axis_x(fp, tmin, tmax, csvep, cols) == -1)	Err	bitreich.org	70
i+                err(1, "printing x axis");;	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i@@ -151,20 +148,19 @@ main(int argc, char **argv)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         rows = 20, cols = 80;	Err	bitreich.org	70
i         arg0 = *argv;	Err	bitreich.org	70
i-        optind = 0;	Err	bitreich.org	70
i         while ((c = getopt(argc, argv, "r:c:")) > -1) {	Err	bitreich.org	70
i                 switch (c) {	Err	bitreich.org	70
i                 case 'r':	Err	bitreich.org	70
i                         rows = atoi(optarg);	Err	bitreich.org	70
i                         if (rows < 1) {	Err	bitreich.org	70
i-                                error("invalid number of rows");	Err	bitreich.org	70
i+                                warn("invalid number of rows");	Err	bitreich.org	70
i                                 usage();	Err	bitreich.org	70
i                         }	Err	bitreich.org	70
i                         break;	Err	bitreich.org	70
i                 case 'c':	Err	bitreich.org	70
i                         cols = atoi(optarg);	Err	bitreich.org	70
i                         if (rows < 1) {	Err	bitreich.org	70
i-                                error("invalid number of columns");	Err	bitreich.org	70
i+                                warn("invalid number of columns");	Err	bitreich.org	70
i                                 usage();	Err	bitreich.org	70
i                         }	Err	bitreich.org	70
i                         break;	Err	bitreich.org	70
1diff --git a/ploot-csv.5 b/ploot-csv.5	/scm/ploot/file/ploot-csv.5.gph	bitreich.org	70
i@@ -15,20 +15,20 @@	Err	bitreich.org	70
i epoch,column-name-1,column-name-2	Err	bitreich.org	70
i timestamp,value1,value2	Err	bitreich.org	70
i timestamp,value1,value2	Err	bitreich.org	70
i-…	Err	bitreich.org	70
i+\&...	Err	bitreich.org	70
i .Ed	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Sh DESCRIPTION	Err	bitreich.org	70
i .	Err	bitreich.org	70
i-This is the simple comma-separated format used by the ploot-* programs.	Err	bitreich.org	70
i+This is the simple coma-separated format used by the ploot-* programs.	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Sh INPUT FORMAT	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Nm	Err	bitreich.org	70
i has a first header line, then zero or more data lines, both	Err	bitreich.org	70
i-comma-separated list of values.	Err	bitreich.org	70
i+coma-separated list of values.	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Ss Header line	Err	bitreich.org	70
1diff --git a/ploot-farbfeld.1 b/ploot-farbfeld.1	/scm/ploot/file/ploot-farbfeld.1.gph	bitreich.org	70
i@@ -5,13 +5,13 @@	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Sh NAME	Err	bitreich.org	70
i .	Err	bitreich.org	70
i-.Nm ploot-farbfeld	Err	bitreich.org	70
i-.Nd produce a farbfeld image of csv input	Err	bitreich.org	70
i+.Nm ploot-ffplot	Err	bitreich.org	70
i+.Nd produce a ffplot image of csv input	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Sh SYNOPSIS	Err	bitreich.org	70
i .	Err	bitreich.org	70
i-.Nm ploot-farbfeld	Err	bitreich.org	70
i+.Nm ploot-ffplot	Err	bitreich.org	70
i .Op Fl t Ar title	Err	bitreich.org	70
i .Op Fl u Ar unit	Err	bitreich.org	70
i .Ar colors...	Err	bitreich.org	70
i@@ -21,7 +21,7 @@	Err	bitreich.org	70
i .	Err	bitreich.org	70
i The	Err	bitreich.org	70
i .Nm	Err	bitreich.org	70
i-utility plots an image in the farbfeld format out of csv values coming from stdin.	Err	bitreich.org	70
i+utility plots an image in the ffplot format out of csv values coming from stdin.	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Bl -tag -width 6n	Err	bitreich.org	70
i .	Err	bitreich.org	70
i@@ -59,20 +59,20 @@ epoch,used_memory,free_memory	Err	bitreich.org	70
i 1533752055,301,260	Err	bitreich.org	70
i 1533752056,303,258	Err	bitreich.org	70
i EOF	Err	bitreich.org	70
i-$ ploot-farbfeld -t demo -u MB red yellow <sample.txt	Err	bitreich.org	70
i+$ ploot-ffplot -t demo -u MB red yellow <sample.txt	Err	bitreich.org	70
i .Ed	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Sh SEE ALSO	Err	bitreich.org	70
i .	Err	bitreich.org	70
i-.Xr ploot-farbfeld 1 ,	Err	bitreich.org	70
i+.Xr ploot-ffplot 1 ,	Err	bitreich.org	70
i .Xr ploot-csv 7	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Pp	Err	bitreich.org	70
i The	Err	bitreich.org	70
i-.Xr farbfeld 7	Err	bitreich.org	70
i+.Xr ffplot 7	Err	bitreich.org	70
i image format:	Err	bitreich.org	70
i-.Lk https://tools.suckless.org/farbfeld/	Err	bitreich.org	70
i+.Lk https://tools.suckless.org/ffplot/	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Sh HISTORY	Err	bitreich.org	70
1diff --git a/ploot-farbfeld.c b/ploot-farbfeld.c	/scm/ploot/file/ploot-farbfeld.c.gph	bitreich.org	70
i@@ -1,6 +1,6 @@	Err	bitreich.org	70
i #include <arpa/inet.h>	Err	bitreich.org	70
i-#include <assert.h>	Err	bitreich.org	70
i #include <ctype.h>	Err	bitreich.org	70
i+#include <errno.h>	Err	bitreich.org	70
i #include <fcntl.h>	Err	bitreich.org	70
i #include <limits.h>	Err	bitreich.org	70
i #include <math.h>	Err	bitreich.org	70
i@@ -10,11 +10,9 @@	Err	bitreich.org	70
i #include <string.h>	Err	bitreich.org	70
i #include <time.h>	Err	bitreich.org	70
i #include <unistd.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i #include "csv.h"	Err	bitreich.org	70
i #include "ffplot.h"	Err	bitreich.org	70
i #include "font.h"	Err	bitreich.org	70
i-#include "log.h"	Err	bitreich.org	70
i #include "util.h"	Err	bitreich.org	70
i #include "scale.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -53,7 +51,6 @@ struct colorname {	Err	bitreich.org	70
i         struct ffcolor color;	Err	bitreich.org	70
i };	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-char const *arg0 = NULL;	Err	bitreich.org	70
i static char *tflag = "";	Err	bitreich.org	70
i static char *uflag = "";	Err	bitreich.org	70
i static struct font *font = &font13;	Err	bitreich.org	70
i@@ -70,7 +67,7 @@ static struct colorname colorname[] = {	Err	bitreich.org	70
i };	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-farbfeld_t2x(time_t t, time_t tmin, time_t tmax)	Err	bitreich.org	70
i+ffplot_t2x(time_t t, time_t tmin, time_t tmax)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         if (tmin == tmax)	Err	bitreich.org	70
i                 return PLOT_W;	Err	bitreich.org	70
i@@ -78,7 +75,7 @@ farbfeld_t2x(time_t t, time_t tmin, time_t tmax)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-farbfeld_v2y(double v, double vmin, double vmax)	Err	bitreich.org	70
i+ffplot_v2y(double v, double vmin, double vmax)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         if (vmin == vmax)	Err	bitreich.org	70
i                 return PLOT_H;	Err	bitreich.org	70
i@@ -86,22 +83,22 @@ farbfeld_v2y(double v, double vmin, double vmax)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-farbfeld_xaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid,	Err	bitreich.org	70
i-        time_t tmin, time_t tmax, time_t tstep)	Err	bitreich.org	70
i+ffplot_xaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid,	Err	bitreich.org	70
i+        time_t tmin, time_t tmax, time_t csvep)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         time_t t;	Err	bitreich.org	70
i         int x;	Err	bitreich.org	70
i         char str[sizeof("MM/DD HH/MM")], *fmt;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (tstep < 3600 * 12)	Err	bitreich.org	70
i+        if (csvep < 3600 * 12)	Err	bitreich.org	70
i                 fmt = "%H:%M:%S";	Err	bitreich.org	70
i-        else if (tstep < 3600 * 24)	Err	bitreich.org	70
i+        else if (csvep < 3600 * 24)	Err	bitreich.org	70
i                 fmt = "%m/%d %H:%M";	Err	bitreich.org	70
i         else	Err	bitreich.org	70
i                 fmt = "%X/%m/%d";	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        for (t = tmax - tmax % tstep; t >= tmin; t -= tstep) {	Err	bitreich.org	70
i-                x = farbfeld_t2x(t, tmin, tmax);	Err	bitreich.org	70
i+        for (t = tmax - tmax % csvep; t >= tmin; t -= csvep) {	Err	bitreich.org	70
i+                x = ffplot_t2x(t, tmin, tmax);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i                 ffplot_line(plot, grid,	Err	bitreich.org	70
i                         x, XLABEL_H,	Err	bitreich.org	70
i@@ -114,7 +111,7 @@ farbfeld_xaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid,	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-farbfeld_yaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid,	Err	bitreich.org	70
i+ffplot_yaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid,	Err	bitreich.org	70
i         double vmin, double vmax, double vstep)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         double v;	Err	bitreich.org	70
i@@ -122,7 +119,7 @@ farbfeld_yaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid,	Err	bitreich.org	70
i         char str[8 + 1];	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         for (v = vmax - fmod(vmax, vstep); v >= vmin; v -= vstep) {	Err	bitreich.org	70
i-                y = farbfeld_v2y(v, vmin, vmax);	Err	bitreich.org	70
i+                y = ffplot_v2y(v, vmin, vmax);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i                 ffplot_line(plot, grid,	Err	bitreich.org	70
i                         YLABEL_W, y,	Err	bitreich.org	70
i@@ -135,7 +132,7 @@ farbfeld_yaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid,	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-farbfeld_title(struct ffplot *plot,	Err	bitreich.org	70
i+ffplot_title(struct ffplot *plot,	Err	bitreich.org	70
i         struct ffcolor *ct, char *title,	Err	bitreich.org	70
i         struct ffcolor *cu, char *unit)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i@@ -144,7 +141,7 @@ farbfeld_title(struct ffplot *plot,	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-farbfeld_plot(struct ffplot *plot, struct csv *vl, struct ffcolor *color,	Err	bitreich.org	70
i+ffplot_plot(struct ffplot *plot, struct csv *vl, struct ffcolor *color,	Err	bitreich.org	70
i         double vmin, double vmax,	Err	bitreich.org	70
i         time_t tmin, time_t tmax)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i@@ -154,8 +151,8 @@ farbfeld_plot(struct ffplot *plot, struct csv *vl, struct ffcolor *color,	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         first = 1;	Err	bitreich.org	70
i         for (tp = vl->t, vp = vl->v, n = vl->n; n > 0; n--, vp++, tp++) {	Err	bitreich.org	70
i-                y = farbfeld_v2y(*vp, vmin, vmax);	Err	bitreich.org	70
i-                x = farbfeld_t2x(*tp, tmin, tmax);	Err	bitreich.org	70
i+                y = ffplot_v2y(*vp, vmin, vmax);	Err	bitreich.org	70
i+                x = ffplot_t2x(*tp, tmin, tmax);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i                 if (!first)	Err	bitreich.org	70
i                         ffplot_line(plot, color, xlast, ylast, x, y);	Err	bitreich.org	70
i@@ -167,16 +164,16 @@ farbfeld_plot(struct ffplot *plot, struct csv *vl, struct ffcolor *color,	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-farbfeld_values(struct ffplot *plot, struct csv *vl, struct ffcolor **cl, size_t ncol,	Err	bitreich.org	70
i+ffplot_values(struct ffplot *plot, struct csv *vl, struct ffcolor **cl, size_t ncol,	Err	bitreich.org	70
i         time_t tmin, time_t tmax,	Err	bitreich.org	70
i         double vmin, double vmax)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         for (; ncol > 0; ncol--, vl++, cl++)	Err	bitreich.org	70
i-                farbfeld_plot(plot, vl, *cl, vmin, vmax, tmin, tmax);	Err	bitreich.org	70
i+                ffplot_plot(plot, vl, *cl, vmin, vmax, tmin, tmax);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-farbfeld_legend(struct ffplot *plot, struct ffcolor *fg, struct csv *vl, struct ffcolor **cl, size_t ncol)	Err	bitreich.org	70
i+ffplot_legend(struct ffplot *plot, struct ffcolor *fg, struct csv *vl, struct ffcolor **cl, size_t ncol)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         size_t x, y;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -209,13 +206,14 @@ plot(struct csv *vl, struct ffcolor **cl, size_t ncol, char *name, char *units)	Err	bitreich.org	70
i         struct ffcolor label_fg = { 0x8888, 0x8888, 0x8888, 0xffff };	Err	bitreich.org	70
i         struct ffcolor title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff };	Err	bitreich.org	70
i         double vmin, vmax, vstep;	Err	bitreich.org	70
i-        time_t tmin, tmax, tstep;	Err	bitreich.org	70
i+        time_t tmin, tmax, csvep;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         scale_minmax(vl, ncol, &tmin, &tmax, &vmin, &vmax);	Err	bitreich.org	70
i-        tstep = scale_tstep(tmin, tmax, 7);	Err	bitreich.org	70
i+        csvep = scale_csvep(tmin, tmax, 7);	Err	bitreich.org	70
i         vstep = scale_vstep(vmin, vmax, 7);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        assert(plot.buf = calloc(IMAGE_H * IMAGE_W, sizeof *plot.buf));	Err	bitreich.org	70
i+        if ((plot.buf = calloc(IMAGE_H * IMAGE_W, sizeof *plot.buf)) == NULL)	Err	bitreich.org	70
i+                err(1, "calloc: %s", strerror(errno));	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         plot.y = 0;	Err	bitreich.org	70
i         plot.x = 0;	Err	bitreich.org	70
i@@ -227,23 +225,23 @@ plot(struct csv *vl, struct ffcolor **cl, size_t ncol, char *name, char *units)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         plot.x = XLABEL_X;	Err	bitreich.org	70
i         plot.y = XLABEL_Y;	Err	bitreich.org	70
i-        farbfeld_xaxis(&plot, &label_fg, &grid_fg, tmin, tmax, tstep);	Err	bitreich.org	70
i+        ffplot_xaxis(&plot, &label_fg, &grid_fg, tmin, tmax, csvep);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         plot.x = YLABEL_X;	Err	bitreich.org	70
i         plot.y = YLABEL_Y;	Err	bitreich.org	70
i-        farbfeld_yaxis(&plot, &label_fg, &grid_fg, vmin, vmax, vstep);	Err	bitreich.org	70
i+        ffplot_yaxis(&plot, &label_fg, &grid_fg, vmin, vmax, vstep);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         plot.x = TITLE_X;	Err	bitreich.org	70
i         plot.y = TITLE_Y;	Err	bitreich.org	70
i-        farbfeld_title(&plot, &title_fg, name, &label_fg, units);	Err	bitreich.org	70
i+        ffplot_title(&plot, &title_fg, name, &label_fg, units);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         plot.x = PLOT_X;	Err	bitreich.org	70
i         plot.y = PLOT_Y;	Err	bitreich.org	70
i-        farbfeld_values(&plot, vl, cl, ncol, tmin, tmax, vmin, vmax);	Err	bitreich.org	70
i+        ffplot_values(&plot, vl, cl, ncol, tmin, tmax, vmin, vmax);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         plot.x = LEGEND_X;	Err	bitreich.org	70
i         plot.y = LEGEND_Y;	Err	bitreich.org	70
i-        farbfeld_legend(&plot, &label_fg, vl, cl, ncol);	Err	bitreich.org	70
i+        ffplot_legend(&plot, &label_fg, vl, cl, ncol);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         ffplot_print(stdout, &plot);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i@@ -264,7 +262,7 @@ argv_to_color(struct ffcolor **cl, char **argv)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         for (; *argv != NULL; cl++, argv++)	Err	bitreich.org	70
i                 if ((*cl = name_to_color(*argv)) == NULL)	Err	bitreich.org	70
i-                        die(1, "unknown color name: %s", *argv);	Err	bitreich.org	70
i+                        err(1, "unknown color name: %s", *argv);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i@@ -286,7 +284,7 @@ main(int argc, char **argv)	Err	bitreich.org	70
i         size_t ncol;	Err	bitreich.org	70
i         int c;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        optind = 0;	Err	bitreich.org	70
i+        arg0 = *argv;	Err	bitreich.org	70
i         while ((c = getopt(argc, argv, "t:u:")) > -1) {	Err	bitreich.org	70
i                 switch (c) {	Err	bitreich.org	70
i                 case 't':	Err	bitreich.org	70
i@@ -305,13 +303,14 @@ main(int argc, char **argv)	Err	bitreich.org	70
i         if (argc == 0)	Err	bitreich.org	70
i                 usage();	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        assert(cl = calloc(argc, sizeof(*cl)));	Err	bitreich.org	70
i+        if ((cl = calloc(argc, sizeof *cl)) == NULL)	Err	bitreich.org	70
i+                err(1, "calloc: %s", strerror(errno));	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         csv_labels(stdin, &vl, &ncol);	Err	bitreich.org	70
i         if (ncol > (size_t)argc)	Err	bitreich.org	70
i-                die(1, "too many columns or not enough arguments");	Err	bitreich.org	70
i+                err(1, "too many columns or not enough arguments");	Err	bitreich.org	70
i         else if (ncol < (size_t)argc)	Err	bitreich.org	70
i-                die(1, "too many arguments or not enough columns");	Err	bitreich.org	70
i+                err(1, "too many arguments or not enough columns");	Err	bitreich.org	70
i         csv_values(stdin, vl, ncol);	Err	bitreich.org	70
i         argv_to_color(cl, argv);	Err	bitreich.org	70
i 	Err	bitreich.org	70
1diff --git a/ploot-feed.1 b/ploot-feed.1	/scm/ploot/file/ploot-feed.1.gph	bitreich.org	70
i@@ -60,7 +60,7 @@ $ ploot-feed -w 80 1 1 <sample.txt	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Sh SEE ALSO	Err	bitreich.org	70
i .	Err	bitreich.org	70
i-.Xr ploot-farbfeld 1 ,	Err	bitreich.org	70
i+.Xr ploot-ffplot 1 ,	Err	bitreich.org	70
i .Xr ploot-format 7	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .	Err	bitreich.org	70
1diff --git a/ploot-feed.c b/ploot-feed.c	/scm/ploot/file/ploot-feed.c.gph	bitreich.org	70
i@@ -8,14 +8,11 @@	Err	bitreich.org	70
i #include <string.h>	Err	bitreich.org	70
i #include <time.h>	Err	bitreich.org	70
i #include <unistd.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i #include "util.h"	Err	bitreich.org	70
i-#include "log.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #define WIDTH_MAX 1024	Err	bitreich.org	70
i #define BRAILLE_START        10240	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-char const *arg0 = NULL;	Err	bitreich.org	70
i static int wflag = 80;	Err	bitreich.org	70
i static int width = 0;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -60,19 +57,19 @@ plot_row(long *out, char *line, double *max, int nrow, int ncol)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         tok = strsep(&line, ",");	Err	bitreich.org	70
i         if (!tok)	Err	bitreich.org	70
i-                die(100, "*** missing epoch value");	Err	bitreich.org	70
i+                err(100, "*** missing epoch value");	Err	bitreich.org	70
i         epoch = strtol(tok, NULL, 10);	Err	bitreich.org	70
i         if (errno)	Err	bitreich.org	70
i-                error("*** parsing epoch '%s'", tok);	Err	bitreich.org	70
i+                warn("*** parsing epoch '%s'", tok);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         for (n = 0; (tok = strsep(&line, ",")) != NULL; n++) {	Err	bitreich.org	70
i                 if (n >= ncol)	Err	bitreich.org	70
i-                        die(100, "too many values");	Err	bitreich.org	70
i+                        err(100, "too many values");	Err	bitreich.org	70
i                 val = atof(tok);	Err	bitreich.org	70
i                 plot_val(out + n * width, val, max[n], nrow);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         if (n < ncol)	Err	bitreich.org	70
i-                die(100, "not enough values");	Err	bitreich.org	70
i+                err(100, "not enough values");	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         return epoch;	Err	bitreich.org	70
i }	Err	bitreich.org	70
i@@ -100,7 +97,7 @@ plot_line(long *out, double *max, int ncol)	Err	bitreich.org	70
i         for (nrow = 0; nrow < 4; nrow++) {	Err	bitreich.org	70
i                 if (getline(&line, &sz, stdin) == -1) {	Err	bitreich.org	70
i                         if (ferror(stdin))	Err	bitreich.org	70
i-                                die(111, "reading row from stdin");	Err	bitreich.org	70
i+                                err(111, "reading row from stdin");	Err	bitreich.org	70
i                         exit(0);	Err	bitreich.org	70
i                 }	Err	bitreich.org	70
i                 epoch = plot_row(out, line, max, nrow, ncol);	Err	bitreich.org	70
i@@ -179,21 +176,21 @@ read_labels(char **labv)	Err	bitreich.org	70
i         line = NULL, sz = 0;	Err	bitreich.org	70
i         if (getline(&line, &sz, stdin) == -1) {	Err	bitreich.org	70
i                 if (ferror(stdin))	Err	bitreich.org	70
i-                        die(111, "reading labels from stdin");	Err	bitreich.org	70
i-                die(100, "missing label line", stderr);	Err	bitreich.org	70
i+                        err(111, "reading labels from stdin");	Err	bitreich.org	70
i+                err(100, "missing label line", stderr);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         strchomp(line);	Err	bitreich.org	70
i         cp = line;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         if (strcmp(strsep(&cp, ","), "epoch") != 0)	Err	bitreich.org	70
i-                die(100, "first label must be 'epoch'");	Err	bitreich.org	70
i+                err(100, "first label must be 'epoch'");	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         for (ncol = 0; (tok = strsep(&cp, ",")) != NULL; ncol++, labv++)	Err	bitreich.org	70
i                 *labv = tok;	Err	bitreich.org	70
i         *labv = NULL;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         if (ncol < 1)	Err	bitreich.org	70
i-                die(100, "no label found");	Err	bitreich.org	70
i+                err(100, "no label found");	Err	bitreich.org	70
i         return ncol;	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -223,7 +220,7 @@ main(int argc, char **argv)	Err	bitreich.org	70
i         char *labv[4069 / 2], labels[4069];	Err	bitreich.org	70
i         int c;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        optind = 0;	Err	bitreich.org	70
i+        arg0 = *argv;	Err	bitreich.org	70
i         while ((c = getopt(argc, argv, "w:")) > -1) {	Err	bitreich.org	70
i                 switch (c) {	Err	bitreich.org	70
i                 case 'w':	Err	bitreich.org	70
i@@ -243,14 +240,14 @@ main(int argc, char **argv)	Err	bitreich.org	70
i         for (m = max; argc > 0; argc--, argv++, m++) {	Err	bitreich.org	70
i                 *m = strtod(*argv, NULL);	Err	bitreich.org	70
i                 if (errno)	Err	bitreich.org	70
i-                        error("*** parsing float '%s'", *argv);	Err	bitreich.org	70
i+                        warn("*** parsing float '%s'", *argv);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         ncol = read_labels(labv);	Err	bitreich.org	70
i         width = (wflag - sizeof("XXxXXxXX _")) / ncol - sizeof("|");	Err	bitreich.org	70
i         fmt_labels(labels, ncol, labv);	Err	bitreich.org	70
i         if (ncol != nmax)	Err	bitreich.org	70
i-                die(100, "not as many labels and arguments");	Err	bitreich.org	70
i+                err(100, "not as many labels and arguments");	Err	bitreich.org	70
i         plot(labels, max, ncol);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         return 0;	Err	bitreich.org	70
1diff --git a/ploot-text.c b/ploot-text.c	/scm/ploot/file/ploot-text.c.gph	bitreich.org	70
i@@ -2,13 +2,13 @@	Err	bitreich.org	70
i #include <stdio.h>	Err	bitreich.org	70
i #include <unistd.h>	Err	bitreich.org	70
i #include <stdlib.h>	Err	bitreich.org	70
i+#include <string.h>	Err	bitreich.org	70
i+#include <errno.h>	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #include "drawille.h"	Err	bitreich.org	70
i #include "font.h"	Err	bitreich.org	70
i #include "util.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-char *arg0 = NULL;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i void	Err	bitreich.org	70
i usage(void)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i@@ -22,9 +22,11 @@ main(int argc, char **argv)	Err	bitreich.org	70
i         struct font *ft;	Err	bitreich.org	70
i         struct drawille *drw;	Err	bitreich.org	70
i         char *text;	Err	bitreich.org	70
i+        size_t h, w;	Err	bitreich.org	70
i         int c, row;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         ft = &font8;	Err	bitreich.org	70
i+        arg0 = *argv;	Err	bitreich.org	70
i         while ((c = getopt(argc, argv, "12")) > -1) {	Err	bitreich.org	70
i                 switch (c) {	Err	bitreich.org	70
i                 case '1':	Err	bitreich.org	70
i@@ -37,7 +39,6 @@ main(int argc, char **argv)	Err	bitreich.org	70
i                         usage();	Err	bitreich.org	70
i                 }	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i-        arg0 = *argv;	Err	bitreich.org	70
i         argc -= optind;	Err	bitreich.org	70
i         argv += optind;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -46,13 +47,17 @@ main(int argc, char **argv)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         text = *argv;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        assert(drw = drawille_new((ft->height + 3) / 4, font_strlen(ft, text) / 2));	Err	bitreich.org	70
i+        h = (ft->height + 3) / 4;	Err	bitreich.org	70
i+        w = font_strlen(ft, text) / 2;	Err	bitreich.org	70
i+        if ((drw = drawille_new(h, w)) == NULL)	Err	bitreich.org	70
i+                err(1, "drawille_new: %s", strerror(errno));	Err	bitreich.org	70
i         drawille_text(drw, 0, 0, ft, text);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        for (row = 0; row < drw->row; row++) {	Err	bitreich.org	70
i+        for (row = 0; row < drw->row; row++) {	Err	bitreich.org	70
i                 drawille_put_row(stdout, drw, row);	Err	bitreich.org	70
i-                fprintf(stdout, "\n");	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i+                fprintf(stdout, "\n");	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         free(drw);	Err	bitreich.org	70
i+        return 0;	Err	bitreich.org	70
i }	Err	bitreich.org	70
1diff --git a/proto.sh b/proto.sh	/scm/ploot/file/proto.sh.gph	bitreich.org	70
i@@ -1,73 +0,0 @@	Err	bitreich.org	70
i-#!/bin/sh	Err	bitreich.org	70
i-awk='	Err	bitreich.org	70
i-BEGIN {	Err	bitreich.org	70
i-        tab = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"	Err	bitreich.org	70
i-        print "/**/"	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-END {	Err	bitreich.org	70
i-        print ""	Err	bitreich.org	70
i-        print "#endif"	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-# functions	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-args {	Err	bitreich.org	70
i-        sub(/^[ \t]*/, " ")	Err	bitreich.org	70
i-        args = args $0	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/^[a-zA-Z0-9_]+\([][)(a-z_A-Z0-9*,. \t]*$/ {	Err	bitreich.org	70
i-        if (match(type, "static") || match($0, ";$"))	Err	bitreich.org	70
i-                next	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        symbol = $0	Err	bitreich.org	70
i-        sub(/\(.*/, "", symbol)	Err	bitreich.org	70
i-        sub(/[a-zA-Z0-9_]*\(/, "", $0)	Err	bitreich.org	70
i-        if (symbol == "main")	Err	bitreich.org	70
i-                next	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        args = $0	Err	bitreich.org	70
i-        sub(/^[a-z]*\(/, "", args)	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-args && /\)$/ {	Err	bitreich.org	70
i-        gsub(/[\n \t]+/, " ", args)	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        sub(/\)$/, "", args)	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        gsub(/[a-zA-Z0-9_]+\[[^]]*\]/, "[]", args)	Err	bitreich.org	70
i-        gsub(/[*][a-zA-Z0-9_]+/, "*", args)	Err	bitreich.org	70
i-        gsub(/[ ][a-zA-Z0-9_]+,/, ",", args)	Err	bitreich.org	70
i-        gsub(/[ ][a-zA-Z0-9_]+$/, "", args)	Err	bitreich.org	70
i-        gsub(/[ ][a-zA-Z0-9_]+\*/, "*", args)	Err	bitreich.org	70
i-        gsub(/\.\.\.\$/, "...", args)	Err	bitreich.org	70
i-        gsub(/void\)$/, "void", args)	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        printf("%s%s%s%s(%s);\n",	Err	bitreich.org	70
i-            type, substr(tab, 1, 20 / 8 - (length(type) - 3) / 8),	Err	bitreich.org	70
i-            symbol, substr(tab, 1, 30 / 8 - (length(symbol) - 1) / 8),	Err	bitreich.org	70
i-            args)	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        args = ""	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-!args {	Err	bitreich.org	70
i-        type = $0	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-# variables	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/^[a-zA-Z][][ \t*a-z_A-Z0-9]*=.*[;{]$/ && $1 != "static" && $1 != "enum" {	Err	bitreich.org	70
i-        sub(/ *=.*/, ";")	Err	bitreich.org	70
i-        sub(/[ \t]*;$/, ";");	Err	bitreich.org	70
i-        print	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-'	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-for file in src/*.c; do file=${file%.c}	Err	bitreich.org	70
i-        grep -Fq '/**/' "$file.h" 2>/dev/null || continue	Err	bitreich.org	70
i-        header=$(awk '$0 == "/**/" { exit(0) } 1' "$file.h"	Err	bitreich.org	70
i-                awk "$awk" "$file.c")	Err	bitreich.org	70
i-        printf '%s\n' "$header" >"$file.h"	Err	bitreich.org	70
i-done	Err	bitreich.org	70
1diff --git a/scale.c b/scale.c	/scm/ploot/file/scale.c.gph	bitreich.org	70
i@@ -0,0 +1,94 @@	Err	bitreich.org	70
i+#include "scale.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include <stddef.h>	Err	bitreich.org	70
i+#include <time.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include "util.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ *        - <max   ^	Err	bitreich.org	70
i+ *        -        |        Translate the coordinates between double values	Err	bitreich.org	70
i+ *        - <val  szy and height in the plot of <row> rows.	Err	bitreich.org	70
i+ *        -        |	Err	bitreich.org	70
i+ *        - <min   v	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+int	Err	bitreich.org	70
i+scale_ypos(double val, double min, double max, int szy)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        return szy * (val - min) / (max - min);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ *        <---- szx ---->                Translate the coordinates between the time	Err	bitreich.org	70
i+ *                                range and position in the plot of <col> cols.	Err	bitreich.org	70
i+ *        t1     t     t2	Err	bitreich.org	70
i+ *         | . . | . . |	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+int	Err	bitreich.org	70
i+scale_xpos(time_t t, time_t t1, time_t t2, int szx)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        return szx * (t - t1) / (t2 - t1);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+scale_minmax(struct csv *vl, int ncol,	Err	bitreich.org	70
i+        time_t *tmin, time_t *tmax,	Err	bitreich.org	70
i+        double *vmin, double *vmax)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        double *v;	Err	bitreich.org	70
i+        time_t *t;	Err	bitreich.org	70
i+        size_t n;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        *vmin = *vmax = 0;	Err	bitreich.org	70
i+        *tmin = *tmax = *vl->t;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (; ncol > 0; ncol--, vl++) {	Err	bitreich.org	70
i+                for (t = vl->t, v = vl->v, n = vl->n; n > 0; t++, v++, n--) {	Err	bitreich.org	70
i+                        if (*v < *vmin) *vmin = *v;	Err	bitreich.org	70
i+                        if (*v > *vmax) *vmax = *v;	Err	bitreich.org	70
i+                        if (*t < *tmin) *tmin = *t;	Err	bitreich.org	70
i+                        if (*t > *tmax) *tmax = *t;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (*tmin == *tmax)	Err	bitreich.org	70
i+                err(1, "invalid time scale: min=%lld max=%lld", *tmin, *tmax);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+time_t	Err	bitreich.org	70
i+scale_csvep(time_t min, time_t max, int nval)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        time_t dt, *sc, scale[] = {	Err	bitreich.org	70
i+                1, 5, 2, 10, 20, 30, 60, 60*2, 60*5, 60*10, 60*20, 60*30, 3600, 	Err	bitreich.org	70
i+                3600*2, 3600*5, 3600*10, 3600*18, 3600*24, 3600*24*2, 	Err	bitreich.org	70
i+                3600*24*5, 3600*24*10, 3600*24*20, 3600*24*30, 3600*24*50,	Err	bitreich.org	70
i+                3600*24*100, 3600*24*365, 0	Err	bitreich.org	70
i+        };	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        dt = max - min;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (sc = scale; *sc > 0; sc++)	Err	bitreich.org	70
i+                if (dt < *sc * nval)	Err	bitreich.org	70
i+                        return *sc;	Err	bitreich.org	70
i+        return dt / nval;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+double	Err	bitreich.org	70
i+scale_vstep(double min, double max, int nval)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        double dv, d, *sc, scale[] = { 1, 2, 3, 5 };	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        dv = max - min;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (dv > 1)	Err	bitreich.org	70
i+                for (d = 1; d != 0; d *= 10)	Err	bitreich.org	70
i+                        for (sc = scale; sc < scale + LEN(scale); sc++)	Err	bitreich.org	70
i+                                if (dv < *sc * d * nval)	Err	bitreich.org	70
i+                                        return *sc * d;	Err	bitreich.org	70
i+        if (dv < 1)	Err	bitreich.org	70
i+                for (d = 1; d != 0; d *= 10)	Err	bitreich.org	70
i+                        for (sc = scale + LEN(scale) - 1; sc >= scale; sc--)	Err	bitreich.org	70
i+                                if (dv > *sc / d * nval / 2)	Err	bitreich.org	70
i+                                        return *sc / d;	Err	bitreich.org	70
i+        return 0;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/scale.h b/scale.h	/scm/ploot/file/scale.h.gph	bitreich.org	70
i@@ -0,0 +1,14 @@	Err	bitreich.org	70
i+#ifndef SCALE_H	Err	bitreich.org	70
i+#define SCALE_H	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include <stddef.h>	Err	bitreich.org	70
i+#include <time.h>	Err	bitreich.org	70
i+#include "csv.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int        scale_ypos(double, double, double, int);	Err	bitreich.org	70
i+int        scale_xpos(time_t, time_t, time_t, int);	Err	bitreich.org	70
i+void        scale_minmax(struct csv *, int, time_t *, time_t *, double *, double *);	Err	bitreich.org	70
i+time_t        scale_csvep(time_t, time_t, int);	Err	bitreich.org	70
i+double        scale_vstep(double, double, int);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
1diff --git a/src/csv.c b/src/csv.c	/scm/ploot/file/src/csv.c.gph	bitreich.org	70
i@@ -1,122 +0,0 @@	Err	bitreich.org	70
i-#include "csv.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <errno.h>	Err	bitreich.org	70
i-#include <assert.h>	Err	bitreich.org	70
i-#include <string.h>	Err	bitreich.org	70
i-#include <time.h>	Err	bitreich.org	70
i-#include <stdlib.h>	Err	bitreich.org	70
i-#include <limits.h>	Err	bitreich.org	70
i-#include <time.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "log.h"	Err	bitreich.org	70
i-#include "util.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Read CSV data onto a set of (struct csv).	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static void	Err	bitreich.org	70
i-csv_addtime(struct csv *vl, time_t epoch)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        assert(vl->t = realloc(vl->t, (vl->n + 1) * sizeof(*vl->t)));	Err	bitreich.org	70
i-        vl->t[vl->n] = epoch;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static void	Err	bitreich.org	70
i-csv_addval(struct csv *vl, double field)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        assert(vl->v = realloc(vl->v, (vl->n + 1) * sizeof(*vl->v)));	Err	bitreich.org	70
i-        vl->v[vl->n] = field;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Add to each column the value on the current row.  The time_t	Err	bitreich.org	70
i- * buffer is shared among all fields.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-csv_addrow(struct csv *vl, size_t ncol, char *line)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *field;	Err	bitreich.org	70
i-        time_t *tbuf;	Err	bitreich.org	70
i-        long l;	Err	bitreich.org	70
i-        double d;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        field = strsep(&line, ",");	Err	bitreich.org	70
i-        if (!field)	Err	bitreich.org	70
i-                die(1, "missing epoch at row %zu", vl->n);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        l = strtol(field, NULL, 10);	Err	bitreich.org	70
i-        if (errno)	Err	bitreich.org	70
i-                die(100, "parsing number '%s'", field);	Err	bitreich.org	70
i-        csv_addtime(vl, l);	Err	bitreich.org	70
i-        tbuf = vl[0].t;	Err	bitreich.org	70
i-        for (; (field = strsep(&line, ",")); ncol--, vl->n++, vl++) {	Err	bitreich.org	70
i-                if (ncol == 0)	Err	bitreich.org	70
i-                        die(1, "too many fields at line %zu", vl->n);	Err	bitreich.org	70
i-                d = strtod(field, NULL);	Err	bitreich.org	70
i-                if (errno)	Err	bitreich.org	70
i-                        die(100, "parsing double '%s'", field);	Err	bitreich.org	70
i-                csv_addval(vl, d);	Err	bitreich.org	70
i-                vl->t = tbuf;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        if (ncol > 0)	Err	bitreich.org	70
i-                die(1, "too few fields at line %zu", vl->n);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i- 	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- *       < *ncol >	Err	bitreich.org	70
i- * epoch,label1,label2,label3	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-csv_labels(FILE *fp, struct csv **vl, size_t *ncol)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *field, *line, *cp;	Err	bitreich.org	70
i-        struct csv *col;	Err	bitreich.org	70
i-        size_t sz;	Err	bitreich.org	70
i-        ssize_t r;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        sz = 0, line = NULL;	Err	bitreich.org	70
i-        r = getline(&line, &sz, fp);	Err	bitreich.org	70
i-        if (ferror(fp))	Err	bitreich.org	70
i-                die(111, "error while reading from file");	Err	bitreich.org	70
i-        if (r == -1)	Err	bitreich.org	70
i-                die(100, "missing label line");	Err	bitreich.org	70
i-        strchomp(line);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        cp = line;	Err	bitreich.org	70
i-        if (strcmp(strsep(&cp, ","), "epoch") != 0)	Err	bitreich.org	70
i-                die(1, "first label must be 'epoch'");	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        *vl = NULL;	Err	bitreich.org	70
i-        *ncol = 0;	Err	bitreich.org	70
i-        while ((field = strsep(&cp, ","))) {	Err	bitreich.org	70
i-                assert(*vl = realloc(*vl, sz += sizeof(**vl)));	Err	bitreich.org	70
i-                col = (*vl) + (*ncol)++;	Err	bitreich.org	70
i-                strlcpy(col->label, field, sizeof(col->label));	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        free(line);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- *       < ncol >	Err	bitreich.org	70
i- * epoch,a1,b1,c1  ^	Err	bitreich.org	70
i- * epoch,a2,b2,c2 vl->n	Err	bitreich.org	70
i- * epoch,a3,b3,c3  v	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-csv_values(FILE *fp, struct csv *vl, size_t ncol)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *line;	Err	bitreich.org	70
i-        size_t sz;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        sz = 0, line = NULL;	Err	bitreich.org	70
i-        while (getline(&line, &sz, fp) > -1)	Err	bitreich.org	70
i-                csv_addrow(vl, ncol, line);	Err	bitreich.org	70
i-        if (vl->n == 0)	Err	bitreich.org	70
i-                die(1, "no value could be read");	Err	bitreich.org	70
i-        if (vl->n == 1)	Err	bitreich.org	70
i-                die(1, "only one value could be read");	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        free(line);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
1diff --git a/src/csv.h b/src/csv.h	/scm/ploot/file/src/csv.h.gph	bitreich.org	70
i@@ -1,23 +0,0 @@	Err	bitreich.org	70
i-#ifndef CSV_H	Err	bitreich.org	70
i-#define CSV_H	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-#include <time.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * List of values and timestamps.  Both have their dedicated buffer	Err	bitreich.org	70
i- * so that the timestamp buffer can be shared across csv objects.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-struct csv {	Err	bitreich.org	70
i-        time_t                *t;                /* array of timestamps */	Err	bitreich.org	70
i-        double                *v;                /* array of values */	Err	bitreich.org	70
i-        size_t                n;                /* number of values */	Err	bitreich.org	70
i-        char                label[64];        /* for the legend */	Err	bitreich.org	70
i-};	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/**/	Err	bitreich.org	70
i-void                csv_addrow                (struct csv *, size_t, char *);	Err	bitreich.org	70
i-void                csv_labels                (FILE *, struct csv **, size_t *);	Err	bitreich.org	70
i-void                csv_values                (FILE *, struct csv *, size_t);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#endif	Err	bitreich.org	70
1diff --git a/src/drawille.c b/src/drawille.c	/scm/ploot/file/src/drawille.c.gph	bitreich.org	70
i@@ -1,196 +0,0 @@	Err	bitreich.org	70
i-#include "drawille.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stdint.h>	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-#include <stdlib.h>	Err	bitreich.org	70
i-#include <string.h>	Err	bitreich.org	70
i-#include <math.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "font.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "log.h" /* XXX */	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Terminal-based plotting using drawille character, aka drawille.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/* parameters used to draw a line */	Err	bitreich.org	70
i-struct line {	Err	bitreich.org	70
i-        int x0, y0, x1, y1;                /* point of the line */	Err	bitreich.org	70
i-        int dx, dy, sx, sy, err;        /* parameters for the algorythm */	Err	bitreich.org	70
i-};	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Turn on the bit at position (row, col) of a single cell.  The	Err	bitreich.org	70
i- * pattern is not linear (1-4-2-5-3-6-7-8), because it matches the	Err	bitreich.org	70
i- * drawille pattern.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-static void	Err	bitreich.org	70
i-drawille_cell_dot(uint8_t *cell, int row, int col)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        uint8_t flags[4][2] = {	Err	bitreich.org	70
i-                { 0x01, 0x08 },	Err	bitreich.org	70
i-                { 0x02, 0x10 },	Err	bitreich.org	70
i-                { 0x04, 0x20 },	Err	bitreich.org	70
i-                { 0x40, 0x80 },	Err	bitreich.org	70
i-        };	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        *cell |= flags[row][col];	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static size_t	Err	bitreich.org	70
i-drawille_cell_utf(uint8_t cell, char *utf)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        long rune;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        rune = 10240 + cell;	Err	bitreich.org	70
i-        utf[0] = (char)(0xe0 | (0x0f & (rune >> 12)));        /* 1110xxxx */	Err	bitreich.org	70
i-        utf[1] = (char)(0x80 | (0x3f & (rune >> 6)));        /* 10xxxxxx */	Err	bitreich.org	70
i-        utf[2] = (char)(0x80 | (0x3f & (rune)));        /* 10xxxxxx */	Err	bitreich.org	70
i-        return 3;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static uint8_t	Err	bitreich.org	70
i-drawille_get(struct drawille *drw, int row, int col)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        return drw->buf[row * drw->col + col];	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-size_t	Err	bitreich.org	70
i-drawille_put_row(FILE *fp, struct drawille *drw, int row)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char txt[] = "xxx";	Err	bitreich.org	70
i-        size_t n;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        n = 0;	Err	bitreich.org	70
i-        for (int col = 0; col < drw->col; col++) {	Err	bitreich.org	70
i-                drawille_cell_utf(drawille_get(drw, row, col), txt);	Err	bitreich.org	70
i-                n += fputs(txt, fp);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        return n;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Coordinates are passed as (x, y), but the canvas stores bits as	Err	bitreich.org	70
i- * (row, col).  Conversion is made by this function.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-drawille_dot(struct drawille *drw, int x, int y)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        if (x < 0 || x / 2 >= drw->col || y < 0 || y / 4 >= drw->row)	Err	bitreich.org	70
i-                return;	Err	bitreich.org	70
i-        drawille_cell_dot(drw->buf + (drw->row - y / 4 - 1) * drw->col + (x / 2),	Err	bitreich.org	70
i-            3 - y % 4,	Err	bitreich.org	70
i-            x % 2);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-struct drawille *	Err	bitreich.org	70
i-drawille_new(int row, int col)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        struct drawille *drw;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if ((drw = calloc(sizeof(struct drawille) + row * col, 1)) == NULL)	Err	bitreich.org	70
i-                return NULL;	Err	bitreich.org	70
i-        drw->row = row;	Err	bitreich.org	70
i-        drw->col = col;	Err	bitreich.org	70
i-        return drw;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static void	Err	bitreich.org	70
i-drawille_line_init(struct line *l, int x0, int y0, int x1, int y1)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        l->x0 = x0;	Err	bitreich.org	70
i-        l->y0 = y0;	Err	bitreich.org	70
i-        l->x1 = x1;	Err	bitreich.org	70
i-        l->y1 = y1;	Err	bitreich.org	70
i-        l->sx = x0 < x1 ? 1 : -1;	Err	bitreich.org	70
i-        l->sy = y0 < y1 ? 1 : -1;	Err	bitreich.org	70
i-        l->dx = abs(x1 - x0);	Err	bitreich.org	70
i-        l->dy = abs(y1 - y0);	Err	bitreich.org	70
i-        l->err = (l->dx > l->dy ? l->dx : -l->dy) / 2;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static int	Err	bitreich.org	70
i-drawille_line_next(struct line *l)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int e;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (l->x0 == l->x1 && l->y0 == l->y1)	Err	bitreich.org	70
i-                return 0;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        e = l->err;	Err	bitreich.org	70
i-        if (e > -l->dx) {	Err	bitreich.org	70
i-                l->x0 += l->sx;	Err	bitreich.org	70
i-                l->err -= l->dy;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        if (e < l->dy) {	Err	bitreich.org	70
i-                l->y0 += l->sy;	Err	bitreich.org	70
i-                l->err += l->dx;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        return 1;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-drawille_line(struct drawille *drw, int x0, int y0, int x1, int y1)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        struct line l;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        drawille_line_init(&l, x0, y0, x1, y1);	Err	bitreich.org	70
i-        do {	Err	bitreich.org	70
i-                drawille_dot(drw, l.x0, l.y0);	Err	bitreich.org	70
i-        } while (drawille_line_next(&l));	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-drawille_histogram_dot(struct drawille *drw, int x, int y, int zero)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int sign;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        sign = (y > zero) ? (+1) : (-1);	Err	bitreich.org	70
i-        for (; y != zero; y -= sign)	Err	bitreich.org	70
i-                drawille_dot(drw, x, y);	Err	bitreich.org	70
i-        drawille_dot(drw, x, y);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-drawille_histogram_line(struct drawille *drw, int x0, int y0, int x1, int y1, int zero)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        struct line l;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        drawille_line_init(&l, x0, y0, x1, y1);	Err	bitreich.org	70
i-        do {	Err	bitreich.org	70
i-                drawille_histogram_dot(drw, l.x0, l.y0, zero);	Err	bitreich.org	70
i-        } while (drawille_line_next(&l));	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static int	Err	bitreich.org	70
i-drawille_text_glyph(struct drawille *drw, int x, int y, struct font *font, char c)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int width;	Err	bitreich.org	70
i-        char *glyph;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if ((unsigned)c > 127)	Err	bitreich.org	70
i-                glyph = font->glyph[0];	Err	bitreich.org	70
i-        else	Err	bitreich.org	70
i-                glyph = font->glyph[(unsigned)c];	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        width = strlen(glyph) / font->height;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (int ix = 0; ix < width; ix++)	Err	bitreich.org	70
i-        for (int iy = 0; iy < font->height; iy++) {	Err	bitreich.org	70
i-                if (glyph[ix + (font->height - 1) * width - iy * width] == 3)	Err	bitreich.org	70
i-                        drawille_dot(drw, x + ix, y + iy);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        return width;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-char *	Err	bitreich.org	70
i-drawille_text(struct drawille *drw, int x, int y, struct font *font, char *s)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        if (drw->row*4 < font->height)	Err	bitreich.org	70
i-                return NULL;	Err	bitreich.org	70
i-        for (; *s != '\0' && x < drw->col * 2; s++, x++)	Err	bitreich.org	70
i-                x += drawille_text_glyph(drw, x, y, font, *s);	Err	bitreich.org	70
i-        return s;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
1diff --git a/src/drawille.h b/src/drawille.h	/scm/ploot/file/src/drawille.h.gph	bitreich.org	70
i@@ -1,28 +0,0 @@	Err	bitreich.org	70
i-#ifndef DRAWILLE_H	Err	bitreich.org	70
i-#define DRAWILLE_H	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stddef.h>	Err	bitreich.org	70
i-#include <stdint.h>	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "csv.h"	Err	bitreich.org	70
i-#include "font.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Canvas to draw on with braille characters.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-struct drawille {	Err	bitreich.org	70
i-        int                col, row;        /* number of dots in total */	Err	bitreich.org	70
i-        uint8_t                buf[];                /* buffer of size (col * row) */	Err	bitreich.org	70
i-};	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/**/	Err	bitreich.org	70
i-size_t                drawille_put_row        (FILE *, struct drawille *, int);	Err	bitreich.org	70
i-void                drawille_dot                (struct drawille *, int, int);	Err	bitreich.org	70
i-struct drawille *drawille_new                (int, int);	Err	bitreich.org	70
i-void                drawille_line                (struct drawille *, int, int, int, int);	Err	bitreich.org	70
i-void                drawille_histogram_dot        (struct drawille *, int, int, int);	Err	bitreich.org	70
i-void                drawille_histogram_line        (struct drawille *, int, int, int, int, int);	Err	bitreich.org	70
i-char *                drawille_text                (struct drawille *, int, int, struct font *, char *);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#endif	Err	bitreich.org	70
1diff --git a/src/ffplot.c b/src/ffplot.c	/scm/ploot/file/src/ffplot.c.gph	bitreich.org	70
i@@ -1,148 +0,0 @@	Err	bitreich.org	70
i-#include "ffplot.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <arpa/inet.h>	Err	bitreich.org	70
i-#include <stddef.h>	Err	bitreich.org	70
i-#include <string.h>	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-#include <stdint.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "font.h"	Err	bitreich.org	70
i-#include "util.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Convert (x,y) coordinates to (row,col) for printing into the buffer.	Err	bitreich.org	70
i- * The buffer only contain one number, so the coordinate is a single integer:	Err	bitreich.org	70
i- *        width * y + y.	Err	bitreich.org	70
i- * The coordinates are shifted by offx and offy to permit relative coordinates.	Err	bitreich.org	70
i- *	Err	bitreich.org	70
i- * The convention used:                                      y	Err	bitreich.org	70
i- * - (0,0) is at the lower left corner of the plotvas.        |	Err	bitreich.org	70
i- * - (0,1) is above it.                                      +--x	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-ffplot_pixel(struct ffplot *plot, struct ffcolor *color,	Err	bitreich.org	70
i-        int x, int y)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        x += plot->x;	Err	bitreich.org	70
i-        y += plot->y;	Err	bitreich.org	70
i-        if (x < 0 || x >= plot->w || y < 0 || y >= plot->h)	Err	bitreich.org	70
i-                return;	Err	bitreich.org	70
i-        memcpy(plot->buf + plot->w * (plot->h - 1 - y) + x, color, sizeof(*plot->buf));	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-ffplot_rectangle(struct ffplot *plot, struct ffcolor *color,	Err	bitreich.org	70
i-        int y1, int x1,	Err	bitreich.org	70
i-        int y2, int x2)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int x, y, ymin, xmin, ymax, xmax;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        ymin = MIN(y1, y2); ymax = MAX(y1, y2);	Err	bitreich.org	70
i-        xmin = MIN(x1, x2); xmax = MAX(x1, x2);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (y = ymin; y <= ymax; y++)	Err	bitreich.org	70
i-                for (x = xmin; x <= xmax; x++)	Err	bitreich.org	70
i-                        ffplot_pixel(plot, color, x, y);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * From Bresenham's line algorithm and dcat's tplot.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-ffplot_line(struct ffplot *plot, struct ffcolor *color,	Err	bitreich.org	70
i-        int x0, int y0,	Err	bitreich.org	70
i-        int x1, int y1)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int dy, dx, sy, sx, err, e;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        sx = x0 < x1 ? 1 : -1;	Err	bitreich.org	70
i-        sy = y0 < y1 ? 1 : -1;	Err	bitreich.org	70
i-        dx = ABS(x1 - x0);	Err	bitreich.org	70
i-        dy = ABS(y1 - y0);	Err	bitreich.org	70
i-        err = (dy > dx ? dy : -dx) / 2;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (;;) {	Err	bitreich.org	70
i-                ffplot_pixel(plot, color, x0, y0);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-                if (y0 == y1 && x0 == x1)	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-                e = err;	Err	bitreich.org	70
i-                if (e > -dy) {	Err	bitreich.org	70
i-                        y0 += sy;	Err	bitreich.org	70
i-                        err -= dx;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                if (e < dx) {	Err	bitreich.org	70
i-                        x0 += sx;	Err	bitreich.org	70
i-                        err += dy;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Draw a coloured glyph from font f centered on y.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-int	Err	bitreich.org	70
i-ffplot_char(struct ffplot *plot, struct ffcolor *color, struct font *ft, char c,	Err	bitreich.org	70
i-        int x, int y)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int yf, xf, wf;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (c & 0x80)	Err	bitreich.org	70
i-                c = '\0';	Err	bitreich.org	70
i-        y -= ft->height / 2;	Err	bitreich.org	70
i-        wf = font_width(ft, c);	Err	bitreich.org	70
i-        for (xf = 0; xf < wf; xf++)	Err	bitreich.org	70
i-                for (yf = 0; yf < ft->height; yf++)	Err	bitreich.org	70
i-                        if (ft->glyph[(int)c][wf * (ft->height - yf) + xf] == 3)	Err	bitreich.org	70
i-                                ffplot_pixel(plot, color, x + xf, y + yf);	Err	bitreich.org	70
i-        return wf + 1;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Draw a left aligned string without wrapping it.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-size_t	Err	bitreich.org	70
i-ffplot_text_left(struct ffplot *plot, struct ffcolor *color, struct font *ft,	Err	bitreich.org	70
i-        char *s, int x, int y)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        for (; *s != '\0'; s++)	Err	bitreich.org	70
i-                x += ffplot_char(plot, color, ft, *s, x, y);	Err	bitreich.org	70
i-        return x;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Draw a center aligned string without wrapping it.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-size_t	Err	bitreich.org	70
i-ffplot_text_center(struct ffplot *plot, struct ffcolor *color, struct font *ft,	Err	bitreich.org	70
i-        char *s, int x, int y)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        x -= font_strlen(ft, s) / 2;	Err	bitreich.org	70
i-        return ffplot_text_left(plot, color, ft, s, x, y);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Draw a right aligned string without wrapping it.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-size_t	Err	bitreich.org	70
i-ffplot_text_right(struct ffplot *plot, struct ffcolor *color, struct font *ft,	Err	bitreich.org	70
i-        char *s, int x, int y)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        x -= font_strlen(ft, s);	Err	bitreich.org	70
i-        return ffplot_text_left(plot, color, ft, s, x, y);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-ffplot_print(FILE *fp, struct ffplot *plot)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        uint32_t w, h;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        w = htonl(plot->w);	Err	bitreich.org	70
i-        h = htonl(plot->h);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        fprintf(stdout, "farbfeld");	Err	bitreich.org	70
i-        fwrite(&w, sizeof(w), 1, fp);	Err	bitreich.org	70
i-        fwrite(&h, sizeof(h), 1, fp);	Err	bitreich.org	70
i-        fwrite(plot->buf, plot->w * plot->h, sizeof(*plot->buf), fp);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
1diff --git a/src/ffplot.h b/src/ffplot.h	/scm/ploot/file/src/ffplot.h.gph	bitreich.org	70
i@@ -1,35 +0,0 @@	Err	bitreich.org	70
i-#ifndef FFPLOT_H	Err	bitreich.org	70
i-#define FFPLOT_H	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-#include <stddef.h>	Err	bitreich.org	70
i-#include <stdint.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "font.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-struct ffcolor {	Err	bitreich.org	70
i-        uint16_t red;	Err	bitreich.org	70
i-        uint16_t green;	Err	bitreich.org	70
i-        uint16_t blue;	Err	bitreich.org	70
i-        uint16_t alpha;	Err	bitreich.org	70
i-};	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-struct ffplot {	Err	bitreich.org	70
i-        int w;                /* width */	Err	bitreich.org	70
i-        int h;                /* height */	Err	bitreich.org	70
i-        int x;                /* x offset */	Err	bitreich.org	70
i-        int y;                /* y offset */	Err	bitreich.org	70
i-        struct ffcolor *buf;	Err	bitreich.org	70
i-};	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/**/	Err	bitreich.org	70
i-void                ffplot_pixel                (struct ffplot *, struct ffcolor *, int, int);	Err	bitreich.org	70
i-void                ffplot_rectangle        (struct ffplot *, struct ffcolor *, int, int, int, int);	Err	bitreich.org	70
i-void                ffplot_line                (struct ffplot *, struct ffcolor *, int, int, int, int);	Err	bitreich.org	70
i-int                ffplot_char                (struct ffplot *, struct ffcolor *, struct font *, char, int, int);	Err	bitreich.org	70
i-size_t                ffplot_text_left        (struct ffplot *, struct ffcolor *, struct font *, char *, int, int);	Err	bitreich.org	70
i-size_t                ffplot_text_center        (struct ffplot *, struct ffcolor *, struct font *, char *, int, int);	Err	bitreich.org	70
i-size_t                ffplot_text_right        (struct ffplot *, struct ffcolor *, struct font *, char *, int, int);	Err	bitreich.org	70
i-void                ffplot_print                (FILE *, struct ffplot *);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#endif	Err	bitreich.org	70
1diff --git a/src/font.h b/src/font.h	/scm/ploot/file/src/font.h.gph	bitreich.org	70
i@@ -1,21 +0,0 @@	Err	bitreich.org	70
i-#ifndef FONT_H	Err	bitreich.org	70
i-#define FONT_H	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stddef.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Bitmapped font saved as a '_' and 'X' pattern in a C source file.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-struct font {	Err	bitreich.org	70
i-        int                height;                /* The width is variable. */	Err	bitreich.org	70
i-        char                *glyph[128];        /* 0: end, 1: off, 2: on.  */	Err	bitreich.org	70
i-};	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-extern struct font font8;	Err	bitreich.org	70
i-extern struct font font13;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/**/	Err	bitreich.org	70
i-size_t                font_width                (struct font *, int);	Err	bitreich.org	70
i-size_t                font_strlen                (struct font *, char *);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#endif	Err	bitreich.org	70
1diff --git a/src/log.c b/src/log.c	/scm/ploot/file/src/log.c.gph	bitreich.org	70
i@@ -1,97 +0,0 @@	Err	bitreich.org	70
i-#include "log.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <string.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * log.c - log to standard error according to the log level	Err	bitreich.org	70
i- *	Err	bitreich.org	70
i- * Instead of logging to syslog, delegate logging to a separate	Err	bitreich.org	70
i- * tool, such as FreeBSD's daemon(8), POSIX's logger(1).	Err	bitreich.org	70
i- *	Err	bitreich.org	70
i- * log_init() sets the log level to the "LOG" environment variable	Err	bitreich.org	70
i- * if set, or to 4 (log down to info included) otherwise.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <errno.h>	Err	bitreich.org	70
i-#include <stdlib.h>	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#define LOG_DEFAULT 2  /* info */	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int log_level = -1;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-vlogf(int level, char const *flag, char const *fmt, va_list va)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *env;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (log_level == -1) {	Err	bitreich.org	70
i-                env = getenv("LOG");	Err	bitreich.org	70
i-                log_level = env ? atoi(env) : 0;	Err	bitreich.org	70
i-                log_level = log_level > 0 ? log_level : LOG_DEFAULT;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (log_level < level)	Err	bitreich.org	70
i-                return;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        fprintf(stderr, "%s: ", flag);	Err	bitreich.org	70
i-        vfprintf(stderr, fmt, va);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (errno)	Err	bitreich.org	70
i-                fprintf(stderr, ": %s", strerror(errno));	Err	bitreich.org	70
i-        errno = 0;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        fprintf(stderr, "\n");	Err	bitreich.org	70
i-        fflush(stderr);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-die(int exitcode, char const *fmt, ...)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        va_list va;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        va_start(va, fmt);	Err	bitreich.org	70
i-        vlogf(0, "error", fmt, va);	Err	bitreich.org	70
i-        va_end(va);	Err	bitreich.org	70
i-        exit(exitcode);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-error(char const *fmt, ...)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        va_list va;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        va_start(va, fmt);	Err	bitreich.org	70
i-        vlogf(0, "error", fmt, va);	Err	bitreich.org	70
i-        va_end(va);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-warn(char const *fmt, ...)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        va_list va;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        va_start(va, fmt);	Err	bitreich.org	70
i-        vlogf(1, "warn", fmt, va);	Err	bitreich.org	70
i-        va_end(va);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-info(char const *fmt, ...)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        va_list va;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        va_start(va, fmt);	Err	bitreich.org	70
i-        vlogf(2, "info", fmt, va);	Err	bitreich.org	70
i-        va_end(va);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-debug(char const *fmt, ...)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        va_list va;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        va_start(va, fmt);	Err	bitreich.org	70
i-        vlogf(3, "debug", fmt, va);	Err	bitreich.org	70
i-        va_end(va);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
1diff --git a/src/log.h b/src/log.h	/scm/ploot/file/src/log.h.gph	bitreich.org	70
i@@ -1,15 +0,0 @@	Err	bitreich.org	70
i-#ifndef LOG_H	Err	bitreich.org	70
i-#define LOG_H	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stdarg.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/**/	Err	bitreich.org	70
i-extern int log_level;	Err	bitreich.org	70
i-void                vlogf                        (int, char const *, char const *, va_list);	Err	bitreich.org	70
i-void                die                        (int, char const *, ...);	Err	bitreich.org	70
i-void                error                        (char const *, ...);	Err	bitreich.org	70
i-void                warn                        (char const *, ...);	Err	bitreich.org	70
i-void                info                        (char const *, ...);	Err	bitreich.org	70
i-void                debug                        (char const *, ...);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#endif	Err	bitreich.org	70
1diff --git a/src/scale.c b/src/scale.c	/scm/ploot/file/src/scale.c.gph	bitreich.org	70
i@@ -1,95 +0,0 @@	Err	bitreich.org	70
i-#include "scale.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stddef.h>	Err	bitreich.org	70
i-#include <time.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "util.h"	Err	bitreich.org	70
i-#include "log.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- *        - <max   ^	Err	bitreich.org	70
i- *        -        |        Translate the coordinates between double values	Err	bitreich.org	70
i- *        - <val  szy and height in the plot of <row> rows.	Err	bitreich.org	70
i- *        -        |	Err	bitreich.org	70
i- *        - <min   v	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-int	Err	bitreich.org	70
i-scale_ypos(double val, double min, double max, int szy)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        return szy * (val - min) / (max - min);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- *        <---- szx ---->                Translate the coordinates between the time	Err	bitreich.org	70
i- *                                range and position in the plot of <col> cols.	Err	bitreich.org	70
i- *        t1     t     t2	Err	bitreich.org	70
i- *         | . . | . . |	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-int	Err	bitreich.org	70
i-scale_xpos(time_t t, time_t t1, time_t t2, int szx)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        return szx * (t - t1) / (t2 - t1);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-scale_minmax(struct csv *vl, int ncol,	Err	bitreich.org	70
i-        time_t *tmin, time_t *tmax,	Err	bitreich.org	70
i-        double *vmin, double *vmax)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        double *v;	Err	bitreich.org	70
i-        time_t *t;	Err	bitreich.org	70
i-        size_t n;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        *vmin = *vmax = 0;	Err	bitreich.org	70
i-        *tmin = *tmax = *vl->t;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (; ncol > 0; ncol--, vl++) {	Err	bitreich.org	70
i-                for (t = vl->t, v = vl->v, n = vl->n; n > 0; t++, v++, n--) {	Err	bitreich.org	70
i-                        if (*v < *vmin) *vmin = *v;	Err	bitreich.org	70
i-                        if (*v > *vmax) *vmax = *v;	Err	bitreich.org	70
i-                        if (*t < *tmin) *tmin = *t;	Err	bitreich.org	70
i-                        if (*t > *tmax) *tmax = *t;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (*tmin == *tmax)	Err	bitreich.org	70
i-                die(1, "invalid time scale: min=%lld max=%lld", *tmin, *tmax);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-time_t	Err	bitreich.org	70
i-scale_tstep(time_t min, time_t max, int nval)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        time_t dt, *sc, scale[] = {	Err	bitreich.org	70
i-                1, 5, 2, 10, 20, 30, 60, 60*2, 60*5, 60*10, 60*20, 60*30, 3600, 	Err	bitreich.org	70
i-                3600*2, 3600*5, 3600*10, 3600*18, 3600*24, 3600*24*2, 	Err	bitreich.org	70
i-                3600*24*5, 3600*24*10, 3600*24*20, 3600*24*30, 3600*24*50,	Err	bitreich.org	70
i-                3600*24*100, 3600*24*365, 0	Err	bitreich.org	70
i-        };	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        dt = max - min;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (sc = scale; *sc > 0; sc++)	Err	bitreich.org	70
i-                if (dt < *sc * nval)	Err	bitreich.org	70
i-                        return *sc;	Err	bitreich.org	70
i-        return dt / nval;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-double	Err	bitreich.org	70
i-scale_vstep(double min, double max, int nval)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        double dv, d, *sc, scale[] = { 1, 2, 3, 5 };	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        dv = max - min;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (dv > 1)	Err	bitreich.org	70
i-                for (d = 1; d != 0; d *= 10)	Err	bitreich.org	70
i-                        for (sc = scale; sc < scale + LEN(scale); sc++)	Err	bitreich.org	70
i-                                if (dv < *sc * d * nval)	Err	bitreich.org	70
i-                                        return *sc * d;	Err	bitreich.org	70
i-        if (dv < 1)	Err	bitreich.org	70
i-                for (d = 1; d != 0; d *= 10)	Err	bitreich.org	70
i-                        for (sc = scale + LEN(scale) - 1; sc >= scale; sc--)	Err	bitreich.org	70
i-                                if (dv > *sc / d * nval / 2)	Err	bitreich.org	70
i-                                        return *sc / d;	Err	bitreich.org	70
i-        return 0;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
1diff --git a/src/scale.h b/src/scale.h	/scm/ploot/file/src/scale.h.gph	bitreich.org	70
i@@ -1,16 +0,0 @@	Err	bitreich.org	70
i-#ifndef SCALE_H	Err	bitreich.org	70
i-#define SCALE_H	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stddef.h>	Err	bitreich.org	70
i-#include <time.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "csv.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/**/	Err	bitreich.org	70
i-int                scale_ypos                (double, double, double, int);	Err	bitreich.org	70
i-int                scale_xpos                (time_t, time_t, time_t, int);	Err	bitreich.org	70
i-void                scale_minmax                (struct csv *, int, time_t *, time_t *, double *, double *);	Err	bitreich.org	70
i-time_t                scale_tstep                (time_t, time_t, int);	Err	bitreich.org	70
i-double                scale_vstep                (double, double, int);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#endif	Err	bitreich.org	70
1diff --git a/src/util.c b/src/util.c	/scm/ploot/file/src/util.c.gph	bitreich.org	70
i@@ -1,80 +0,0 @@	Err	bitreich.org	70
i-#include "util.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <ctype.h>	Err	bitreich.org	70
i-#include <errno.h>	Err	bitreich.org	70
i-#include <limits.h>	Err	bitreich.org	70
i-#include <stdarg.h>	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-#include <stdlib.h>	Err	bitreich.org	70
i-#include <string.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-size_t	Err	bitreich.org	70
i-strlcpy(char *buf, const char *str, size_t sz)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        size_t len, cpy;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        cpy = ((len = strlen(str)) > sz) ? (sz) : (len);	Err	bitreich.org	70
i-        memcpy(buf, str, cpy);	Err	bitreich.org	70
i-        buf[sz - 1] = '\0';	Err	bitreich.org	70
i-        return len;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-put3utf(long rune)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        putchar((char)(0xe0 | (0x0f & (rune >> 12))));        /* 1110xxxx */	Err	bitreich.org	70
i-        putchar((char)(0x80 | (0x3f & (rune >> 6))));        /* 10xxxxxx */	Err	bitreich.org	70
i-        putchar((char)(0x80 | (0x3f & (rune))));        /* 10xxxxxx */	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-char *	Err	bitreich.org	70
i-strsep(char **strp, const char *sep)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *s, *prev;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (*strp == NULL)	Err	bitreich.org	70
i-                return NULL;	Err	bitreich.org	70
i-        for (s = prev = *strp; strchr(sep, *s) == NULL; s++);	Err	bitreich.org	70
i-        if (*s == '\0') {	Err	bitreich.org	70
i-                *strp = NULL;	Err	bitreich.org	70
i-                return prev;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        *s = '\0';	Err	bitreich.org	70
i-        *strp = s + 1;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        return prev;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-strchomp(char *s)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *x = s + strlen(s);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        while (--x >= s && (*x == '\r' || *x == '\n'))	Err	bitreich.org	70
i-                *x = '\0';	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Set 'str' to a human-readable form of 'num' with always a width of 8 (+1 for	Err	bitreich.org	70
i- * the '\0' terminator).  Buffer overflow is ensured not to happen due to the	Err	bitreich.org	70
i- * max size of a double.  Return the exponent.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-int	Err	bitreich.org	70
i-humanize(char *str, double val)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int exp, precision;	Err	bitreich.org	70
i-        char label[] = { '\0', 'M', 'G', 'T', 'E' };	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (exp = 0; ABS(val) > 1000; exp++)	Err	bitreich.org	70
i-                val /= 1000;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        precision = (ABS(val) < 10) ? 2 : (ABS(val) < 100) ? 1 : 0;	Err	bitreich.org	70
i-        precision += (exp == 0);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        snprintf(str, 9, "%+.*f %c", precision, val, label[exp]);	Err	bitreich.org	70
i-        str[8] = '\0';	Err	bitreich.org	70
i-        if (val >= 0)	Err	bitreich.org	70
i-                str[0] = ' ';	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        return exp * 3;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
1diff --git a/src/util.h b/src/util.h	/scm/ploot/file/src/util.h.gph	bitreich.org	70
i@@ -1,18 +0,0 @@	Err	bitreich.org	70
i-#ifndef TOOL_H	Err	bitreich.org	70
i-#define TOOL_H	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stddef.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#define LEN(x)                (sizeof(x) / sizeof(*x))	Err	bitreich.org	70
i-#define MAX(x, y)        ((x) > (y) ? (x) : (y))	Err	bitreich.org	70
i-#define MIN(x, y)        ((x) < (y) ? (x) : (y))	Err	bitreich.org	70
i-#define ABS(x)                ((x) < 0 ? -(x) : (x))	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/**/	Err	bitreich.org	70
i-size_t                strlcpy                        (char *, const char *, size_t);	Err	bitreich.org	70
i-void                put3utf                        (long);	Err	bitreich.org	70
i-char *                strsep                        (char **, const char *);	Err	bitreich.org	70
i-void                strchomp                (char *);	Err	bitreich.org	70
i-int                humanize                (char *, double);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#endif	Err	bitreich.org	70
1diff --git a/util.c b/util.c	/scm/ploot/file/util.c.gph	bitreich.org	70
i@@ -0,0 +1,124 @@	Err	bitreich.org	70
i+#include "util.h"	Err	bitreich.org	70
i+#include <ctype.h>	Err	bitreich.org	70
i+#include <errno.h>	Err	bitreich.org	70
i+#include <limits.h>	Err	bitreich.org	70
i+#include <stdarg.h>	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <stdlib.h>	Err	bitreich.org	70
i+#include <string.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+char const *arg0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+_log(char const *fmt, va_list va)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        if (arg0 != NULL)	Err	bitreich.org	70
i+                fprintf(stderr, "%s: ", arg0);	Err	bitreich.org	70
i+        vfprintf(stderr, fmt, va);	Err	bitreich.org	70
i+        fprintf(stderr, "\n");	Err	bitreich.org	70
i+        fflush(stderr);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+err(int e, char const *fmt, ...)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        va_list va;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        va_start(va, fmt);	Err	bitreich.org	70
i+        _log( fmt, va);	Err	bitreich.org	70
i+        exit(e);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+warn(char const *fmt, ...)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        va_list va;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        va_start(va, fmt);	Err	bitreich.org	70
i+        _log(fmt, va);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+debug(char const *fmt, ...)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        static int verbose = -1;	Err	bitreich.org	70
i+        va_list va;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (verbose < 0)	Err	bitreich.org	70
i+                verbose = (getenv("DEBUG") != NULL);	Err	bitreich.org	70
i+        if (!verbose)	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+        va_start(va, fmt);	Err	bitreich.org	70
i+        _log(fmt, va);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+size_t	Err	bitreich.org	70
i+strlcpy(char *buf, const char *str, size_t sz)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        size_t len, cpy;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        cpy = ((len = strlen(str)) > sz) ? (sz) : (len);	Err	bitreich.org	70
i+        memcpy(buf, str, cpy);	Err	bitreich.org	70
i+        buf[sz - 1] = '\0';	Err	bitreich.org	70
i+        return len;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+put3utf(long rune)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        putchar((char)(0xe0 | (0x0f & (rune >> 12))));        /* 1110xxxx */	Err	bitreich.org	70
i+        putchar((char)(0x80 | (0x3f & (rune >> 6))));        /* 10xxxxxx */	Err	bitreich.org	70
i+        putchar((char)(0x80 | (0x3f & (rune))));        /* 10xxxxxx */	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+char *	Err	bitreich.org	70
i+strsep(char **strp, const char *sep)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *s, *prev;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (*strp == NULL)	Err	bitreich.org	70
i+                return NULL;	Err	bitreich.org	70
i+        for (s = prev = *strp; strchr(sep, *s) == NULL; s++);	Err	bitreich.org	70
i+        if (*s == '\0') {	Err	bitreich.org	70
i+                *strp = NULL;	Err	bitreich.org	70
i+                return prev;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        *s = '\0';	Err	bitreich.org	70
i+        *strp = s + 1;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return prev;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+strchomp(char *s)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *x = s + strlen(s);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        while (--x >= s && (*x == '\r' || *x == '\n'))	Err	bitreich.org	70
i+                *x = '\0';	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Set 'str' to a human-readable form of 'num' with always a width of 8 (+1 for	Err	bitreich.org	70
i+ * the '\0' terminator).  Buffer overflow is ensured not to happen due to the	Err	bitreich.org	70
i+ * max size of a double.  Return the exponent.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+int	Err	bitreich.org	70
i+humanize(char *str, double val)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int exp, precision;	Err	bitreich.org	70
i+        char label[] = { '\0', 'M', 'G', 'T', 'E' };	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (exp = 0; ABS(val) > 1000; exp++)	Err	bitreich.org	70
i+                val /= 1000;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        precision = (ABS(val) < 10) ? 2 : (ABS(val) < 100) ? 1 : 0;	Err	bitreich.org	70
i+        precision += (exp == 0);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        snprintf(str, 9, "%+.*f %c", precision, val, label[exp]);	Err	bitreich.org	70
i+        str[8] = '\0';	Err	bitreich.org	70
i+        if (val >= 0)	Err	bitreich.org	70
i+                str[0] = ' ';	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return exp * 3;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/util.h b/util.h	/scm/ploot/file/util.h.gph	bitreich.org	70
i@@ -0,0 +1,22 @@	Err	bitreich.org	70
i+#ifndef TOOL_H	Err	bitreich.org	70
i+#define TOOL_H	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include <stddef.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define LEN(x) (sizeof(x) / sizeof(*x))	Err	bitreich.org	70
i+#define MAX(x, y) ((x) > (y) ? (x) : (y))	Err	bitreich.org	70
i+#define MIN(x, y) ((x) < (y) ? (x) : (y))	Err	bitreich.org	70
i+#define ABS(x) ((x) < 0 ? -(x) : (x))	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+extern char const *arg0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void         err(int, char const *fmt, ...);	Err	bitreich.org	70
i+void         warn(char const *fmt, ...);	Err	bitreich.org	70
i+void         debug(char const *fmt, ...);	Err	bitreich.org	70
i+size_t         strlcpy(char *, const char *, size_t);	Err	bitreich.org	70
i+void         put3utf(long);	Err	bitreich.org	70
i+char        *strsep(char **, const char *);	Err	bitreich.org	70
i+void         strchomp(char *);	Err	bitreich.org	70
i+int         humanize(char *, double);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/ploot/commit/a546b97f9fe7f4a9...
Content-Typetext/plain; charset=utf-8