base64wrap.c

 1#include "base64wrap.h"
 2#include <stdlib.h>
 3#include <string.h>
 4
 5char* wrap_base64(const char* data, size_t len, size_t* out_len) {
 6    if (len == 0) {
 7        char* empty = (char*)malloc(1);
 8        if (!empty) return NULL;
 9        empty[0] = '\0';
10        *out_len = 0;
11        return empty;
12    }
13
14    const size_t line_len = 76;
15    // Number of full lines (each gets \r\n appended except the last)
16    size_t num_breaks = (len > line_len) ? (len - 1) / line_len : 0;
17    size_t result_len = len + num_breaks * 2; // each break adds \r\n
18
19    char* result = (char*)malloc(result_len + 1);
20    if (!result) return NULL;
21
22    size_t src_pos = 0;
23    size_t dst_pos = 0;
24
25    while (src_pos < len) {
26        size_t chunk = len - src_pos;
27        if (chunk > line_len) chunk = line_len;
28
29        memcpy(result + dst_pos, data + src_pos, chunk);
30        dst_pos += chunk;
31        src_pos += chunk;
32
33        if (src_pos < len) {
34            result[dst_pos++] = '\r';
35            result[dst_pos++] = '\n';
36        }
37    }
38
39    result[dst_pos] = '\0';
40    *out_len = dst_pos;
41    return result;
42}