67 #define UCHAR_MAX 0xff
79 static unsigned char to_b64[] =
80 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
82 #define UNSIG_CHAR_PTR(x) ((unsigned char *)(x))
98 const unsigned char *cp;
106 for (cp =
UNSIG_CHAR_PTR(in), count = len; count > 0; count -= 3, cp += 3) {
109 VSTRING_ADDCH(result, to_b64[(cp[0] & 0x3) << 4 | cp[1] >> 4]);
111 VSTRING_ADDCH(result, to_b64[(cp[1] & 0xf) << 2 | cp[2] >> 6]);
143 static unsigned char *un_b64 = 0;
144 const unsigned char *cp;
151 #define CHARS_PER_BYTE (UCHAR_MAX + 1)
166 for (cp = to_b64; cp < to_b64 +
sizeof(to_b64) - 1; cp++)
167 un_b64[*cp] = cp - to_b64;
175 for (cp =
UNSIG_CHAR_PTR(in), count = 0; count < len; count += 4) {
176 if ((ch0 = un_b64[*cp++]) ==
INVALID
177 || (ch1 = un_b64[*cp++]) ==
INVALID)
180 if ((ch2 = *cp++) ==
'=')
182 if ((ch2 = un_b64[ch2]) ==
INVALID)
185 if ((ch3 = *cp++) ==
'=')
187 if ((ch3 = un_b64[ch3]) ==
INVALID)
201 #define STR(x) vstring_str(x)
202 #define LEN(x) VSTRING_LEN(x)
204 int main(
int unused_argc,
char **unused_argv)
211 for (n = 0; n <
sizeof(test); n++)
216 if (
LEN(b2) !=
sizeof(test))
217 msg_panic(
"bad decode length: %ld != %ld",
218 (
long)
LEN(b2), (
long)
sizeof(test));
219 for (n = 0; n <
sizeof(test); n++)
220 if (
STR(b2)[n] != test[n])
222 (
unsigned char)
STR(b2)[n], (
unsigned char) test[n]);
#define BASE64_FLAG_APPEND
NORETURN msg_panic(const char *fmt,...)
int main(int argc, char **argv)
VSTRING * base64_encode_opt(VSTRING *result, const char *in, ssize_t len, int flags)
#define VSTRING_TERMINATE(vp)
#define VSTRING_ADDCH(vp, ch)
#define VSTRING_RESET(vp)
VSTRING * vstring_alloc(ssize_t len)
#define UNSIG_CHAR_PTR(x)
VSTRING * base64_decode(VSTRING *, const char *, ssize_t)
VSTRING * vstring_free(VSTRING *vp)
VSTRING * base64_encode(VSTRING *, const char *, ssize_t)
VSTRING * base64_decode_opt(VSTRING *result, const char *in, ssize_t len, int flags)
void * mymalloc(ssize_t len)