# HG changeset patch # User Josef 'Jeff' Sipek # Date 1609534407 18000 # Node ID 3425a53b6499d172a7bb716ac91561d3ddf1b17f # Parent 2abc6dc1230229b9cfbf54224a3477b9ef63b5ae base64: reduce code duplication between base64 and base64url Signed-off-by: Josef 'Jeff' Sipek diff -r 2abc6dc12302 -r 3425a53b6499 base64.c --- 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