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;
}