rizin/librz/cons/bar.c
2022-11-17 14:41:50 +01:00

81 lines
2.2 KiB
C

// SPDX-FileCopyrightText: 2022 Anton Kochkov <anton.kochkov@gmail.com>
// SPDX-License-Identifier: LGPL-3.0-only
#include <rz_cons.h>
#include <rz_util/rz_assert.h>
// TODO: add support for colors
/**
* \brief Create the string buffer with the progressbar
*
* \param opts Progressbar options: color, style, legend
* \param pc How much percent is filled
* \param width Width of the histogram
*/
RZ_API RZ_OWN RzStrBuf *rz_progressbar(RZ_NONNULL RzBarOptions *opts, int pc, int width) {
rz_return_val_if_fail(opts, NULL);
RzStrBuf *buf = rz_strbuf_new("");
if (!buf) {
return NULL;
}
int i, cols = (width == -1) ? 78 : width;
const char *h_line = opts->unicode ? RUNE_LONG_LINE_HORIZ : "-";
const char *block = opts->unicode ? UTF_BLOCK : "#";
pc = RZ_MAX(0, RZ_MIN(100, pc));
if (opts->legend) {
rz_strbuf_appendf(buf, "%4d%% ", pc);
}
cols -= 15;
rz_strbuf_append(buf, "[");
for (i = cols * pc / 100; i; i--) {
rz_strbuf_append(buf, block);
}
for (i = cols - (cols * pc / 100); i; i--) {
rz_strbuf_append(buf, h_line);
}
rz_strbuf_append(buf, "]");
return buf;
}
/**
* \brief Create the string buffer with the rangebar
*
* \param opts Rangebar options: color, style, legend
* \param startA Position of the range start
* \param endA Position of the range end
* \param min Minimum range value
* \param max Maximum range value
* \param width Width of the rangebar
*/
RZ_API RZ_OWN RzStrBuf *rz_rangebar(RZ_NONNULL RzBarOptions *opts, ut64 startA, ut64 endA, ut64 min,
ut64 max, int width) {
rz_return_val_if_fail(opts, NULL);
RzStrBuf *buf = rz_strbuf_new("|");
if (!buf) {
return NULL;
}
int cols = (width == -1) ? 78 : width;
const char *h_line = opts->unicode ? RUNE_LONG_LINE_HORIZ : "-";
const char *block = opts->unicode ? UTF_BLOCK : "#";
int mul = (max - min) / cols;
bool isFirst = true;
for (int j = 0; j < cols; j++) {
ut64 startB = min + (j * mul);
ut64 endB = min + ((j + 1) * mul);
if (startA <= endB && endA >= startB) {
if (opts->color & isFirst) {
rz_strbuf_append(buf, Color_GREEN);
isFirst = false;
}
rz_strbuf_append(buf, block);
} else {
if (!isFirst) {
rz_strbuf_append(buf, Color_RESET);
}
rz_strbuf_append(buf, h_line);
}
}
rz_strbuf_append(buf, "|");
return buf;
}