diff options
author | David Robillard <d@drobilla.net> | 2018-05-12 12:47:18 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2018-05-27 18:23:15 +0200 |
commit | 7953d861d83abd1a30ae2d620a8ba691bdf2ca1d (patch) | |
tree | b07436aa1a1fbef16c9a515ff930d4fa978f93e8 /src/string.c | |
parent | 2ab12963fd1fb90d254028ff5766afd88a2da54e (diff) | |
download | serd-7953d861d83abd1a30ae2d620a8ba691bdf2ca1d.tar.gz serd-7953d861d83abd1a30ae2d620a8ba691bdf2ca1d.tar.bz2 serd-7953d861d83abd1a30ae2d620a8ba691bdf2ca1d.zip |
Separate base64 implementation
Diffstat (limited to 'src/string.c')
-rw-r--r-- | src/string.c | 47 |
1 files changed, 0 insertions, 47 deletions
diff --git a/src/string.c b/src/string.c index 0ab6cb4a..1755d48a 100644 --- a/src/string.c +++ b/src/string.c @@ -107,50 +107,3 @@ serd_strtod(const char* str, size_t* end) 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 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 1 + (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; -} |