On 18 March 2017 at 08:18, Omar Sandoval <[email protected]> wrote: > This is used by, e.g., tmux. > --- > st.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > st.info | 1 + > 2 files changed, 58 insertions(+) > > diff --git a/st.c b/st.c > index fbcd9e0..f3b8846 100644 > --- a/st.c > +++ b/st.c > @@ -491,6 +491,8 @@ static char utf8encodebyte(Rune, size_t); > static char *utf8strchr(char *s, Rune u); > static size_t utf8validate(Rune *, size_t); > > +static char *base64dec(const char *); > + > static ssize_t xwrite(int, const char *, size_t); > static void *xmalloc(size_t); > static void *xrealloc(void *, size_t); > @@ -704,6 +706,48 @@ utf8validate(Rune *u, size_t i) > return i; > } > > +static const char base64_digits[] = { > + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > 0, > + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, > + 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, -1, 0, 0, 0, 0, > 1, > + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, > 21, > + 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, > + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, > + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > 0, > + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > 0, > + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > 0, > + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > 0, > + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > 0, > + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 > +}; > + > +char * > +base64dec(const char *src) > +{ > + size_t in_len = strlen(src); > + char *result, *dst; > + > + if (in_len % 4) > + return NULL; > + result = dst = xmalloc(in_len / 4 * 3 + 1); > + while (*src) { > + char a = base64_digits[(unsigned char)*(src++)]; > + char b = base64_digits[(unsigned char)*(src++)]; > + char c = base64_digits[(unsigned char)*(src++)]; > + char d = base64_digits[(unsigned char)*(src++)]; > + > + *(dst++) = (a << 2) | ((b & 0x30) >> 4); > + if (c == (char)-1) > + break; > + *(dst++) = ((b & 0x0f) << 4) | ((c & 0x3c) >> 2); > + if (d == (char)-1) > + break; > + *(dst++) = ((c & 0x03) << 6) | d; > + } > + *dst = '\0'; > + return result; > +} > + > void > selinit(void) > { > @@ -2533,6 +2577,19 @@ strhandle(void) > if (narg > 1) > xsettitle(strescseq.args[1]); > return; > + case 52: > + if (narg > 2) { > + char *dec; > + > + dec = base64dec(strescseq.args[2]); > + if (dec) { > + xsetsel(dec, CurrentTime); > + clipcopy(NULL); > + } else { > + fprintf(stderr, "erresc: invalid > base64\n"); > + } > + } > + return; > case 4: /* color set */ > if (narg < 3) > break; > diff --git a/st.info b/st.info > index 13cc8eb..0b928af 100644 > --- a/st.info > +++ b/st.info > @@ -189,6 +189,7 @@ st| simpleterm, > Se, > Ss, > Tc, > + Ms=\E]52;%p1%s;%p2%s\007, > > st-256color| simpleterm with 256 colors, > use=st, > -- > 2.12.0
>From my perspective ok. @frign? -Anselm
