Graphviz 14.1.2~dev.20260119.0928
Loading...
Searching...
No Matches
base64.c
Go to the documentation of this file.
1#include "config.h"
2
3#include <stddef.h>
4#include <util/alloc.h>
5#include <util/base64.h>
6
7static size_t div_up(size_t dividend, size_t divisor) {
8 return dividend / divisor + (dividend % divisor != 0);
9}
10
11static const char base64_alphabet[] =
12 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
13
14size_t gv_base64_size(size_t source_size) { return div_up(source_size, 3) * 4; }
15
16char *gv_base64(const unsigned char *source, size_t size) {
17 size_t buf_i = 0;
18 char *buf = gv_alloc(gv_base64_size(size) + 1);
19
20 for (size_t data_i = 0; data_i < size; data_i += 3) {
21 unsigned char d0 = source[data_i];
22 int v = (d0 & 0xFC) >> 2; // 1111_1100
23 buf[buf_i++] = base64_alphabet[v];
24
25 unsigned char d1 = data_i + 1 < size ? source[data_i + 1] : 0;
26 v = (d0 & 0x03) << 4 // 0000_0011
27 | (d1 & 0xF0) >> 4; // 1111_0000
28 buf[buf_i++] = base64_alphabet[v];
29 if (size <= data_i + 1) {
30 goto end;
31 }
32
33 unsigned char d2 = data_i + 2 < size ? source[data_i + 2] : 0;
34 v = (d1 & 0x0F) << 2 // 0000_1111
35 | (d2 & 0xC0) >> 6; // 1100_0000
36 buf[buf_i++] = base64_alphabet[v];
37 if (size <= data_i + 2) {
38 goto end;
39 }
40
41 v = d2 & 0x3F; // 0011_1111
42 buf[buf_i++] = base64_alphabet[v];
43 }
44
45end:
46 while (buf_i % 4 != 0) {
47 buf[buf_i++] = base64_alphabet[64];
48 }
49
50 // Write a string terminator. This is not strictly necessary, but is a
51 // backstop against callers who do not use `gv_base64_size` and assume they
52 // can e.g. `fputs` the returned data.
53 buf[buf_i++] = '\0';
54
55 return buf;
56}
Memory allocation wrappers that exit on failure.
static void * gv_alloc(size_t size)
Definition alloc.h:47
char * gv_base64(const unsigned char *source, size_t size)
Definition base64.c:16
size_t gv_base64_size(size_t source_size)
Definition base64.c:14
static size_t div_up(size_t dividend, size_t divisor)
Definition base64.c:7
static const char base64_alphabet[]
Definition base64.c:11
Base64 encoding.