#include #include #include char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char oldbase[65]; void do_historical(FILE *in, FILE *out, char *decode) { unsigned char input[45]; unsigned char output[62]; size_t bytes; fprintf(out, "begin %s %s\n", "644", decode); do { unsigned int bits; int i; input[0] = 0; input[1] = 0; input[2] = 0; bytes = fread(input, 1, 45, in); for (i = bytes; i < 45; i++) { input[i] = 0; } output[0] = oldbase[bytes]; output[1] = 0; for (i=0;i> 6) & 0x3f)]; output[i/3*4+2] = oldbase[((bits >> 12) & 0x3f)]; output[i/3*4+1] = oldbase[((bits >> 18) & 0x3f)]; output[i/3*4+5] = 0; } fprintf(out, "%s\n", output); } while (bytes); fprintf(out, "end\n"); } int main(int ac, char *av[]) { int mime = 0; char *file = 0; char *decode = 0; FILE *output = stdout; unsigned char input[3]; int groups = 0; size_t bytes; int i; for (i = 0; i<64; i++) { oldbase[i] = i + 0x20; } oldbase[0] = '`'; decode = av[ac-1]; if (!strcmp(av[1], "-m")) { mime = 1; if (ac == 4) { file = av[ac-2]; } } else if (ac == 3) { file = av[ac-2]; } if (file) { if (freopen(file, "r", stdin) == 0) { perror("can't open file:"); exit(EXIT_FAILURE); } } if (!mime) { do_historical(stdin, output, decode); exit(EXIT_SUCCESS); } fprintf(output, "begin-base64 %s %s\n", "644", decode); do { unsigned char out[4]; unsigned int bits; int i; input[0] = 0; input[1] = 0; input[2] = 0; bytes = fread(input, 1, 3, stdin); if (!bytes) { continue; } bits = (input[0] << 16) | (input[1] << 8) | (input[2]); out[3] = bits & 0x3f; out[2] = (bits >> 6) & 0x3f; out[1] = (bits >> 12) & 0x3f; out[0] = (bits >> 18) & 0x3f; for (i=0;i < bytes+1; i++) { fputc(base64[out[i]], stdout); } switch (bytes) { case 1: fputc('=', stdout); case 2: fputc('=', stdout); } if (++groups % 15 == 0) { fputc('\n', stdout); } } while (bytes); if (groups % 15 != 0) { fputc('\n', stdout); } fprintf(stdout, "====\n"); return 0; }