static const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
static char *base64_encode(char* data, int data_len)
{
int prepare;
int ret_len;
int temp = 0;
char *ret = NULL;
char *f = NULL;
int tmp = 0;
char changed[4];
int i = 0;
int num=0;
ret_len = data_len / 3;
temp = data_len % 3;
if (temp > 0) {
ret_len += 1;
}
ret = (char *)malloc(ret_len*4 + 1);
if ( ret == NULL) {
perror("No enough memory./n");
exit(0);
}
f = ret;
while (tmp < data_len) {
temp = 0;
prepare = 0;
memset(changed, 0, 4);
while (temp < 3) {
if (tmp >= data_len) {
break;
}
prepare = ((prepare << 8) | (data[tmp] & 0xFF));
tmp++;
temp++;
}
prepare = (prepare<<((3-temp)*8));
for (i = 0; i < 4 ;i++ ) {
if (temp < i) {
changed[i] = 0x40;
}
else {
changed[i] = (prepare>>((3-i)*6)) & 0x3F;
}
num=changed[i];
*f = base[num];
f++;
}
}
*f = 0;
return ret;
}
static unsigned char hexchars[] = "0123456789ABCDEF";
char * urlencode(char const *s, int len, int *new_length)
{
register unsigned char c;
unsigned char *to, *start;
unsigned char const *from, *end;
from = (unsigned char *)s;
end = (unsigned char *)s + len;
start = to = (unsigned char *) calloc(1, 3*len+1);
while (from < end) {
c = *from++;
if (c == ' ') {
*to++ = '+';
} else if ((c < '0' && c != '-' && c != '.') ||(c < 'A' && c > '9') || (c > 'Z' && c < 'a' && c != '_') || \
(c > 'z')) {
to[0] = '%';
to[1] = hexchars[c >> 4];
to[2] = hexchars[c & 15];
to += 3;
} else {
*to++ = c;
}
}
*to = 0;
if (new_length) {
*new_length = to - start;
}
return (char *) start;
}