59 static inline unsigned char to_uchar(
char ch) {
return ch; }
66 static const char *
b64str =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
68 while (inlen && outlen) {
69 *out++ = b64str[(
to_uchar(in[0]) >> 2) & 0x3f];
72 *out++ = b64str[((
to_uchar(in[0]) << 4) + (--inlen ?
to_uchar(in[1]) >> 4 : 0)) & 0x3f];
75 *out++ = (inlen ? b64str[((
to_uchar(in[1]) << 2) + (--inlen ?
to_uchar(in[2]) >> 6 : 0)) & 0x3f] :
'=');
78 *out++ = inlen ? b64str[
to_uchar(in[2]) & 0x3f] :
'=';
115 if (inlen > outlen) {
120 *out =
static_cast<char *
>(malloc(outlen));
208 static const signed char b64[0x100] = {
209 B64(0),
B64(1),
B64(2),
B64(3),
B64(4),
B64(5),
B64(6),
B64(7),
B64(8),
B64(9),
B64(10),
210 B64(11),
B64(12),
B64(13),
B64(14),
B64(15),
B64(16),
B64(17),
B64(18),
B64(19),
B64(20),
B64(21),
211 B64(22),
B64(23),
B64(24),
B64(25),
B64(26),
B64(27),
B64(28),
B64(29),
B64(30),
B64(31),
B64(32),
212 B64(33),
B64(34),
B64(35),
B64(36),
B64(37),
B64(38),
B64(39),
B64(40),
B64(41),
B64(42),
B64(43),
213 B64(44),
B64(45),
B64(46),
B64(47),
B64(48),
B64(49),
B64(50),
B64(51),
B64(52),
B64(53),
B64(54),
214 B64(55),
B64(56),
B64(57),
B64(58),
B64(59),
B64(60),
B64(61),
B64(62),
B64(63),
B64(64),
B64(65),
215 B64(66),
B64(67),
B64(68),
B64(69),
B64(70),
B64(71),
B64(72),
B64(73),
B64(74),
B64(75),
B64(76),
216 B64(77),
B64(78),
B64(79),
B64(80),
B64(81),
B64(82),
B64(83),
B64(84),
B64(85),
B64(86),
B64(87),
217 B64(88),
B64(89),
B64(90),
B64(91),
B64(92),
B64(93),
B64(94),
B64(95),
B64(96),
B64(97),
B64(98),
218 B64(99),
B64(100),
B64(101),
B64(102),
B64(103),
B64(104),
B64(105),
B64(106),
B64(107),
B64(108),
B64(109),
219 B64(110),
B64(111),
B64(112),
B64(113),
B64(114),
B64(115),
B64(116),
B64(117),
B64(118),
B64(119),
B64(120),
220 B64(121),
B64(122),
B64(123),
B64(124),
B64(125),
B64(126),
B64(127),
B64(128),
B64(129),
B64(130),
B64(131),
221 B64(132),
B64(133),
B64(134),
B64(135),
B64(136),
B64(137),
B64(138),
B64(139),
B64(140),
B64(141),
B64(142),
222 B64(143),
B64(144),
B64(145),
B64(146),
B64(147),
B64(148),
B64(149),
B64(150),
B64(151),
B64(152),
B64(153),
223 B64(154),
B64(155),
B64(156),
B64(157),
B64(158),
B64(159),
B64(160),
B64(161),
B64(162),
B64(163),
B64(164),
224 B64(165),
B64(166),
B64(167),
B64(168),
B64(169),
B64(170),
B64(171),
B64(172),
B64(173),
B64(174),
B64(175),
225 B64(176),
B64(177),
B64(178),
B64(179),
B64(180),
B64(181),
B64(182),
B64(183),
B64(184),
B64(185),
B64(186),
226 B64(187),
B64(188),
B64(189),
B64(190),
B64(191),
B64(192),
B64(193),
B64(194),
B64(195),
B64(196),
B64(197),
227 B64(198),
B64(199),
B64(200),
B64(201),
B64(202),
B64(203),
B64(204),
B64(205),
B64(206),
B64(207),
B64(208),
228 B64(209),
B64(210),
B64(211),
B64(212),
B64(213),
B64(214),
B64(215),
B64(216),
B64(217),
B64(218),
B64(219),
229 B64(220),
B64(221),
B64(222),
B64(223),
B64(224),
B64(225),
B64(226),
B64(227),
B64(228),
B64(229),
B64(230),
230 B64(231),
B64(232),
B64(233),
B64(234),
B64(235),
B64(236),
B64(237),
B64(238),
B64(239),
B64(240),
B64(241),
231 B64(242),
B64(243),
B64(244),
B64(245),
B64(246),
B64(247),
B64(248),
B64(249),
B64(250),
B64(251),
B64(252),
235 #define uchar_in_range(c) true 237 #define uchar_in_range(c) ((c) <= 255) 258 size_t *n_non_newline) {
264 if (4 <= in_end - *in && memchr(t,
'\n', 4) ==
nullptr) {
278 ctx->
buf[ctx->
i++] =
c;
285 *n_non_newline = ctx->
i;
290 #define return_false \ 302 static inline bool decode_4(
char const *
in,
size_t inlen,
char **outp,
size_t *outleft) {
373 size_t outleft = *outlen;
374 bool ignore_newlines = ctx !=
nullptr;
375 bool flush_ctx =
false;
376 unsigned int ctx_i = 0;
378 if (ignore_newlines) {
380 flush_ctx = inlen == 0;
384 size_t outleft_save = outleft;
385 if (ctx_i == 0 && !flush_ctx) {
389 outleft_save = outleft;
390 if (!
decode_4(in, inlen, &out, &outleft))
398 if (inlen == 0 && !flush_ctx)
403 if (inlen && *in ==
'\n' && ignore_newlines) {
410 out -= outleft_save - outleft;
411 outleft = outleft_save;
414 char const *in_end = in + inlen;
418 non_nl =
get_4(ctx, &in, in_end, &inlen);
425 if (inlen == 0 || (inlen < 4 && !flush_ctx && ignore_newlines)) {
429 if (!
decode_4(non_nl, inlen, &out, &outleft))
459 size_t needlen = 3 * (inlen / 4) + 3;
461 *out =
static_cast<char *
>(malloc(needlen));
static const signed char b64[0x100]
void base64_encode(const char *in, size_t inlen, char *out, size_t outlen)
static const char * b64str
static unsigned char to_uchar(char ch)
#define BASE64_LENGTH(inlen)
void base64_decode_ctx_init(struct base64_decode_context *ctx)
size_t base64_encode_alloc(const char *in, size_t inlen, char **out)
static bool decode_4(char const *in, size_t inlen, char **outp, size_t *outleft)
bool base64_decode_ctx(struct base64_decode_context *ctx, const char *in, size_t inlen, char *out, size_t *outlen)
#define uchar_in_range(c)
bool base64_decode_alloc_ctx(struct base64_decode_context *ctx, const char *in, size_t inlen, char **out, size_t *outlen)
static char * get_4(struct base64_decode_context *ctx, char const **in, char const *in_end, size_t *n_non_newline)