diff options
author | David Robillard <d@drobilla.net> | 2020-08-14 15:51:14 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-08-14 19:07:52 +0200 |
commit | dee13339e45305ff0a15b3d50d7cbccdc4722b86 (patch) | |
tree | b0ee56c36cdebeffcd4d274b3e3b77b0f0de026e /src/string.c | |
parent | 8827c4a88998b12cbfd2076c207d2d46e57b0b51 (diff) | |
download | serd-dee13339e45305ff0a15b3d50d7cbccdc4722b86.tar.gz serd-dee13339e45305ff0a15b3d50d7cbccdc4722b86.tar.bz2 serd-dee13339e45305ff0a15b3d50d7cbccdc4722b86.zip |
Separate base64 implementation
Diffstat (limited to 'src/string.c')
-rw-r--r-- | src/string.c | 49 |
1 files changed, 0 insertions, 49 deletions
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; -} |