| 1 | if (slen-- == 0) { |
|---|---|
| 2 | ret = 1; |
| 3 | break; |
| 4 | } |
| 5 | if ((q = base64_table_dec[*s++]) >= 254) { |
| 6 | st.eof = BASE64_EOF; |
| 7 | // Treat character '=' as invalid for byte 0: |
| 8 | break; |
| 9 | } |
| 10 | st.carry = q << 2; |
| 11 | st.bytes++; |
| 12 | |
| 13 | // Deliberate fallthrough: |
| 14 | BASE64_FALLTHROUGH |
| 15 | |
| 16 | case 1: if (slen-- == 0) { |
| 17 | ret = 1; |
| 18 | break; |
| 19 | } |
| 20 | if ((q = base64_table_dec[*s++]) >= 254) { |
| 21 | st.eof = BASE64_EOF; |
| 22 | // Treat character '=' as invalid for byte 1: |
| 23 | break; |
| 24 | } |
| 25 | *o++ = st.carry | (q >> 4); |
| 26 | st.carry = q << 4; |
| 27 | st.bytes++; |
| 28 | olen++; |
| 29 | |
| 30 | // Deliberate fallthrough: |
| 31 | BASE64_FALLTHROUGH |
| 32 | |
| 33 | case 2: if (slen-- == 0) { |
| 34 | ret = 1; |
| 35 | break; |
| 36 | } |
| 37 | if ((q = base64_table_dec[*s++]) >= 254) { |
| 38 | st.bytes++; |
| 39 | // When q == 254, the input char is '='. |
| 40 | // Check if next byte is also '=': |
| 41 | if (q == 254) { |
| 42 | if (slen-- != 0) { |
| 43 | st.bytes = 0; |
| 44 | // EOF: |
| 45 | st.eof = BASE64_EOF; |
| 46 | q = base64_table_dec[*s++]; |
| 47 | ret = ((q == 254) && (slen == 0)) ? 1 : 0; |
| 48 | break; |
| 49 | } |
| 50 | else { |
| 51 | // Almost EOF |
| 52 | st.eof = BASE64_AEOF; |
| 53 | ret = 1; |
| 54 | break; |
| 55 | } |
| 56 | } |
| 57 | // If we get here, there was an error: |
| 58 | break; |
| 59 | } |
| 60 | *o++ = st.carry | (q >> 2); |
| 61 | st.carry = q << 6; |
| 62 | st.bytes++; |
| 63 | olen++; |
| 64 | |
| 65 | // Deliberate fallthrough: |
| 66 | BASE64_FALLTHROUGH |
| 67 | |
| 68 | case 3: if (slen-- == 0) { |
| 69 | ret = 1; |
| 70 | break; |
| 71 | } |
| 72 | if ((q = base64_table_dec[*s++]) >= 254) { |
| 73 | st.bytes = 0; |
| 74 | st.eof = BASE64_EOF; |
| 75 | // When q == 254, the input char is '='. Return 1 and EOF. |
| 76 | // When q == 255, the input char is invalid. Return 0 and EOF. |
| 77 | ret = ((q == 254) && (slen == 0)) ? 1 : 0; |
| 78 | break; |
| 79 | } |
| 80 | *o++ = st.carry | q; |
| 81 | st.carry = 0; |
| 82 | st.bytes = 0; |
| 83 | olen++; |
| 84 | } |
| 85 | } |
| 86 | |
| 87 | state->eof = st.eof; |
| 88 | state->bytes = st.bytes; |
| 89 | state->carry = st.carry; |
| 90 | *outlen = olen; |
| 91 | return ret; |
| 92 |