aboutsummaryrefslogtreecommitdiffstats
path: root/src/string.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-08-14 15:51:14 +0200
committerDavid Robillard <d@drobilla.net>2020-08-14 19:07:52 +0200
commitdee13339e45305ff0a15b3d50d7cbccdc4722b86 (patch)
treeb0ee56c36cdebeffcd4d274b3e3b77b0f0de026e /src/string.c
parent8827c4a88998b12cbfd2076c207d2d46e57b0b51 (diff)
downloadserd-dee13339e45305ff0a15b3d50d7cbccdc4722b86.tar.gz
serd-dee13339e45305ff0a15b3d50d7cbccdc4722b86.tar.bz2
serd-dee13339e45305ff0a15b3d50d7cbccdc4722b86.zip
Separate base64 implementation
Diffstat (limited to 'src/string.c')
-rw-r--r--src/string.c49
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;
-}