gaim/www

update tags
default tip
2019-09-10, convert-repo
7d915c997ccd
update tags
#include <stdlib.h>
#include <stdio.h>
#define g_malloc malloc
#define g_realloc realloc
typedef long gint32;
char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" "0123456789+/";
char *tobase64(const char *text)
{
char *out = NULL;
const char *c;
unsigned int tmp = 0;
int len = 0, n = 0;
c = text;
while (*c) {
tmp = tmp << 8;
tmp += *c;
n++;
if (n == 3) {
out = g_realloc(out, len + 4);
out[len] = alphabet[(tmp >> 18) & 0x3f];
out[len + 1] = alphabet[(tmp >> 12) & 0x3f];
out[len + 2] = alphabet[(tmp >> 6) & 0x3f];
out[len + 3] = alphabet[tmp & 0x3f];
len += 4;
tmp = 0;
n = 0;
}
c++;
}
switch (n) {
case 2:
tmp <<= 8;
out = g_realloc(out, len + 5);
out[len] = alphabet[(tmp >> 18) & 0x3f];
out[len + 1] = alphabet[(tmp >> 12) & 0x3f];
out[len + 2] = alphabet[(tmp >> 6) & 0x3f];
out[len + 3] = '=';
out[len + 4] = 0;
break;
case 1:
tmp <<= 16;
out = g_realloc(out, len + 5);
out[len] = alphabet[(tmp >> 18) & 0x3f];
out[len + 1] = alphabet[(tmp >> 12) & 0x3f];
out[len + 2] = '=';
out[len + 3] = '=';
out[len + 4] = 0;
break;
case 0:
out = g_realloc(out, len + 1);
out[len] = 0;
break;
}
return out;
}
void frombase64(const char *text, char **data, int *size)
{
char *out = NULL;
char tmp = 0;
const char *c;
gint32 tmp2 = 0;
int len = 0, n = 0;
if (!text || !data)
return;
c = text;
while (*c) {
if (*c >= 'A' && *c <= 'Z') {
tmp = *c - 'A';
} else if (*c >= 'a' && *c <= 'z') {
tmp = 26 + (*c - 'a');
} else if (*c >= '0' && *c <= 57) {
tmp = 52 + (*c - '0');
} else if (*c == '+') {
tmp = 62;
} else if (*c == '/') {
tmp = 63;
} else if (*c == '=') {
if (n == 3) {
out = g_realloc(out, len + 2);
out[len] = (char)(tmp2 >> 10) & 0xff;
len++;
out[len] = (char)(tmp2 >> 2) & 0xff;
len++;
} else if (n == 2) {
out = g_realloc(out, len + 1);
out[len] = (char)(tmp2 >> 4) & 0xff;
len++;
}
break;
}
tmp2 = ((tmp2 << 6) | (tmp & 0xff));
n++;
if (n == 4) {
out = g_realloc(out, len + 3);
out[len] = (char)((tmp2 >> 16) & 0xff);
len++;
out[len] = (char)((tmp2 >> 8) & 0xff);
len++;
out[len] = (char)(tmp2 & 0xff);
len++;
tmp2 = 0;
n = 0;
}
c++;
}
out = g_realloc(out, len + 1);
out[len] = 0;
*data = out;
if (size)
*size = len;
}
int main(int argc, char **argv)
{
char *data;
int len;
FILE *f;
if (argc != 3)
return 1;
switch (argv[1][0]) {
case 'e':
printf("%s\n", tobase64(argv[2]));
break;
case 'd':
frombase64(argv[2], &data, &len);
f = fopen("output", "w");
fwrite(data, 1, len, f);
fclose(f);
break;
}
return 0;
}