5 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
32 if (!stralloc_ready(
out,i))
return -1;
36 for (i = 0; i < n - 1; i++) {
38 for (
j = 0;
j < 4;
j++) {
39 if (
in[
j] >=
'A' &&
in[
j] <=
'Z')
40 x = (x << 6) + (
unsigned int)(
in[
j] -
'A' + 0);
41 else if (
in[
j] >=
'a' &&
in[
j] <=
'z')
42 x = (x << 6) + (
unsigned int)(
in[
j] -
'a' + 26);
43 else if (
in[
j] >=
'0' &&
in[
j] <=
'9')
44 x = (x << 6) + (
unsigned int)(
in[
j] -
'0' + 52);
45 else if (
in[
j] ==
'+')
47 else if (
in[
j] ==
'/')
49 else if (
in[
j] ==
'=')
54 s[2] = (
unsigned char)(x & 255); x >>= 8;
55 s[1] = (
unsigned char)(x & 255); x >>= 8;
56 s[0] = (
unsigned char)(x & 255); x >>= 8;
61 for (
j = 0;
j < 4;
j++) {
62 if (
in[
j] >=
'A' &&
in[
j] <=
'Z')
63 x = (x << 6) + (
unsigned int)(
in[
j] -
'A' + 0);
64 else if (
in[
j] >=
'a' &&
in[
j] <=
'z')
65 x = (x << 6) + (
unsigned int)(
in[
j] -
'a' + 26);
66 else if (
in[
j] >=
'0' &&
in[
j] <=
'9')
67 x = (x << 6) + (
unsigned int)(
in[
j] -
'0' + 52);
68 else if (
in[
j] ==
'+')
70 else if (
in[
j] ==
'/')
72 else if (
in[
j] ==
'=')
77 b[2] = (
unsigned char)(x & 255); x >>= 8;
78 b[1] = (
unsigned char)(x & 255); x >>= 8;
79 b[0] = (
unsigned char)(x & 255); x >>= 8;
81 for (i = 0; i < 3 -
p; i++)
89 unsigned char a,
b,
c;
99 i =
in->len / 3 * 4 + 4;
100 if (!stralloc_ready(
out,i))
return -1;
103 for (i = 0; i <
in->len; i += 3) {
105 b = i + 1 <
in->len ?
in->s[i + 1] : 0;
106 c = i + 2 <
in->len ?
in->s[i + 2] : 0;
108 *s++ = b64alpha[a >> 2];
109 *s++ = b64alpha[((a & 3 ) << 4) | (
b >> 4)];
111 if (i + 1 >=
in->len) *s++ =
B64PAD;
112 else *s++ = b64alpha[((
b & 0x0f) << 2) | (
c >> 6)];
114 if (i + 2 >=
in->len) *s++ =
B64PAD;
115 else *s++ = b64alpha[
c & 0x3f];
int b64encode(stralloc *in, stralloc *out)
int b64decode(const unsigned char *in, int l, stralloc *out)
int stralloc_copys(stralloc *, char const *)
void c(char *, char *, char *, int, int, int)
void p(char *, char *, int, int, int)