/* -*-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.
*
/*----- 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.
*
/* --- @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
*
*/
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);
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;
}
/* --- @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
*
*/
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) {
/* --- 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;
}
acc <<= 6 * (4 - qsz);
qsz *= 6;
while (qsz > 8) {
- dstr_putc(d, (acc >> 16) & 0xff);
+ DPUTC(d, (acc >> 16) & 0xff);
acc <<= 8;
qsz -= 8;
}
/* -*-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
*
/*----- 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.
*
/* --- @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
*
*/
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
*
*/
extern void base64_decode(base64_ctx */*ctx*/,
- const unsigned char */*src*/, size_t /*sz*/,
+ const void */*p*/, size_t /*sz*/,
dstr */*d*/);
/* --- @base64_init@ --- *