From: mdw Date: Tue, 18 May 1999 21:45:27 +0000 (+0000) Subject: Allow Base64 encode and decode of arbitrary rubbish. X-Git-Tag: 2.0.4~313 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/commitdiff_plain/c601c4f1156a25d03edaee3926dc1153a4b315da Allow Base64 encode and decode of arbitrary rubbish. --- diff --git a/base64.c b/base64.c index e5cdcfa..5f5009a 100644 --- a/base64.c +++ b/base64.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: base64.c,v 1.1 1999/05/17 20:35:00 mdw Exp $ + * $Id: base64.c,v 1.2 1999/05/18 21:45:27 mdw Exp $ * * Base64 encoding and decoding. * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: base64.c,v $ + * Revision 1.2 1999/05/18 21:45:27 mdw + * Allow Base64 encode and decode of arbitrary rubbish. + * * Revision 1.1 1999/05/17 20:35:00 mdw * Base64 encoding and decoding support. * @@ -66,7 +69,7 @@ static const signed char base64_decodeMap[] = { /* --- @base64_encode@ --- * * * Arguments: @base64_ctx *ctx@ = pointer to a context block - * @const unsigned char *src@ = pointer to a source buffer + * @const void *p@ = pointer to a source buffer * @size_t sz@ = size of the source buffer * @dstr *d@ = pointer to destination string * @@ -77,22 +80,23 @@ static const signed char base64_decodeMap[] = { */ void base64_encode(base64_ctx *ctx, - const unsigned char *src, size_t sz, + const void *p, size_t sz, dstr *d) { - if (src) { + if (p) { unsigned long acc = ctx->acc; unsigned qsz = ctx->qsz; + const unsigned char *src = p; while (sz) { acc = (acc << 8) | *src++; qsz++; sz--; if (qsz == 3) { - dstr_putc(d, base64_encodeMap[(acc >> 18) & 0x3f]); - dstr_putc(d, base64_encodeMap[(acc >> 12) & 0x3f]); - dstr_putc(d, base64_encodeMap[(acc >> 6) & 0x3f]); - dstr_putc(d, base64_encodeMap[(acc >> 0) & 0x3f]); + DPUTC(d, base64_encodeMap[(acc >> 18) & 0x3f]); + DPUTC(d, base64_encodeMap[(acc >> 12) & 0x3f]); + DPUTC(d, base64_encodeMap[(acc >> 6) & 0x3f]); + DPUTC(d, base64_encodeMap[(acc >> 0) & 0x3f]); ctx->lnlen += 4; if (ctx->maxline && ctx->lnlen >= ctx->maxline) { dstr_puts(d, ctx->indent); @@ -114,18 +118,18 @@ void base64_encode(base64_ctx *ctx, break; case 1: acc <<= 16; - dstr_putc(d, base64_encodeMap[(acc >> 18) & 0x3f]); - dstr_putc(d, base64_encodeMap[(acc >> 12) & 0x3f]); - dstr_putc(d, '='); - dstr_putc(d, '='); + DPUTC(d, base64_encodeMap[(acc >> 18) & 0x3f]); + DPUTC(d, base64_encodeMap[(acc >> 12) & 0x3f]); + DPUTC(d, '='); + DPUTC(d, '='); ctx->lnlen += 4; break; case 2: acc <<= 8; - dstr_putc(d, base64_encodeMap[(acc >> 18) & 0x3f]); - dstr_putc(d, base64_encodeMap[(acc >> 12) & 0x3f]); - dstr_putc(d, base64_encodeMap[(acc >> 6) & 0x3f]); - dstr_putc(d, '='); + DPUTC(d, base64_encodeMap[(acc >> 18) & 0x3f]); + DPUTC(d, base64_encodeMap[(acc >> 12) & 0x3f]); + DPUTC(d, base64_encodeMap[(acc >> 6) & 0x3f]); + DPUTC(d, '='); ctx->lnlen += 4; break; } @@ -137,7 +141,7 @@ void base64_encode(base64_ctx *ctx, /* --- @base64_decode@ --- * * * Arguments: @base64_ctx *ctx@ = pointer to a context block - * @const unsigned char *src@ = pointer to a source buffer + * @const void *p@ = pointer to a source buffer * @size_t sz@ = size of the source buffer * @dstr *d@ = pointer to destination string * @@ -148,12 +152,13 @@ void base64_encode(base64_ctx *ctx, */ void base64_decode(base64_ctx *ctx, - const unsigned char *src, size_t sz, + const void *p, size_t sz, dstr *d) { - if (src) { + if (p) { unsigned long acc = ctx->acc; unsigned qsz = ctx->qsz; + const char *src = p; int ch; while (sz) { @@ -177,9 +182,9 @@ void base64_decode(base64_ctx *ctx, /* --- Maybe write out a completed triplet --- */ if (qsz == 4) { - dstr_putc(d, (acc >> 16) & 0xff); - dstr_putc(d, (acc >> 8) & 0xff); - dstr_putc(d, (acc >> 0) & 0xff); + DPUTC(d, (acc >> 16) & 0xff); + DPUTC(d, (acc >> 8) & 0xff); + DPUTC(d, (acc >> 0) & 0xff); acc = 0; qsz = 0; } @@ -209,7 +214,7 @@ void base64_decode(base64_ctx *ctx, acc <<= 6 * (4 - qsz); qsz *= 6; while (qsz > 8) { - dstr_putc(d, (acc >> 16) & 0xff); + DPUTC(d, (acc >> 16) & 0xff); acc <<= 8; qsz -= 8; } diff --git a/base64.h b/base64.h index c5943d3..09bca75 100644 --- a/base64.h +++ b/base64.h @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: base64.h,v 1.1 1999/05/17 20:35:00 mdw Exp $ + * $Id: base64.h,v 1.2 1999/05/18 21:45:27 mdw Exp $ * * Base64 encoding and decoding * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: base64.h,v $ + * Revision 1.2 1999/05/18 21:45:27 mdw + * Allow Base64 encode and decode of arbitrary rubbish. + * * Revision 1.1 1999/05/17 20:35:00 mdw * Base64 encoding and decoding support. * @@ -61,7 +64,7 @@ typedef struct base64_ctx { /* --- @base64_encode@ --- * * * Arguments: @base64_ctx *ctx@ = pointer to a context block - * @const unsigned char *src@ = pointer to a source buffer + * @const void *p@ = pointer to a source buffer * @size_t sz@ = size of the source buffer * @dstr *d@ = pointer to destination string * @@ -72,13 +75,13 @@ typedef struct base64_ctx { */ extern void base64_encode(base64_ctx */*ctx*/, - const unsigned char */*src*/, size_t /*sz*/, + const void */*p*/, size_t /*sz*/, dstr */*d*/); /* --- @base64_decode@ --- * * * Arguments: @base64_ctx *ctx@ = pointer to a context block - * @const unsigned char *src@ = pointer to a source buffer + * @const void *p@ = pointer to a source buffer * @size_t sz@ = size of the source buffer * @dstr *d@ = pointer to destination string * @@ -89,7 +92,7 @@ extern void base64_encode(base64_ctx */*ctx*/, */ extern void base64_decode(base64_ctx */*ctx*/, - const unsigned char */*src*/, size_t /*sz*/, + const void */*p*/, size_t /*sz*/, dstr */*d*/); /* --- @base64_init@ --- *