diff options
author | Christian Göttsche <cgzones@googlemail.com> | 2020-11-24 19:34:27 +0100 |
---|---|---|
committer | Benny Baumann <BenBE@geshi.org> | 2020-12-06 16:03:44 +0100 |
commit | ad764ff972082608604634c84e5427e7bfdcda1a (patch) | |
tree | 3b4cb72205d708563bd9baf62ef2039dc8bafdac | |
parent | 77ec86aff4314afd893baed0d16d7bd52c387fd4 (diff) |
Introduce METER_BUFFER_CHECK and METER_BUFFER_APPEND_CHR to cleanup writing to bar buffers
Closes: #294
-rw-r--r-- | MemoryMeter.c | 11 | ||||
-rw-r--r-- | Meter.c | 10 | ||||
-rw-r--r-- | Meter.h | 23 | ||||
-rw-r--r-- | SwapMeter.c | 11 | ||||
-rw-r--r-- | linux/ZramMeter.c | 35 | ||||
-rw-r--r-- | zfs/ZfsArcMeter.c | 11 |
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) { @@ -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); @@ -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) { |