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:
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

+
+### Bullet
+
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: