/* -*-c-*-
*
- * $Id: base64.c,v 1.2 1999/05/18 21:45:27 mdw Exp $
+ * $Id: base64.c,v 1.4 1999/10/15 21:08:46 mdw Exp $
*
* Base64 encoding and decoding.
*
/*----- Revision history --------------------------------------------------*
*
* $Log: base64.c,v $
+ * Revision 1.4 1999/10/15 21:08:46 mdw
+ * Change support for erroneous Base64 streams with length 1 mod 4.
+ *
+ * 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.
*
unsigned long acc = ctx->acc;
unsigned qsz = ctx->qsz;
- /* --- Now fiddle with everything else --- */
+ /* --- Now fiddle with everything else --- *
+ *
+ * There's a bodge here for invalid encodings which have only one hextet
+ * in the final group. I'm not sure this is really worth having, but it
+ * might save some unexpected behaviour. (Not that you won't still get
+ * unexpected behaviour if the stream is completely empty, of course.)
+ */
- acc <<= 6 * (4 - qsz);
- qsz *= 6;
- while (qsz > 8) {
- DPUTC(d, (acc >> 16) & 0xff);
- acc <<= 8;
- qsz -= 8;
+ if (qsz) {
+ acc <<= 6 * (4 - qsz);
+ qsz *= 6;
+ if (qsz < 8)
+ qsz = 8;
+ while (qsz >= 8) {
+ DPUTC(d, (acc >> 16) & 0xff);
+ acc <<= 8;
+ qsz -= 8;
+ }
}
/* --- That seems to be good enough --- */
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)