diff --git a/libr/cons/canvas.c b/libr/cons/canvas.c index 7676c336a63b7..ff9b74d40989e 100644 --- a/libr/cons/canvas.c +++ b/libr/cons/canvas.c @@ -114,7 +114,7 @@ static void stamp_attr(RConsCanvas *c, int loc, int length) { s = attr_at (c, loc); if (s) { - if (strlen (*s) > 2 && *(*s + 2) == '0') { + if (*s != 0 && strlen (*s) > 2 && *(*s + 2) == '0') { if (strlen (c->attr) == 5 && *(c->attr + 2) != '0') { char tmp[9]; memcpy (tmp, c->attr, 2); @@ -135,7 +135,7 @@ static void stamp_attr(RConsCanvas *c, int loc, int length) { for (i = 1; i < length; i++) { s = attr_at (c, loc + i); if (s) { - *s = Color_RESET; + *s = 0; } } } @@ -285,10 +285,13 @@ static int bytes_utf8len(const char *s, int n, int left) { } i++; } - return i - 1; + return n == -1 ? i - 1 : i; } static int expand_line (RConsCanvas *c, int real_len, int utf8_len) { + if (real_len == 0) { + return true; + } int buf_utf8_len = bytes_utf8len (c->b[c->y] + c->x, utf8_len, c->blen[c->y] - c->x); int goback = R_MAX (0, (buf_utf8_len - real_len)); int padding = (real_len - utf8_len) - goback; @@ -304,13 +307,20 @@ static int expand_line (RConsCanvas *c, int real_len, int utf8_len) { c->b[c->y] = newline; c->bsize[c->y] = newsize; } - int size = c->blen[c->y] - c->x - utf8_len; + int size = R_MAX (c->blen[c->y] - c->x - utf8_len, 0); char *start = c->b[c->y] + c->x + utf8_len; char *tmp = malloc (size); if (!tmp) { return false; } memcpy (tmp, start, size); + if (padding < 0) { + int lap = R_MAX (0, c->b[c->y] - (start + padding)); + memcpy (start + padding + lap, tmp + lap, size - lap); + free (tmp); + c->blen[c->y] += padding; + return true; + } memcpy (start + padding, tmp, size); free (tmp); c->blen[c->y] += padding; @@ -339,8 +349,15 @@ R_API void r_cons_canvas_write(RConsCanvas *c, const char *s) { if (piece_len == 0 && ch == '\0' && s_part == s) { break; } - left = c->blen[c->y] - c->x; - slen = R_MIN (left, piece_len); + left = c->blen[c->y] - c->x; + slen = piece_len; + + if (piece_len > left) { + int utf8_piece_len = utf8len_fixed (s_part, piece_len); + if (utf8_piece_len >= c->w - attr_x) { + slen = left; + } + } int real_len = r_str_nlen (s_part, slen); int utf8_len = utf8len_fixed (s_part, slen); @@ -360,6 +377,8 @@ R_API void r_cons_canvas_write(RConsCanvas *c, const char *s) { s = s_part; if (ch == '\n') { + c->attr = Color_RESET; + stamp_attr (c, c->y*c->w + attr_x, strlen (Color_RESET)); c->y++; s++; if (*s == '\0' || c->y >= c->h) { diff --git a/libr/core/panels.c b/libr/core/panels.c index cb7fc4348cf9d..6ed2a52bd0584 100644 --- a/libr/core/panels.c +++ b/libr/core/panels.c @@ -725,6 +725,9 @@ R_API void r_core_panels_refresh(RCore *core) { } static void doPanelsRefresh(RCore *core) { + if (!core->panels) { + return; + } core->panels->isResizing = true; r_core_panels_layout (core->panels); r_core_panels_refresh (core);