Introduce METER_BUFFER_CHECK and METER_BUFFER_APPEND_CHR to cleanup writing to bar buffers

Closes: #294
This commit is contained in:
Christian Göttsche 2020-11-24 19:34:27 +01:00 committed by Benny Baumann
parent 77ec86aff4
commit ad764ff972
6 changed files with 53 additions and 48 deletions

View File

@ -24,12 +24,11 @@ static void MemoryMeter_updateValues(Meter* this, char* buffer, size_t size) {
Platform_setMemoryValues(this); Platform_setMemoryValues(this);
written = Meter_humanUnit(buffer, this->values[0], size); written = Meter_humanUnit(buffer, this->values[0], size);
buffer += written; METER_BUFFER_CHECK(buffer, size, written);
if ((size -= written) > 0) {
*buffer++ = '/'; METER_BUFFER_APPEND_CHR(buffer, size, '/');
size--;
Meter_humanUnit(buffer, this->total, size); Meter_humanUnit(buffer, this->total, size);
}
} }
static void MemoryMeter_display(const Object* cast, RichString* out) { static void MemoryMeter_display(const Object* cast, RichString* out) {

10
Meter.c
View File

@ -155,7 +155,7 @@ ListItem* Meter_toListItem(Meter* this, bool moving) {
static void TextMeterMode_draw(Meter* this, int x, int y, int w) { static void TextMeterMode_draw(Meter* this, int x, int y, int w) {
char buffer[METER_BUFFER_LEN]; char buffer[METER_BUFFER_LEN];
Meter_updateValues(this, buffer, METER_BUFFER_LEN - 1); Meter_updateValues(this, buffer, sizeof(buffer));
(void) w; (void) w;
attrset(CRT_colors[METER_TEXT]); 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) { static void BarMeterMode_draw(Meter* this, int x, int y, int w) {
char buffer[METER_BUFFER_LEN]; char buffer[METER_BUFFER_LEN];
Meter_updateValues(this, buffer, METER_BUFFER_LEN - 1); Meter_updateValues(this, buffer, sizeof(buffer));
w -= 2; w -= 2;
attrset(CRT_colors[METER_TEXT]); 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++) for (int i = 0; i < nValues - 1; i++)
data->values[i] = data->values[i + 1]; data->values[i] = data->values[i + 1];
char buffer[nValues]; char buffer[METER_BUFFER_LEN];
Meter_updateValues(this, buffer, nValues - 1); Meter_updateValues(this, buffer, sizeof(buffer));
double value = 0.0; double value = 0.0;
for (uint8_t i = 0; i < this->curItems; i++) 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; LEDMeterMode_digits = LEDMeterMode_digitsAscii;
char buffer[METER_BUFFER_LEN]; char buffer[METER_BUFFER_LEN];
Meter_updateValues(this, buffer, METER_BUFFER_LEN - 1); Meter_updateValues(this, buffer, sizeof(buffer));
RichString_begin(out); RichString_begin(out);
Meter_displayBuffer(this, buffer, &out); Meter_displayBuffer(this, buffer, &out);

23
Meter.h
View File

@ -20,6 +20,29 @@ in the source distribution for its full text.
#define METER_BUFFER_LEN 256 #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_; struct Meter_;
typedef struct Meter_ Meter; typedef struct Meter_ Meter;

View File

@ -22,12 +22,11 @@ static void SwapMeter_updateValues(Meter* this, char* buffer, size_t size) {
Platform_setSwapValues(this); Platform_setSwapValues(this);
written = Meter_humanUnit(buffer, this->values[0], size); written = Meter_humanUnit(buffer, this->values[0], size);
buffer += written; METER_BUFFER_CHECK(buffer, size, written);
if ((size -= written) > 0) {
*buffer++ = '/'; METER_BUFFER_APPEND_CHR(buffer, size, '/');
size--;
Meter_humanUnit(buffer, this->total, size); Meter_humanUnit(buffer, this->total, size);
}
} }
static void SwapMeter_display(const Object* cast, RichString* out) { static void SwapMeter_display(const Object* cast, RichString* out) {

View File

@ -20,32 +20,17 @@ static void ZramMeter_updateValues(Meter* this, char* buffer, size_t size) {
this->curItems = 1; this->curItems = 1;
written = Meter_humanUnit(buffer, this->values[0], size); written = Meter_humanUnit(buffer, this->values[0], size);
buffer += written; METER_BUFFER_CHECK(buffer, size, written);
size -= written;
if (size <= 0) { METER_BUFFER_APPEND_CHR(buffer, size, '(');
return;
}
*buffer++ = '(';
size--;
if (size <= 0) {
return;
}
written = Meter_humanUnit(buffer, this->values[1], size); written = Meter_humanUnit(buffer, this->values[1], size);
buffer += written; METER_BUFFER_CHECK(buffer, size, written);
size -= written;
if (size <= 0) { METER_BUFFER_APPEND_CHR(buffer, size, ')');
return;
} METER_BUFFER_APPEND_CHR(buffer, size, '/');
*buffer++ = ')';
size--;
if (size <= 0) {
return;
}
*buffer++ = '/';
size--;
if (size <= 0) {
return;
}
Meter_humanUnit(buffer, this->total, size); Meter_humanUnit(buffer, this->total, size);
} }

View File

@ -38,12 +38,11 @@ static void ZfsArcMeter_updateValues(Meter* this, char* buffer, size_t size) {
Platform_setZfsArcValues(this); Platform_setZfsArcValues(this);
written = Meter_humanUnit(buffer, this->values[5], size); written = Meter_humanUnit(buffer, this->values[5], size);
buffer += written; METER_BUFFER_CHECK(buffer, size, written);
if ((size -= written) > 0) {
*buffer++ = '/'; METER_BUFFER_APPEND_CHR(buffer, size, '/');
size--;
Meter_humanUnit(buffer, this->total, size); Meter_humanUnit(buffer, this->total, size);
}
} }
static void ZfsArcMeter_display(const Object* cast, RichString* out) { static void ZfsArcMeter_display(const Object* cast, RichString* out) {