char *
encode (const void *buf, size_t len)
{
/* Ne kadar uzunlukta bir tampon gerektiğini biliyoruz */
unsigned char *in = (unsigned char *) buf;
char *out = malloc (6 + ((len + 3) / 4) * 6 + 1);
char *cp = out, *p;
/* Uzunluğu kodlayalım. */
/* `htonl' kullanarak farklı bayt sıralaması kullanan makinelerde
bile doğru çözümleme yapılmasını garanti edelim.
`l64a' b bayttan daha kısa bir dizge döndürebilir,
bu durumda genişliği tamamlamak için boşluğu 0
karakterleriyle dolduralım. */
p = stpcpy (cp, l64a (htonl (len)));
cp = mempcpy (p, "......", 6 - (p - cp));
while (len > 3)
{
unsigned long int n = *in++;
n = (n << 8) | *in++;
n = (n << 8) | *in++;
n = (n << 8) | *in++;
len -= 4;
p = stpcpy (cp, l64a (htonl (n)));
cp = mempcpy (p, "......", 6 - (p - cp));
}
if (len > 0)
{
unsigned long int n = *in++;
if (--len > 0)
{
n = (n << 8) | *in++;
if (--len > 0)
n = (n << 8) | *in;
}
cp = stpcpy (cp, l64a (htonl (n)));
}
*cp = '\0';
return out;
}