- size_t newsize;
- size_t maxsize;
- unsigned char *p;
- unsigned char *q;
- int i;
-
- memset(buf, 0, *buflen);
-
- /* how many chars can we encode within the buf */
- maxsize = BLKSIZE_RAW * (*buflen / BLKSIZE_ENC - 1) - 1;
- /* how big will the encoded data be */
- newsize = BLKSIZE_ENC * (size / BLKSIZE_RAW + 1) + 1;
- /* if the buffer is too small, eat some of the data */
- if (*buflen < newsize) {
- size = maxsize;
- }
-
- p = (unsigned char *) buf;
- q = (unsigned char *)data;
-
- for(i=0;i<size;i+=BLKSIZE_RAW) {
- p[0] = cb32[((q[0] & 0xf8) >> 3)];
- p[1] = cb32[(((q[0] & 0x07) << 2) | ((q[1] & 0xc0) >> 6))];
- p[2] = (i+1 < size) ? cb32[((q[1] & 0x3e) >> 1)] : '\0';
- p[3] = (i+1 < size) ? cb32[((q[1] & 0x01) << 4) | ((q[2] & 0xf0) >> 4)] : '\0';
- p[4] = (i+2 < size) ? cb32[((q[2] & 0x0f) << 1) | ((q[3] & 0x80) >> 7)] : '\0';
- p[5] = (i+3 < size) ? cb32[((q[3] & 0x7c) >> 2)] : '\0';
- p[6] = (i+3 < size) ? cb32[((q[3] & 0x03) << 3) | ((q[4] & 0xe0) >> 5)] : '\0';
- p[7] = (i+4 < size) ? cb32[((q[4] & 0x1f))] : '\0';
-
- q += BLKSIZE_RAW;
- p += BLKSIZE_ENC;
- }
- *p = 0;
-
- /* store number of bytes from data that was used */
- *buflen = size;
-
- return strlen(buf) - 1;