From 9eb8db15487257d9eb344480f693b319812d3d78 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 12 May 2018 12:47:18 +0200 Subject: Separate base64 implementation --- src/string.c | 52 ---------------------------------------------------- 1 file changed, 52 deletions(-) (limited to 'src/string.c') diff --git a/src/string.c b/src/string.c index 20e2e562..1df8bd1d 100644 --- a/src/string.c +++ b/src/string.c @@ -19,7 +19,6 @@ #include "serd/serd.h" #include -#include #include #include @@ -131,54 +130,3 @@ serd_strtod(const char* str, size_t* end) SET_END(s - str); 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 char* str, size_t len, size_t* size) -{ - const uint8_t* ustr = (const uint8_t*)str; - - 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(ustr[i]); ++i) {} // Skip junk - in[n_in] = ustr[i++]; - } - if (n_in > 1) { - *size += decode_chunk(in, (uint8_t*)buf + j); - } - } - return buf; -} -- cgit v1.2.1