summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Göttsche <cgzones@googlemail.com>2020-11-24 19:34:27 +0100
committerBenny Baumann <BenBE@geshi.org>2020-12-06 16:03:44 +0100
commitad764ff972082608604634c84e5427e7bfdcda1a (patch)
tree3b4cb72205d708563bd9baf62ef2039dc8bafdac
parent77ec86aff4314afd893baed0d16d7bd52c387fd4 (diff)
Introduce METER_BUFFER_CHECK and METER_BUFFER_APPEND_CHR to cleanup writing to bar buffers
Closes: #294
-rw-r--r--MemoryMeter.c11
-rw-r--r--Meter.c10
-rw-r--r--Meter.h23
-rw-r--r--SwapMeter.c11
-rw-r--r--linux/ZramMeter.c35
-rw-r--r--zfs/ZfsArcMeter.c11
6 files changed, 53 insertions, 48 deletions
diff --git a/MemoryMeter.c b/MemoryMeter.c
index 5e334a93..9830bf51 100644
--- a/MemoryMeter.c
+++ b/MemoryMeter.c
@@ -24,12 +24,11 @@ static void MemoryMeter_updateValues(Meter* this, char* buffer, size_t size) {
Platform_setMemoryValues(this);
written = Meter_humanUnit(buffer, this->values[0], size);
- buffer += written;
- if ((size -= written) > 0) {
- *buffer++ = '/';
- size--;
- Meter_humanUnit(buffer, this->total, size);
- }
+ METER_BUFFER_CHECK(buffer, size, written);
+
+ METER_BUFFER_APPEND_CHR(buffer, size, '/');
+
+ Meter_humanUnit(buffer, this->total, size);
}
static void MemoryMeter_display(const Object* cast, RichString* out) {
diff --git a/Meter.c b/Meter.c
index 9c9a8dea..945911c9 100644
--- a/Meter.c
+++ b/Meter.c
@@ -155,7 +155,7 @@ ListItem* Meter_toListItem(Meter* this, bool moving) {
static void TextMeterMode_draw(Meter* this, int x, int y, int w) {
char buffer[METER_BUFFER_LEN];
- Meter_updateValues(this, buffer, METER_BUFFER_LEN - 1);
+ Meter_updateValues(this, buffer, sizeof(buffer));
(void) w;
attrset(CRT_colors[METER_TEXT]);
@@ -175,7 +175,7 @@ static const char BarMeterMode_characters[] = "|#*@$%&.";
static void BarMeterMode_draw(Meter* this, int x, int y, int w) {
char buffer[METER_BUFFER_LEN];
- Meter_updateValues(this, buffer, METER_BUFFER_LEN - 1);
+ Meter_updateValues(this, buffer, sizeof(buffer));
w -= 2;
attrset(CRT_colors[METER_TEXT]);
@@ -309,8 +309,8 @@ static void GraphMeterMode_draw(Meter* this, int x, int y, int w) {
for (int i = 0; i < nValues - 1; i++)
data->values[i] = data->values[i + 1];
- char buffer[nValues];
- Meter_updateValues(this, buffer, nValues - 1);
+ char buffer[METER_BUFFER_LEN];
+ Meter_updateValues(this, buffer, sizeof(buffer));
double value = 0.0;
for (uint8_t i = 0; i < this->curItems; i++)
@@ -378,7 +378,7 @@ static void LEDMeterMode_draw(Meter* this, int x, int y, int w) {
LEDMeterMode_digits = LEDMeterMode_digitsAscii;
char buffer[METER_BUFFER_LEN];
- Meter_updateValues(this, buffer, METER_BUFFER_LEN - 1);
+ Meter_updateValues(this, buffer, sizeof(buffer));
RichString_begin(out);
Meter_displayBuffer(this, buffer, &out);
diff --git a/Meter.h b/Meter.h
index 13cbebba..cb054057 100644
--- a/Meter.h
+++ b/Meter.h
@@ -20,6 +20,29 @@ in the source distribution for its full text.
#define METER_BUFFER_LEN 256
+#define METER_BUFFER_CHECK(buffer, size, written) \
+ do { \
+ if ((written) < 0 || (size_t)(written) >= (size)) { \
+ return; \
+ } \
+ (buffer) += (written); \
+ (size) -= (size_t)(written); \
+ } while (0)
+
+#define METER_BUFFER_APPEND_CHR(buffer, size, c) \
+ do { \
+ if ((size) < 2) { \
+ return; \
+ } \
+ *(buffer)++ = c; \
+ *(buffer) = '\0'; \
+ (size)--; \
+ if ((size) == 0) { \
+ return; \
+ } \
+ } while (0)
+
+
struct Meter_;
typedef struct Meter_ Meter;
diff --git a/SwapMeter.c b/SwapMeter.c
index 0f8bb5a4..8e39c752 100644
--- a/SwapMeter.c
+++ b/SwapMeter.c
@@ -22,12 +22,11 @@ static void SwapMeter_updateValues(Meter* this, char* buffer, size_t size) {
Platform_setSwapValues(this);
written = Meter_humanUnit(buffer, this->values[0], size);
- buffer += written;
- if ((size -= written) > 0) {
- *buffer++ = '/';
- size--;
- Meter_humanUnit(buffer, this->total, size);
- }
+ METER_BUFFER_CHECK(buffer, size, written);
+
+ METER_BUFFER_APPEND_CHR(buffer, size, '/');
+
+ Meter_humanUnit(buffer, this->total, size);
}
static void SwapMeter_display(const Object* cast, RichString* out) {
diff --git a/linux/ZramMeter.c b/linux/ZramMeter.c
index 35148871..e6b6937e 100644
--- a/linux/ZramMeter.c
+++ b/linux/ZramMeter.c
@@ -20,32 +20,17 @@ static void ZramMeter_updateValues(Meter* this, char* buffer, size_t size) {
this->curItems = 1;
written = Meter_humanUnit(buffer, this->values[0], size);
- buffer += written;
- size -= written;
- if (size <= 0) {
- return;
- }
- *buffer++ = '(';
- size--;
- if (size <= 0) {
- return;
- }
+ METER_BUFFER_CHECK(buffer, size, written);
+
+ METER_BUFFER_APPEND_CHR(buffer, size, '(');
+
written = Meter_humanUnit(buffer, this->values[1], size);
- buffer += written;
- size -= written;
- if (size <= 0) {
- return;
- }
- *buffer++ = ')';
- size--;
- if (size <= 0) {
- return;
- }
- *buffer++ = '/';
- size--;
- if (size <= 0) {
- return;
- }
+ METER_BUFFER_CHECK(buffer, size, written);
+
+ METER_BUFFER_APPEND_CHR(buffer, size, ')');
+
+ METER_BUFFER_APPEND_CHR(buffer, size, '/');
+
Meter_humanUnit(buffer, this->total, size);
}
diff --git a/zfs/ZfsArcMeter.c b/zfs/ZfsArcMeter.c
index 5b8082bb..e844d779 100644
--- a/zfs/ZfsArcMeter.c
+++ b/zfs/ZfsArcMeter.c
@@ -38,12 +38,11 @@ static void ZfsArcMeter_updateValues(Meter* this, char* buffer, size_t size) {
Platform_setZfsArcValues(this);
written = Meter_humanUnit(buffer, this->values[5], size);
- buffer += written;
- if ((size -= written) > 0) {
- *buffer++ = '/';
- size--;
- Meter_humanUnit(buffer, this->total, size);
- }
+ METER_BUFFER_CHECK(buffer, size, written);
+
+ METER_BUFFER_APPEND_CHR(buffer, size, '/');
+
+ Meter_humanUnit(buffer, this->total, size);
}
static void ZfsArcMeter_display(const Object* cast, RichString* out) {

© 2014-2024 Faster IT GmbH | imprint | privacy policy