- int final;
- int write;
- int realwrite;
- int chunks;
- int leftovers;
- int i;
- char encoded[255];
- char padding[5];
- const char *dp;
- char *pp;
- char *ep;
-
- space -= space / SPACING;
- chunks = (space - 1) / ENC_CHUNK;
- while ((chunks + 1) * ENC_CHUNK + 1 > space) {
- chunks--;
- }
- write = RAW_CHUNK * chunks;
- write = MIN(write, len); /* do not use more bytes than is available; */
- final = (write == len); /* is this the last block? */
- chunks = write / RAW_CHUNK;
- leftovers = write % RAW_CHUNK;
-
- memset(encoded, 0, sizeof(encoded));
- ep = encoded;
- dp = buf;
- for (i = 0; i < chunks; i++) {
- encode_chunk(ep, dp);
- ep += ENC_CHUNK;
- dp += RAW_CHUNK;
- }
- realwrite = ENC_CHUNK * chunks;
- memset(padding, 0, sizeof(padding));
- pp = padding;
- if (leftovers) {
- pp += RAW_CHUNK - leftovers;
- memcpy(pp, dp, leftovers);
-
- pp = padding;
- *ep++ = padder[leftovers];
- encode_chunk(ep, pp);
-
- realwrite += ENC_CHUNK + 1; /* plus padding character */