public int decode()

in geronimo-mail_2.1_spec/src/main/java/org/apache/geronimo/mail/util/Base64Encoder.java [249:341]


    public int decode(
        final String                data,
        final OutputStream    out)
        throws IOException
    {
        byte    b1, b2, b3, b4;
        int        length = 0;

        int        end = data.length();

        while (end > 0)
        {
            if (!ignore(data.charAt(end - 1)))
            {
                break;
            }

            end--;
        }

        int    i = 0;
        final int   finish = end - 4;

        while (i < finish)
        {
            while ((i < finish) && ignore(data.charAt(i)))
            {
                i++;
            }

            b1 = decodingTable[data.charAt(i++)];

            while ((i < finish) && ignore(data.charAt(i)))
            {
                i++;
            }
            b2 = decodingTable[data.charAt(i++)];

            while ((i < finish) && ignore(data.charAt(i)))
            {
                i++;
            }
            b3 = decodingTable[data.charAt(i++)];

            while ((i < finish) && ignore(data.charAt(i)))
            {
                i++;
            }
            b4 = decodingTable[data.charAt(i++)];

            out.write((b1 << 2) | (b2 >> 4));
            out.write((b2 << 4) | (b3 >> 2));
            out.write((b3 << 6) | b4);

            length += 3;
        }

        if (data.charAt(end - 2) == padding)
        {
            b1 = decodingTable[data.charAt(end - 4)];
            b2 = decodingTable[data.charAt(end - 3)];

            out.write((b1 << 2) | (b2 >> 4));

            length += 1;
        }
        else if (data.charAt(end - 1) == padding)
        {
            b1 = decodingTable[data.charAt(end - 4)];
            b2 = decodingTable[data.charAt(end - 3)];
            b3 = decodingTable[data.charAt(end - 2)];

            out.write((b1 << 2) | (b2 >> 4));
            out.write((b2 << 4) | (b3 >> 2));

            length += 2;
        }
        else
        {
            b1 = decodingTable[data.charAt(end - 4)];
            b2 = decodingTable[data.charAt(end - 3)];
            b3 = decodingTable[data.charAt(end - 2)];
            b4 = decodingTable[data.charAt(end - 1)];

            out.write((b1 << 2) | (b2 >> 4));
            out.write((b2 << 4) | (b3 >> 2));
            out.write((b3 << 6) | b4);

            length += 3;
        }

        return length;
    }