アルゴリズムな日々 Base64 Encoding

ちょっと最近アルゴリズム力?の不足が気になって,
師匠と競ってBase64エンコーディングの関数を書いてみた。
何かの参考になれば。。。


unsigned char *encode_base64(char *s)
{
unsigned char *p, *r;
char t[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int cnt, len;
len = strlen(s);
if ( (p = (unsigned char *)malloc(len*2)) == NULL ) {
perror("malloc()");
exit(-1);
}
r = p;
for ( cnt = 0; cnt < (int)((double)len*8/6+0.9); cnt++ ) {
switch ( cnt % 4 ) {
case 0:
*p++ = t[(*s&0xFC)>>2];
break;
case 1:
if ( cnt == (int)((double)len*8/6) ) {
*p++ = t[(*s&0x03)<<4];
*p++ = '=', *p++ = '=';
break;
}
else {
*p++ = t[(*s&0x03)<<4|(*(s+1)&0xF0)>>4];s++;
break;
}
case 2:
if ( cnt == (int)((double)len*8/6) ) {
*p++ = t[(*s&0x0F)<<2];
*p++ = '=';
break;
}
else {
*p++ = t[(*s&0x0F)<<2|(*(s+1)&0xC0)>>6];s++;
break;
}
case 3:
*p++ = t[(*s&0x3F)];s++;
break;
}
}
*p = '\0';
return r;
}