changeset 739:c70b925f6484

base64: move encoding/decoding logic to internal static inline helpers This will make base64url encoder/decoder trivial to implement as the only difference between it and base64 is the alphabet. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sun, 31 Mar 2019 14:53:30 +0300
parents d8e454369daf
children 12be3c54727b
files base64.c
diffstat 1 files changed, 16 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/base64.c	Sun Mar 31 14:53:04 2019 +0300
+++ b/base64.c	Sun Mar 31 14:53:30 2019 +0300
@@ -63,9 +63,10 @@
 	 INV,  INV,  INV,  INV,  INV,  INV,  INV,  INV, /* 0xf8..0xff */
 };
 
-void base64_encode(char *out, const void *_in, size_t inlen)
+__attribute__((always_inline))
+static inline void __b64_encode(char *out, const void *_in, size_t inlen,
+				const char *table)
 {
-	const char *table = b64_encode_table;
 	const uint8_t *in = _in;
 	const size_t groups = inlen / 3;
 	uint32_t v;
@@ -114,9 +115,15 @@
 	}
 }
 
-ssize_t base64_decode(void *_out, const char *_in, size_t inlen)
+void base64_encode(char *out, const void *in, size_t inlen)
 {
-	const uint8_t *table = b64_decode_table;
+	__b64_encode(out, in, inlen, b64_encode_table);
+}
+
+__attribute__((always_inline))
+static inline ssize_t __b64_decode(void *_out, const char *_in, size_t inlen,
+				   const uint8_t *table)
+{
 	const uint8_t *in = (const uint8_t *) _in;
 	uint8_t *out = _out;
 	size_t groups;
@@ -181,3 +188,8 @@
 		return (groups * 3);
 	}
 }
+
+ssize_t base64_decode(void *out, const char *in, size_t inlen)
+{
+	return __b64_decode(out, in, inlen, b64_decode_table);
+}