use dynamic (reusable) buffers for internal text buffering - sfeed_curses - sfeed curses UI (now part of sfeed, development is in sfeed)
(HTM) git clone git://git.codemadness.org/sfeed_curses
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 46da76767478ead6d1ebac3f5ab5c835f1840e9c
(DIR) parent 7d9d4d493a90bbd56bbe5cf175970a32ecb915bd
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Tue, 16 Mar 2021 18:11:19 +0100
use dynamic (reusable) buffers for internal text buffering
- Fixes an issue when the sidebar would be > 256 columns long the text on the
row would not be displayed. Especially noticable in the monocle and horizontal
layout in fullscreen on bigger screens.
- Fixes a silent truncation which would make searching on titles with > 1024
bytes not work.
Diffstat:
M sfeed_curses.c | 39 +++++++++++++++++++++++++------
1 file changed, 32 insertions(+), 7 deletions(-)
---
(DIR) diff --git a/sfeed_curses.c b/sfeed_curses.c
@@ -1329,6 +1329,7 @@ updatenewitems(struct feed *f)
void
feed_load(struct feed *f, FILE *fp)
{
+ /* reuse local buffers */
static struct items items;
struct pane *p;
size_t i;
@@ -1750,9 +1751,12 @@ mousereport(int button, int release, int x, int y)
char *
feed_row_format(struct pane *p, struct row *row)
{
+ /* reuse local buffers */
+ static char *bufw, *text;
+ static size_t bufwsize, textsize;
struct feed *feed;
- static char text[1024];
- char bufw[256], counts[128];
+ size_t needsize;
+ char counts[128];
int len, w;
feed = (struct feed *)row->data;
@@ -1765,8 +1769,20 @@ feed_row_format(struct pane *p, struct row *row)
else
w = p->width - len;
- if (utf8pad(bufw, sizeof(bufw), feed->name, w, ' ') != -1)
- snprintf(text, sizeof(text), "%s%s", bufw, counts);
+ needsize = (w + 1) * 4;
+ if (needsize > bufwsize) {
+ bufwsize = needsize;
+ bufw = erealloc(bufw, bufwsize);
+ }
+
+ needsize = bufwsize + sizeof(counts) + 1;
+ if (needsize > textsize) {
+ textsize = needsize;
+ text = erealloc(text, textsize);
+ }
+
+ if (utf8pad(bufw, bufwsize, feed->name, w, ' ') != -1)
+ snprintf(text, textsize, "%s%s", bufw, counts);
else
text[0] = '\0';
@@ -1820,19 +1836,28 @@ item_row_get(struct pane *p, off_t pos)
char *
item_row_format(struct pane *p, struct row *row)
{
- static char text[1024];
+ /* reuse local buffers */
+ static char *text;
+ static size_t textsize;
struct item *item;
struct tm tm;
+ size_t needsize;
item = (struct item *)row->data;
+ needsize = strlen(item->fields[FieldTitle]) + 21;
+ if (needsize > textsize) {
+ textsize = needsize;
+ text = erealloc(text, textsize);
+ }
+
if (item->timeok && localtime_r(&(item->timestamp), &tm)) {
- snprintf(text, sizeof(text), "%c %04d-%02d-%02d %02d:%02d %s",
+ snprintf(text, textsize, "%c %04d-%02d-%02d %02d:%02d %s",
item->fields[FieldEnclosure][0] ? '@' : ' ',
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, item->fields[FieldTitle]);
} else {
- snprintf(text, sizeof(text), "%c %s",
+ snprintf(text, textsize, "%c %s",
item->fields[FieldEnclosure][0] ? '@' : ' ',
item->fields[FieldTitle]);
}