12 #include <pion/PionAlgorithms.hpp>
13 #include <boost/assert.hpp>
20 static const char nop = -1;
21 static const char decoding_data[] = {
22 nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop,
23 nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop,
24 nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop, 62, nop,nop,nop, 63,
25 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,nop,nop, nop,nop,nop,nop,
26 nop, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
27 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,nop, nop,nop,nop,nop,
28 nop,26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
29 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,nop, nop,nop,nop,nop,
30 nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop,
31 nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop,
32 nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop,
33 nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop,
34 nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop,
35 nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop,
36 nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop,
37 nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop, nop,nop,nop,nop
40 unsigned int input_length=input.size();
41 const char * input_ptr = input.data();
45 output.reserve(((input_length+2)/3)*4);
50 for (
unsigned int i=0; i<input_length;i++) {
56 base64code0 = decoding_data[
static_cast<int>(input_ptr[i])];
59 if(!(++i<input_length))
61 base64code1 = decoding_data[
static_cast<int>(input_ptr[i])];
65 output += ((base64code0 << 2) | ((base64code1 >> 4) & 0x3));
67 if(++i<input_length) {
68 char c = input_ptr[i];
70 BOOST_ASSERT( (base64code1 & 0x0f)==0);
73 base64code2 = decoding_data[
static_cast<int>(input_ptr[i])];
77 output += ((base64code1 << 4) & 0xf0) | ((base64code2 >> 2) & 0x0f);
80 if(++i<input_length) {
81 char c = input_ptr[i];
83 BOOST_ASSERT( (base64code2 & 0x03)==0);
86 base64code3 = decoding_data[
static_cast<int>(input_ptr[i])];
90 output += (((base64code2 << 6) & 0xc0) | base64code3 );
100 static const char encoding_data[] =
101 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
103 unsigned int input_length=input.size();
104 const char * input_ptr = input.data();
108 output.reserve(((input_length+2)/3)*4);
113 for (
unsigned int i=0; i<input_length;i++) {
119 base64code0 = (input_ptr[i] >> 2) & 0x3f;
120 output += encoding_data[base64code0];
121 base64code1 = (input_ptr[i] << 4 ) & 0x3f;
123 if (++i < input_length) {
124 base64code1 |= (input_ptr[i] >> 4) & 0x0f;
125 output += encoding_data[base64code1];
126 base64code2 = (input_ptr[i] << 2) & 0x3f;
128 if (++i < input_length) {
129 base64code2 |= (input_ptr[i] >> 6) & 0x03;
130 base64code3 = input_ptr[i] & 0x3f;
131 output += encoding_data[base64code2];
132 output += encoding_data[base64code3];
134 output += encoding_data[base64code2];
138 output += encoding_data[base64code1];
151 result.reserve(str.size());
153 for (std::string::size_type pos = 0; pos < str.size(); ++pos) {
161 if (pos + 2 < str.size()) {
162 decode_buf[0] = str[++pos];
163 decode_buf[1] = str[++pos];
164 decode_buf[2] =
'\0';
165 result +=
static_cast<char>( strtol(decode_buf, 0, 16) );
185 result.reserve(str.size());
190 for (std::string::size_type pos = 0; pos < str.size(); ++pos) {
193 if (str[pos] > 32 && str[pos] < 127) {
200 case '$':
case '&':
case '+':
case ',':
case '/':
case ':':
201 case ';':
case '=':
case '?':
case '@':
case '"':
case '<':
202 case '>':
case '#':
case '%':
case '{':
case '}':
case '|':
203 case '\\':
case '^':
case '~':
case '[':
case ']':
case '`':
205 sprintf(encode_buf+1,
"%.2X", (
unsigned char)(str[pos]));
206 result += encode_buf;
static bool base64_decode(std::string const &input, std::string &output)
static std::string url_encode(const std::string &str)
encodes strings so that they are safe for URLs (with%20spaces)
static bool base64_encode(std::string const &input, std::string &output)
static std::string url_decode(const std::string &str)
escapes URL-encoded strings (a%20value+with%20spaces)
the following enables use of the lock-free cache