changeset 830:3425a53b6499

base64: reduce code duplication between base64 and base64url Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Fri, 01 Jan 2021 15:53:27 -0500
parents 2abc6dc12302
children 1475c8609196
files base64.c
diffstat 1 files changed, 70 insertions(+), 96 deletions(-) [+]
line wrap: on
line diff
--- a/base64.c	Fri Jan 01 14:44:53 2021 -0500
+++ b/base64.c	Fri Jan 01 15:53:27 2021 -0500
@@ -256,55 +256,43 @@
 	}
 }
 
-void base64_encode_init(struct base64_encoder *state, void *out)
-{
-	__b64_encode_init(state, out);
-}
-
-void base64_encode_step(struct base64_encoder *state,
-			const void *in, size_t inlen)
-{
-	__b64_encode_step(state, in, inlen, b64_encode_table);
-}
-
-void base64_encode_finish(struct base64_encoder *state)
-{
-	__b64_encode_finish(state, b64_encode_table);
-}
-
-void base64_encode(char *out, const void *in, size_t inlen)
-{
-	struct base64_encoder state;
-
-	__b64_encode_init(&state, out);
-	__b64_encode_step(&state, in, inlen, b64_encode_table);
-	__b64_encode_finish(&state, b64_encode_table);
+#define GENERATE(table, init, step, finish, whole)			\
+void init(struct base64_encoder *state, void *out)			\
+{									\
+	__b64_encode_init(state, out);					\
+}									\
+									\
+void step(struct base64_encoder *state, const void *in, size_t inlen)	\
+{									\
+	__b64_encode_step(state, in, inlen, (table));			\
+}									\
+									\
+void finish(struct base64_encoder *state)				\
+{									\
+	__b64_encode_finish(state, (table));				\
+}									\
+									\
+void whole(char *out, const void *in, size_t inlen)			\
+{									\
+	struct base64_encoder state;					\
+									\
+	__b64_encode_init(&state, out);					\
+	__b64_encode_step(&state, in, inlen, (table));			\
+	__b64_encode_finish(&state, (table));				\
 }
 
-void base64url_encode_init(struct base64_encoder *state, void *out)
-{
-	__b64_encode_init(state, out);
-}
-
-void base64url_encode_step(struct base64_encoder *state,
-			   const void *in, size_t inlen)
-{
-	__b64_encode_step(state, in, inlen, b64url_encode_table);
-}
+GENERATE(b64_encode_table,
+	 base64_encode_init,
+	 base64_encode_step,
+	 base64_encode_finish,
+	 base64_encode);
+GENERATE(b64url_encode_table,
+	 base64url_encode_init,
+	 base64url_encode_step,
+	 base64url_encode_finish,
+	 base64url_encode);
 
-void base64url_encode_finish(struct base64_encoder *state)
-{
-	__b64_encode_finish(state, b64url_encode_table);
-}
-
-void base64url_encode(char *out, const void *in, size_t inlen)
-{
-	struct base64_encoder state;
-
-	__b64_encode_init(&state, out);
-	__b64_encode_step(&state, in, inlen, b64url_encode_table);
-	__b64_encode_finish(&state, b64url_encode_table);
-}
+#undef GENERATE
 
 /*
  * Decoder
@@ -517,56 +505,42 @@
 	}
 }
 
-void base64_decode_init(struct base64_decoder *state, void *out)
-{
-	__b64_decode_init(state, out);
-}
-
-bool base64_decode_step(struct base64_decoder *state,
-			const void *in, size_t inlen)
-{
-	return __b64_decode_step(state, in, inlen, b64_decode_table);
-}
-
-ssize_t base64_decode_finish(struct base64_decoder *state)
-{
-	return __b64_decode_finish(state, b64_decode_table);
-}
-
-ssize_t base64_decode(void *out, const char *in, size_t inlen)
-{
-	struct base64_decoder state;
-
-	__b64_decode_init(&state, out);
-	if (!__b64_decode_step(&state, (const uint8_t *) in, inlen,
-			       b64_decode_table))
-		return -1;
-	return __b64_decode_finish(&state, b64_decode_table);
+#define GENERATE(table, init, step, finish, whole)			\
+void init(struct base64_decoder *state, void *out)			\
+{									\
+	__b64_decode_init(state, out);					\
+}									\
+									\
+bool step(struct base64_decoder *state, const void *in, size_t inlen)	\
+{									\
+	return __b64_decode_step(state, in, inlen, (table));		\
+}									\
+									\
+ssize_t finish(struct base64_decoder *state)				\
+{									\
+	return __b64_decode_finish(state, (table));			\
+}									\
+									\
+ssize_t whole(void *out, const char *in, size_t inlen)			\
+{									\
+	struct base64_decoder state;					\
+									\
+	__b64_decode_init(&state, out);					\
+	if (!__b64_decode_step(&state, (const uint8_t *) in, inlen,	\
+			       (table)))				\
+		return -1;						\
+	return __b64_decode_finish(&state, (table));			\
 }
 
-void base64url_decode_init(struct base64_decoder *state, void *out)
-{
-	__b64_decode_init(state, out);
-}
-
-bool base64url_decode_step(struct base64_decoder *state,
-			   const void *in, size_t inlen)
-{
-	return __b64_decode_step(state, in, inlen, b64url_decode_table);
-}
+GENERATE(b64_decode_table,
+	 base64_decode_init,
+	 base64_decode_step,
+	 base64_decode_finish,
+	 base64_decode);
+GENERATE(b64url_decode_table,
+	 base64url_decode_init,
+	 base64url_decode_step,
+	 base64url_decode_finish,
+	 base64url_decode);
 
-ssize_t base64url_decode_finish(struct base64_decoder *state)
-{
-	return __b64_decode_finish(state, b64url_decode_table);
-}
-
-ssize_t base64url_decode(void *out, const char *in, size_t inlen)
-{
-	struct base64_decoder state;
-
-	__b64_decode_init(&state, out);
-	if (!__b64_decode_step(&state, (const uint8_t *) in, inlen,
-			       b64url_decode_table))
-		return -1;
-	return __b64_decode_finish(&state, b64url_decode_table);
-}
+#undef GENERATE