#define TABLE_SPACE -2
#define TABLE_END -3
+/* FIXME: Make sure that all whitespace characters, SPC, HT, VT, FF,
+ * CR and LF are ignored. */
static const signed char
decode_table[0x100] =
{
switch(data)
{
default:
- {
- unsigned done = 0;
-
- assert(data >= 0 && data < 0x40);
+ assert(data >= 0 && data < 0x40);
- if (ctx->status != BASE64_DECODE_OK)
- goto invalid;
-
- ctx->word = ctx->word << 6 | data;
- ctx->bits += 6;
-
- if (ctx->bits >= 8)
- {
- ctx->bits -= 8;
- dst[done++] = ctx->word >> ctx->bits;
- }
- return done;
- }
+ if (ctx->status != BASE64_DECODE_OK)
+ goto invalid;
+
+ ctx->word = ctx->word << 6 | data;
+ ctx->bits += 6;
+
+ if (ctx->bits >= 8)
+ {
+ ctx->bits -= 8;
+ dst[0] = ctx->word >> ctx->bits;
+ return 1;
+ }
+ else return 0;
+
case TABLE_INVALID:
invalid:
ctx->status = BASE64_DECODE_ERROR;
+ /* Fall through */
+
+ case TABLE_SPACE:
return 0;
-
+
case TABLE_END:
if (!ctx->bits)
goto invalid;
if (ctx->word & ( (1<<ctx->bits) - 1))
/* We shouldn't have any leftover bits */
goto invalid;
-
+
ctx->status = BASE64_DECODE_END;
ctx->bits -= 2;
- /* Fall through */
-
- case TABLE_SPACE:
- /* Ignore */
return 0;
}
}
unsigned length,
const uint8_t *src)
{
- unsigned done = 0;
+ unsigned done;
unsigned i;
if (ctx->status == BASE64_DECODE_ERROR)
return 0;
- for (i = 0; i<length; i++)
+ for (i = 0, done = 0; i<length; i++)
done += base64_decode_single(ctx, dst + done, src[i]);
assert(done <= BASE64_DECODE_LENGTH(length));