You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
1.9 KiB
121 lines
1.9 KiB
7 months ago
|
// intellectual property is bullshit bgdc
|
||
|
|
||
|
#include "ascii85.h"
|
||
|
#include "base64.h"
|
||
|
|
||
|
#include <stdbool.h>
|
||
|
#include <stddef.h>
|
||
|
#include <inttypes.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
static void usage(char const * argv0)
|
||
|
{
|
||
|
fprintf(stderr, "%s 85enc|85dec|64enc|64dec [IN [OUT]]\n", argv0);
|
||
|
}
|
||
|
|
||
|
int main(int argc, char ** argv)
|
||
|
{
|
||
|
bool decode = false;
|
||
|
bool base64 = false;
|
||
|
|
||
|
if (argc < 2)
|
||
|
{
|
||
|
usage(argv[0]);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
if (!strcmp(argv[1], "85enc"))
|
||
|
{
|
||
|
decode = false;
|
||
|
base64 = false;
|
||
|
}
|
||
|
else if (!strcmp(argv[1], "85dec"))
|
||
|
{
|
||
|
decode = true;
|
||
|
base64 = false;
|
||
|
}
|
||
|
else if (!strcmp(argv[1], "64enc"))
|
||
|
{
|
||
|
decode = false;
|
||
|
base64 = true;
|
||
|
}
|
||
|
else if (!strcmp(argv[1], "64dec"))
|
||
|
{
|
||
|
decode = true;
|
||
|
base64 = true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
usage(argv[0]);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
FILE * f_in = NULL, * f_out = NULL;
|
||
|
|
||
|
if (argc < 3)
|
||
|
f_in = stdin;
|
||
|
else if (!strcmp(argv[2], "-"))
|
||
|
f_in = stdin;
|
||
|
else
|
||
|
{
|
||
|
f_in = fopen(argv[2], "r");
|
||
|
if (!f_in)
|
||
|
{
|
||
|
perror("fopen");
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (argc < 4)
|
||
|
f_out = stdout;
|
||
|
else if (!strcmp(argv[3], "-"))
|
||
|
f_out = stdout;
|
||
|
else
|
||
|
{
|
||
|
f_out = fopen(argv[3], "w");
|
||
|
if (!f_out)
|
||
|
{
|
||
|
perror("fopen");
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
size_t n_raw, n_encoded;
|
||
|
|
||
|
if (base64)
|
||
|
{
|
||
|
n_raw = 513;
|
||
|
n_encoded = 684;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
n_raw = 512;
|
||
|
n_encoded = 640;
|
||
|
}
|
||
|
|
||
|
uint8_t in_buffer[decode ? n_encoded : n_raw];
|
||
|
uint8_t out_buffer[decode ? n_raw : n_encoded];
|
||
|
|
||
|
while (!ferror(f_in) && !feof(f_in) && !ferror(f_out) && !feof(f_out))
|
||
|
{
|
||
|
size_t n = fread(in_buffer, 1, sizeof(in_buffer), f_in);
|
||
|
size_t n_converted;
|
||
|
|
||
|
if (decode && base64)
|
||
|
n_converted = base64_decode(out_buffer, in_buffer, n);
|
||
|
else if (!decode && base64)
|
||
|
n_converted = base64_encode(out_buffer, in_buffer, n);
|
||
|
else if (decode && !base64)
|
||
|
n_converted = ascii85_encode(out_buffer, in_buffer, n);
|
||
|
else
|
||
|
n_converted = ascii85_decode(out_buffer, in_buffer, n);
|
||
|
|
||
|
fwrite(out_buffer, 1, n_converted, f_out);
|
||
|
}
|
||
|
|
||
|
fclose(f_in);
|
||
|
fclose(f_out);
|
||
|
return 0;
|
||
|
}
|