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