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}