6 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
33 if (!stralloc_ready(
out,i))
return -1;
37 for (i = 0; i < n - 1; i++) {
39 for (
j = 0;
j < 4;
j++) {
40 if (
in[
j] >=
'A' &&
in[
j] <=
'Z')
41 x = (x << 6) + (
unsigned int)(
in[
j] -
'A' + 0);
42 else if (
in[
j] >=
'a' &&
in[
j] <=
'z')
43 x = (x << 6) + (
unsigned int)(
in[
j] -
'a' + 26);
44 else if (
in[
j] >=
'0' &&
in[
j] <=
'9')
45 x = (x << 6) + (
unsigned int)(
in[
j] -
'0' + 52);
46 else if (
in[
j] ==
'+')
48 else if (
in[
j] ==
'/')
50 else if (
in[
j] ==
'=')
55 s[2] = (
unsigned char)(x & 255); x >>= 8;
56 s[1] = (
unsigned char)(x & 255); x >>= 8;
57 s[0] = (
unsigned char)(x & 255); x >>= 8;
62 for (
j = 0;
j < 4;
j++) {
63 if (
in[
j] >=
'A' &&
in[
j] <=
'Z')
64 x = (x << 6) + (
unsigned int)(
in[
j] -
'A' + 0);
65 else if (
in[
j] >=
'a' &&
in[
j] <=
'z')
66 x = (x << 6) + (
unsigned int)(
in[
j] -
'a' + 26);
67 else if (
in[
j] >=
'0' &&
in[
j] <=
'9')
68 x = (x << 6) + (
unsigned int)(
in[
j] -
'0' + 52);
69 else if (
in[
j] ==
'+')
71 else if (
in[
j] ==
'/')
73 else if (
in[
j] ==
'=')
78 b[2] = (
unsigned char)(x & 255); x >>= 8;
79 b[1] = (
unsigned char)(x & 255); x >>= 8;
80 b[0] = (
unsigned char)(x & 255); x >>= 8;
82 for (i = 0; i < 3 -
p; i++)
90 unsigned char a,
b,
c;
100 i =
in->len / 3 * 4 + 4;
101 if (!stralloc_ready(
out,i))
return -1;
104 for (i = 0; i <
in->len; i += 3) {
106 b = i + 1 <
in->len ?
in->s[i + 1] : 0;
107 c = i + 2 <
in->len ?
in->s[i + 2] : 0;
109 *s++ = b64alpha[a >> 2];
110 *s++ = b64alpha[((a & 3 ) << 4) | (
b >> 4)];
112 if (i + 1 >=
in->len) *s++ =
B64PAD;
113 else *s++ = b64alpha[((
b & 0x0f) << 2) | (
c >> 6)];
115 if (i + 2 >=
in->len) *s++ =
B64PAD;
116 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)