From de26f6156c2511df39981e2269672294e585ef8a Mon Sep 17 00:00:00 2001 From: bptato Date: Thu, 18 Feb 2021 17:23:42 +0100 Subject: Handle iTerm2 images more efficiently --- etc.c | 6 ++++-- terms.c | 49 ++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/etc.c b/etc.c index 4e662e4..2870caf 100644 --- a/etc.c +++ b/etc.c @@ -2013,7 +2013,7 @@ base64_encode(const unsigned char *src, size_t len) { unsigned char *w, *at; const unsigned char *in, *endw; - int j; + unsigned long j; size_t k; k = len; @@ -2024,7 +2024,9 @@ base64_encode(const unsigned char *src, size_t len) if (k + 1 < len) return NULL; - w = GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE(k + 1); + w = GC_MALLOC_ATOMIC(k + 1); + if (!w) + return NULL; w[k] = 0; at = w; diff --git a/terms.c b/terms.c index 966006a..f7c300e 100644 --- a/terms.c +++ b/terms.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -489,20 +490,19 @@ put_image_osc5379(char *url, int x, int y, int w, int h, int sx, int sy, int sw, void put_image_iterm2(char *url, int x, int y, int w, int h) { - Str buf, filecontent; - const char *base64; + Str buf; + char *base64, *cbuf; FILE *fp; + int c, i; + struct stat st; - fp = fopen(url, "r"); - if (!fp) + if (stat(url, &st)) return; - filecontent = Strfgetall(fp); - base64 = base64_encode(filecontent->ptr, filecontent->length); - if (!base64) + fp = fopen(url, "r"); + if (!fp) return; - MOVE(y,x); buf = Sprintf("\x1b]1337;" "File=" "name=%s;" @@ -511,8 +511,39 @@ put_image_iterm2(char *url, int x, int y, int w, int h) "height=%d;" "preserveAspectRatio=0;" "inline=1" - ":%s\a", url, filecontent->length, w, h, base64); + ":", url, st.st_size, w, h); + + MOVE(y,x); + writestr(buf->ptr); + + cbuf = GC_MALLOC_ATOMIC(3072); + i = 0; + while ((c = fgetc(fp)) != EOF) { + cbuf[i] = c; + Strcat_char(buf, c); + ++i; + if (i == 3072) { + base64 = base64_encode(cbuf, i); + if (!base64) { + writestr("\a"); + return; + } + writestr(base64); + i = 0; + } + } + + if (i) { + base64 = base64_encode(cbuf, i); + if (!base64) { + writestr("\a"); + return; + } + writestr(base64); + } + + writestr("\a"); MOVE(Currentbuf->cursorY,Currentbuf->cursorX); } -- cgit v1.2.3