/* -*-c-*-
*
- * $Id: base64.c,v 1.3 1999/05/21 22:14:30 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.
*
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 --- */