ervy

Bring charts to terminal.
git clone https://noulin.net/git/ervy.git
Log | Files | Refs | README | LICENSE

commit c14bc2fa1daf4c1254ae9669a76d0a0ca7a921d9
parent 91faf1d7c8c56ea1ca8ad8ad55ab41f42167dbb8
Author: Remy Noulin <loader2x@gmail.com>
Date:   Sat,  9 Feb 2019 18:14:06 +0100

add bullet

README.md       |   3 ++
bullet.c        |  99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
bullet.h        |   5 +++
ervy.h          |   1 +
example.c       |  14 ++++++--
imgs/bullet.png | Bin 0 -> 1005 bytes
package.yml     |   2 +-
utils.c         |  12 +++++++
utils.h         |   3 ++
9 files changed, 136 insertions(+), 3 deletions(-)

Diffstat:
MREADME.md | 3+++
Abullet.c | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abullet.h | 5+++++
Mervy.h | 1+
Mexample.c | 14++++++++++++--
Aimgs/bullet.png | 0
Mpackage.yml | 2+-
Mutils.c | 12++++++++++++
Mutils.h | 3+++
9 files changed, 136 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md @@ -17,3 +17,6 @@ See `example.c` for an example. ## Supported Chart types ### Bar ![](/imgs/bar.png) + +### Bullet +![](/imgs/bullet.png) diff --git a/bullet.c b/bullet.c @@ -0,0 +1,99 @@ + +#include "bar.h" +#include "math.h" +#include "limits.h" + +char *bullet(char *data, char *opts) { + var dat = verifyData(data); + if (!dat) ret NULL; + + createSmallJson(newOpts); + parseG(&newOpts, "{\ + barWidth: 1,\ + left: 1,\ + width: 20,\ + padding: 1,\ + style: '*'\ + }"); + + createAllocateSmallJson(oopts); + if (opts) { + parseG(oopts, opts); + } + + mergeNSmashG(&newOpts, oopts); + + var barWidth = getG(&newOpts, rtI64, "barWidth"); + var left = getG(&newOpts, rtI64, "left"); + var width = getG(&newOpts, rtI64, "width"); + var padding = getG(&newOpts, rtI64, "padding"); + var style = getG(&newOpts, rtChar, "style"); + + var result = repeatS(PAD, left); + + + createSmallArray(values); + + iter(dat, V) { + cast(smallDictt*, v, V); + pushG(&values, getNumG(v, "value")); + } + + var max = getG(&values, rtF64, 0); + + range(i, lenG(&values)) { + max = maxV(max, getNumG(&values, i)); + } + var maxKeyLength = maxKeyLen(dat); + var valLength = lenG(dat); + + range(i, valLength) { + var tmp = getG(dat, rtSmallDictt, i); + var ratioLength = round(width * getNumG(tmp, "value") / max); + + var padChar = style; + if (hasG(tmp, "style")) padChar = getG(tmp, rtChar, "style"); + + var pads = repeatS(padChar, ratioLength); + var pad = repeatS(PAD, left); + var line = catS(pads, EOL, pad); + freeManyS(pads, pad); + + var key = getNDupG(tmp, rtChar, "key"); + iPadStartS(&key, maxKeyLength, PAD); + iAppendManyS(&result, key, PAD); + free(key); + + var curBarWidth = barWidth; + if (hasG(tmp, "barWidth")) curBarWidth = getG(tmp, rtI64, "barWidth"); + + range(j, curBarWidth) { + if (j > 0) { + var pad = repeatS(PAD, maxKeyLength + 1); + iAppendManyS(&result, pad, line); + free(pad); + } + else { + iAppendS(&result, line); + } + } + + free(line); + + if (i != valLength - 1) { + var eol = repeatS(EOL, padding); + var pad = repeatS(PAD, left); + iAppendManyS(&result, eol, pad); + freeManyS(eol,pad); + } + + finishG(tmp); + } + + + freeManyG(&newOpts, &values); + terminateG(dat); + + ret result; +} +// vim: set expandtab ts=2 sw=2: diff --git a/bullet.h b/bullet.h @@ -0,0 +1,5 @@ +#pragma once + +#include "utils.h" + +char *bullet(char *data, char *opts); diff --git a/ervy.h b/ervy.h @@ -1,3 +1,4 @@ #pragma once #include "bar.h" +#include "bullet.h" diff --git a/example.c b/example.c @@ -16,10 +16,9 @@ int main(int ARGC, char** ARGV) { argc = ARGC; argv = ARGV; initLibsheepy(ARGV[0]); - setLogMode(LOG_VERBOSE); - //setLogSymbols(LOG_UTF8); + // Bar char *barData = "[\ { key: 'A', value: 5.3, style: '*' },\ { key: 'B', value: 3.1, style: '+' },\ @@ -39,11 +38,22 @@ int main(int ARGC, char** ARGV) { puts(bar(barData, NULL)); + put /* char *opts = "{barWidth: 12, left: 0, height: 30, padding: 5, style: '~'}"; */ /* */ /* puts(bar(barData, opts)); */ + // Bullet + char *bulletData = "[\ + { key: 'Month', value: 5, barWidth: 2 },\ + { key: 'Week', value: 3, style: '"RED"+"RST"', barWidth: 2 },\ + { key: 'Day', value: 20, style: '"BGBLU " "RST"'},\ + { key: 'Now', value: 15, style: '"BGCYN " "RST"'}\ + ]"; + + puts(bullet(bulletData, NULL)); + } // vim: set expandtab ts=2 sw=2: diff --git a/imgs/bullet.png b/imgs/bullet.png Binary files differ. diff --git a/package.yml b/package.yml @@ -1,6 +1,6 @@ --- name: ervy - version: 0.0.3 + version: 0.0.5 description: "bring chart to terminal" bin: ./ervy.c #cflags: -DA -ggdb -std=gnu11 -fPIC -pipe diff --git a/utils.c b/utils.c @@ -52,4 +52,16 @@ smallJsont* verifyData(char *data) { terminateG(r); ret NULL; } + +size_t maxKeyLen(smallJsont* data) { + size_t r = 0; + + iter(data, V) { + cast(smallDictt*,v,V); + r = maxV(r, lenG(getG(v, rtChar, "key"))); + } + + ret r; +} + // vim: set expandtab ts=2 sw=2: diff --git a/utils.h b/utils.h @@ -10,4 +10,7 @@ char *bg(char *color, size_t length); char *padMid(char *str, size_t width); smallJsont* verifyData(char *data); + +size_t maxKeyLen(smallJsont* data); + // vim: set expandtab ts=2 sw=2: