return 62;
if (c == '/')
return 63;
+ if (c == '=')
+ return 0; /* just non-negative, please */
return -EINVAL;
}
int ceph_armor(char *dst, const char *src, const char *end)
{
int olen = 0;
- int tailzero = 0;
+ int line = 0;
while (src < end) {
unsigned char a, b, c;
a = *src++;
+ *dst++ = encode_bits(a >> 2);
if (src < end) {
b = *src++;
+ *dst++ = encode_bits(((a & 3) << 4) | (b >> 4));
if (src < end) {
c = *src++;
+ *dst++ = encode_bits(((b & 15) << 2) | (c >> 6));
+ *dst++ = encode_bits(c & 63);
} else {
- tailzero = 1;
- c = 0;
+ *dst++ = encode_bits((b & 15) << 2);
+ *dst++ = '=';
}
} else {
- b = c = 0;
- tailzero = 2;
+ *dst++ = encode_bits(((a & 3) << 4));
+ *dst++ = '=';
+ *dst++ = '=';
}
- *dst++ = encode_bits(a >> 2);
- *dst++ = encode_bits(((a & 3) << 4) | (b >> 4));
- *dst++ = encode_bits(((b & 15) << 2) | (c >> 6));
- *dst++ = encode_bits(c & 63);
olen += 4;
+ line += 4;
+ if (line == 64) {
+ line = 0;
+ *(dst++) = '\n';
+ olen++;
+ }
}
- while (tailzero--)
- *(--dst) = '=';
return olen;
}
while (src < end) {
int a, b, c, d;
+ if (src < end && src[0] == '\n')
+ src++;
if (src + 4 > end)
return -EINVAL;
a = decode_bits(src[0]);
*dst++ = (a << 2) | (b >> 4);
if (src[2] == '=')
return olen + 1;
- *dst++ = (b << 4) | (c >> 4);
+ *dst++ = ((b & 15) << 4) | (c >> 2);
if (src[3] == '=')
return olen + 2;
- *dst++ = (c << 6) | d;
+ *dst++ = ((c & 3) << 6) | d;
olen += 3;
src += 4;
}