From a6194c63e6d1dfe1c0346783f06016f16dfe7a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 27 Aug 2021 21:15:19 +0200 Subject: [PATCH] tag: add kb/mb/gb formatters --- CHANGELOG.md | 2 ++ doc/yambar-tags.5.scd | 13 ++++++++++++ tag.c | 46 ++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57fe2e7..365b4fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,8 @@ * network: `poll-interval` option (for the new `signal` and `*-bitrate` tags). * tags: percentage formatter, for range tags: `{tag_name:%}`. +* tags: percentage tag formatter, for range tags: `{tag_name:%}`. +* tags: kb/mb/gb tag formatters. ### Changed diff --git a/doc/yambar-tags.5.scd b/doc/yambar-tags.5.scd index 8d357cb..a237e30 100644 --- a/doc/yambar-tags.5.scd +++ b/doc/yambar-tags.5.scd @@ -72,6 +72,19 @@ be used. : format : Renders a range tag's value as a percentage value : Range tags +| kb +: format +: Renders a tag's value (in decimal) divided by 1024 (note that no + unit suffix is appended) +| mb +: format +: Renders a tag's value (in decimal) divided by 1024^2 (note that no + unit suffix is appended) +| gb +: format +: Renders a tag's value (in decimal) divided by 1024^3 (note that no + unit suffix is appended) +: All tag types | min : selector : Renders a range tag's mininum value diff --git a/tag.c b/tag.c index 0548b2e..fce5d38 100644 --- a/tag.c +++ b/tag.c @@ -459,7 +459,15 @@ tags_expand_template(const char *template, const struct tag_set *tags) sbuf_append_at_most(&formatted, template, begin - template); /* Parse arguments */ - enum { FMT_DEFAULT, FMT_HEX, FMT_OCT, FMT_PERCENT } format = FMT_DEFAULT; + enum { + FMT_DEFAULT, + FMT_HEX, + FMT_OCT, + FMT_PERCENT, + FMT_KBYTE, + FMT_MBYTE, + FMT_GBYTE, + } format = FMT_DEFAULT; enum { VALUE_VALUE, VALUE_MIN, VALUE_MAX, VALUE_UNIT } kind = VALUE_VALUE; for (size_t i = 0; i < MAX_TAG_ARGS; i++) { @@ -471,6 +479,12 @@ tags_expand_template(const char *template, const struct tag_set *tags) format = FMT_OCT; else if (strcmp(tag_args[i], "%") == 0) format = FMT_PERCENT; + else if (strcmp(tag_args[i], "kb") == 0) + format = FMT_KBYTE; + else if (strcmp(tag_args[i], "mb") == 0) + format = FMT_MBYTE; + else if (strcmp(tag_args[i], "gb") == 0) + format = FMT_GBYTE; else if (strcmp(tag_args[i], "min") == 0) kind = VALUE_MIN; else if (strcmp(tag_args[i], "max") == 0) @@ -508,6 +522,21 @@ tags_expand_template(const char *template, const struct tag_set *tags) sbuf_append(&formatted, str); break; } + + case FMT_KBYTE: + case FMT_MBYTE: + case FMT_GBYTE: { + const long divider = + format == FMT_KBYTE ? 1024 : + format == FMT_MBYTE ? 1024 * 1024 : + format == FMT_GBYTE ? 1024 * 1024 * 1024 : + 1; + + char str[24]; + snprintf(str, sizeof(str), "%lu", tag->as_int(tag) / divider); + sbuf_append(&formatted, str); + break; + } } break; @@ -527,9 +556,20 @@ tags_expand_template(const char *template, const struct tag_set *tags) value = (value - min) * 100 / (max - min); fmt = "%lu"; break; - } - + case FMT_KBYTE: + case FMT_MBYTE: + case FMT_GBYTE: { + const long divider = + format == FMT_KBYTE ? 1024 : + format == FMT_MBYTE ? 1024 * 1024 : + format == FMT_GBYTE ? 1024 * 1024 * 1024 : + 1; + value /= divider; + fmt = "%lu"; + break; + } + } char str[24]; snprintf(str, sizeof(str), fmt, value);