unsigned char tmp[4];
size_t src_pos;
- for (src_pos = 0; src_pos < src_size; ) {
+ for (src_pos = 0; src_size - src_pos > 2; src_pos += 3) {
tmp[0] = b64enc[src_c[src_pos] >> 2];
- switch (src_size - src_pos) {
- case 1:
- tmp[1] = b64enc[(src_c[src_pos] & 0x03) << 4];
- tmp[2] = '=';
- tmp[3] = '=';
- src_pos++;
- break;
- case 2:
- tmp[1] = b64enc[((src_c[src_pos] & 0x03) << 4) |
- (src_c[src_pos+1] >> 4)];
- tmp[2] = b64enc[((src_c[src_pos+1] & 0x0f) << 2)];
- tmp[3] = '=';
- src_pos += 2;
- break;
- default:
- tmp[1] = b64enc[((src_c[src_pos] & 0x03) << 4) |
- (src_c[src_pos+1] >> 4)];
- tmp[2] = b64enc[((src_c[src_pos+1] & 0x0f) << 2) |
- ((src_c[src_pos+2] & 0xc0) >> 6)];
- tmp[3] = b64enc[src_c[src_pos+2] & 0x3f];
- src_pos += 3;
- break;
- }
+ tmp[1] = b64enc[((src_c[src_pos] & 0x03) << 4) |
+ (src_c[src_pos+1] >> 4)];
+ tmp[2] = b64enc[((src_c[src_pos+1] & 0x0f) << 2) |
+ ((src_c[src_pos+2] & 0xc0) >> 6)];
+ tmp[3] = b64enc[src_c[src_pos+2] & 0x3f];
+ buffer_append(dest, tmp, 4);
+ }
+ switch (src_size - src_pos) {
+ case 0:
+ break;
+ case 1:
+ tmp[0] = b64enc[src_c[src_pos] >> 2];
+ tmp[1] = b64enc[(src_c[src_pos] & 0x03) << 4];
+ tmp[2] = '=';
+ tmp[3] = '=';
+ buffer_append(dest, tmp, 4);
+ break;
+ case 2:
+ tmp[0] = b64enc[src_c[src_pos] >> 2];
+ tmp[1] = b64enc[((src_c[src_pos] & 0x03) << 4) |
+ (src_c[src_pos+1] >> 4)];
+ tmp[2] = b64enc[((src_c[src_pos+1] & 0x0f) << 2)];
+ tmp[3] = '=';
buffer_append(dest, tmp, 4);
+ break;
+ default:
+ i_unreached();
}
}