X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/ceba19865c063cf6d2fa5ba3ebcf43674a101549..de7321c7a482eaf0e80b549412578477729678a8:/base64.c diff --git a/base64.c b/base64.c index e5cdcfa..10ce91e 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.3 1999/05/21 22:14:30 mdw Exp $ * * Base64 encoding and decoding. * @@ -30,6 +30,12 @@ /*----- Revision history --------------------------------------------------* * * $Log: base64.c,v $ + * Revision 1.3 1999/05/21 22:14:30 mdw + * Take advantage of the new dynamic string macros. + * + * 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 +72,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 +83,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 +121,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 +144,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 +155,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 +185,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 +217,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; } @@ -246,12 +254,11 @@ void base64_init(base64_ctx *ctx) int main(int argc, char *argv[]) { unsigned char buf[BUFSIZ]; - dstr d; + dstr d = DSTR_INIT; base64_ctx ctx; void (*proc)(base64_ctx *, const unsigned char *, size_t, dstr *); size_t sz; - dstr_create(&d); base64_init(&ctx); if (argc > 1 && strcmp(argv[1], "-d") == 0)