1 | // Assume that *out is large enough to contain the output. |
2 | // Theoretically it should be 4/3 the length of src. |
3 | const uint8_t *s = (const uint8_t *) src; |
4 | uint8_t *o = (uint8_t *) out; |
5 | |
6 | // Use local temporaries to avoid cache thrashing: |
7 | size_t olen = 0; |
8 | size_t slen = srclen; |
9 | struct base64_state st; |
10 | st.bytes = state->bytes; |
11 | st.carry = state->carry; |
12 | |
13 | // Turn three bytes into four 6-bit numbers: |
14 | // in[0] = 00111111 |
15 | // in[1] = 00112222 |
16 | // in[2] = 00222233 |
17 | // in[3] = 00333333 |
18 | |
19 | // Duff's device, a for() loop inside a switch() statement. Legal! |
20 | switch (st.bytes) |
21 | { |
22 | for (;;) |
23 | { |
24 | case 0: |
25 | |