From e4570e8b6e17382e1cc4984684f861524d5b02f4 Mon Sep 17 00:00:00 2001 From: bptato Date: Tue, 2 Feb 2021 22:14:46 +0100 Subject: Support iTerm2 graphics protocol, replace encodeB with base64_encode --- etc.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'etc.c') diff --git a/etc.c b/etc.c index 801b098..aa8b61d 100644 --- a/etc.c +++ b/etc.c @@ -2004,3 +2004,62 @@ void (*mySignal(int signal_number, void (*action) (int))) (int) { return (signal(signal_number, action)); #endif } + +static char Base64Table[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +const char * +base64_encode(const unsigned char *src, int len) +{ + unsigned char *w, *at; + const unsigned char *in, *endw; + int j, k; + + k = len; + if (k % 3) + k += 3 - (k % 3); + k = k / 3 * 4; + + if (k < len) + return ""; + + w = GC_MALLOC_ATOMIC(k); + w[k] = 0; + + at = w; + in = src; + + endw = src + len - 2; + + while (in < endw) { + j = *in++; + j = j << 8 | *in++; + j = j << 8 | *in++; + + *at++ = Base64Table[(j >> 18) & 0x3f]; + *at++ = Base64Table[(j >> 12) & 0x3f]; + *at++ = Base64Table[(j >> 6) & 0x3f]; + *at++ = Base64Table[j & 0x3f]; + } + + if (in - src - len) { + if (in - src - len == 1) { + j = *in++; + j = j << 8; + j = j << 8; + *at++ = Base64Table[(j >> 18) & 0x3f]; + *at++ = Base64Table[(j >> 12) & 0x3f]; + *at++ = '='; + *at++ = '='; + } else { + j = *in++; + j = j << 8 | *in++; + j = j << 8; + *at++ = Base64Table[(j >> 18) & 0x3f]; + *at++ = Base64Table[(j >> 12) & 0x3f]; + *at++ = Base64Table[(j >> 6) & 0x3f]; + *at++ = '='; + } + } + return w; +} -- cgit v1.2.3 From d277e80771a1a5cae19d21bfd895b4e16b3ca959 Mon Sep 17 00:00:00 2001 From: bptato Date: Tue, 2 Feb 2021 23:59:42 +0100 Subject: Some cleanup for base64_encode --- etc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'etc.c') diff --git a/etc.c b/etc.c index aa8b61d..7fabd03 100644 --- a/etc.c +++ b/etc.c @@ -2008,7 +2008,7 @@ void (*mySignal(int signal_number, void (*action) (int))) (int) { static char Base64Table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -const char * +char * base64_encode(const unsigned char *src, int len) { unsigned char *w, *at; @@ -2021,9 +2021,9 @@ base64_encode(const unsigned char *src, int len) k = k / 3 * 4; if (k < len) - return ""; + return NULL; - w = GC_MALLOC_ATOMIC(k); + w = GC_MALLOC_ATOMIC(k + 1); w[k] = 0; at = w; @@ -2061,5 +2061,5 @@ base64_encode(const unsigned char *src, int len) *at++ = '='; } } - return w; + return (char *)w; } -- cgit v1.2.3 From 5cd5a1735af6a5c649c2d6699f8022e722fff170 Mon Sep 17 00:00:00 2001 From: bptato Date: Wed, 3 Feb 2021 10:41:20 +0100 Subject: base64_encode: fix input and output length types --- etc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'etc.c') diff --git a/etc.c b/etc.c index 7fabd03..0c3a004 100644 --- a/etc.c +++ b/etc.c @@ -2009,18 +2009,19 @@ static char Base64Table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char * -base64_encode(const unsigned char *src, int len) +base64_encode(const unsigned char *src, size_t len) { unsigned char *w, *at; const unsigned char *in, *endw; - int j, k; + int j; + size_t k; k = len; if (k % 3) k += 3 - (k % 3); k = k / 3 * 4; - if (k < len) + if (k + 1 < len) return NULL; w = GC_MALLOC_ATOMIC(k + 1); -- cgit v1.2.3 From 1a47d07d665dff4f24005c1f03e97610ecfa2713 Mon Sep 17 00:00:00 2001 From: bptato Date: Wed, 3 Feb 2021 13:03:52 +0100 Subject: Use GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE for allocating memory for base64 encoding --- etc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'etc.c') diff --git a/etc.c b/etc.c index 0c3a004..4e662e4 100644 --- a/etc.c +++ b/etc.c @@ -2024,7 +2024,7 @@ base64_encode(const unsigned char *src, size_t len) if (k + 1 < len) return NULL; - w = GC_MALLOC_ATOMIC(k + 1); + w = GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE(k + 1); w[k] = 0; at = w; -- cgit v1.2.3