From dee13339e45305ff0a15b3d50d7cbccdc4722b86 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 14 Aug 2020 15:51:14 +0200 Subject: Separate base64 implementation --- src/string.c | 49 ------------------------------------------------- 1 file changed, 49 deletions(-) (limited to 'src/string.c') diff --git a/src/string.c b/src/string.c index 86dc739e..e1e5dbda 100644 --- a/src/string.c +++ b/src/string.c @@ -164,52 +164,3 @@ serd_strtod(const char* str, char** endptr) return result * sign; } - -/** - Base64 decoding table. - This is indexed by encoded characters and returns the numeric value used - for decoding, shifted up by 47 to be in the range of printable ASCII. - A '$' is a placeholder for characters not in the base64 alphabet. -*/ -static const char b64_unmap[] = - "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$m$$$ncdefghijkl$$$$$$" - "$/0123456789:;<=>?@ABCDEFGH$$$$$$IJKLMNOPQRSTUVWXYZ[\\]^_`ab$$$$" - "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" - "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"; - -static inline uint8_t -unmap(const uint8_t in) -{ - return (uint8_t)(b64_unmap[in] - 47); -} - -/** - Decode 4 base64 characters to 3 raw bytes. -*/ -static inline size_t -decode_chunk(const uint8_t in[4], uint8_t out[3]) -{ - out[0] = (uint8_t)(((unmap(in[0]) << 2)) | unmap(in[1]) >> 4); - out[1] = (uint8_t)(((unmap(in[1]) << 4) & 0xF0) | unmap(in[2]) >> 2); - out[2] = (uint8_t)(((unmap(in[2]) << 6) & 0xC0) | unmap(in[3])); - return 1u + (in[2] != '=') + ((in[2] != '=') && (in[3] != '=')); -} - -void* -serd_base64_decode(const uint8_t* str, size_t len, size_t* size) -{ - void* buf = malloc((len * 3) / 4 + 2); - *size = 0; - for (size_t i = 0, j = 0; i < len; j += 3) { - uint8_t in[] = "===="; - size_t n_in = 0; - for (; i < len && n_in < 4; ++n_in) { - for (; i < len && !is_base64(str[i]); ++i) {} // Skip junk - in[n_in] = str[i++]; - } - if (n_in > 1) { - *size += decode_chunk(in, (uint8_t*)buf + j); - } - } - return buf; -} -- cgit v1.2.1