#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void usage(char *);
void enshirt(char *);
void deshirt(char *);
const char table[16] = {0x1f, 0x07, 0x09, 0x01, 0x0b, 0x02, 0x05, 0x05, 0x03,
0x11, 0x28, 0x0c, 0x23, 0x16, 0x1b, 0x02};
int
main(int argc, char *argv[])
{
if (argc < 3)
usage(argv[0]);
if (strncmp(argv[1], "-e", 2) == 0)
enshirt(argv[2]);
else if (strncmp(argv[1], "-d", 2) == 0)
deshirt(argv[2]);
else
usage(argv[0]);
exit(0);
}
void usage(char *progname)
{
printf("Usage: ./%s [-e] [-d] filename\n", progname);
exit(1);
}
void deshirt(char *filename)
{
int i;
char cp, *line;
FILE *fp;
if ((fp = fopen(filename, "r")) == NULL) {
printf("Unable to open: %s\n", filename);
exit(1);
}
fgets(line, 10, fp);
if (strncmp(line, "redshirt2", 9) == 0) {
fseek(fp, 9L, SEEK_SET);
} else {
printf("Error: Not a redshirt2 file\n");
exit(1);
}
while (cp != EOF) {
cp = fgetc(fp);
if (cp > 0x20) {
i++;
i %= 16;
cp -= table[i];
if (cp < 0x20)
cp += 0x5f;
}
printf("%c", cp);
}
return;
}
void enshirt(char *filename)
{
int i;
char cp;
FILE *fp;
if ((fp = fopen(filename, "r")) == NULL) {
printf("Unable to open: %s\n", filename);
exit(1);
}
printf("redshirt2");
while (cp != EOF) {
cp = fgetc(fp);
if (cp > 0x20) {
i++;
i %= 16;
cp += table[i];
if (cp < 0x20)
cp -= 0x5f;
}
printf("%c", cp);
}
return;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdm9pZCB1c2FnZShjaGFyICopOwp2b2lkIGVuc2hpcnQoY2hhciAqKTsKdm9pZCBkZXNoaXJ0KGNoYXIgKik7Cgpjb25zdCBjaGFyIHRhYmxlWzE2XSA9IHsweDFmLCAweDA3LCAweDA5LCAweDAxLCAweDBiLCAweDAyLCAweDA1LCAweDA1LCAweDAzLAogICAgICAgICAgICAgICAgICAgICAgICAweDExLCAweDI4LCAweDBjLCAweDIzLCAweDE2LCAweDFiLCAweDAyfTsKCmludAptYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgICAgICBpZiAoYXJnYyA8IDMpIAogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CgogICAgICAgIGlmIChzdHJuY21wKGFyZ3ZbMV0sICItZSIsIDIpID09IDApCiAgICAgICAgICAgICAgICBlbnNoaXJ0KGFyZ3ZbMl0pOwogICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoYXJndlsxXSwgIi1kIiwgMikgPT0gMCkKICAgICAgICAgICAgICAgIGRlc2hpcnQoYXJndlsyXSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CgogICAgICAgIGV4aXQoMCk7Cn0KCnZvaWQgdXNhZ2UoY2hhciAqcHJvZ25hbWUpCnsKICAgICAgICBwcmludGYoIlVzYWdlOiAuLyVzIFstZV0gWy1kXSBmaWxlbmFtZVxuIiwgcHJvZ25hbWUpOwogICAgICAgIGV4aXQoMSk7Cn0KCnZvaWQgZGVzaGlydChjaGFyICpmaWxlbmFtZSkKewogICAgICAgIGludCBpOwogICAgICAgIGNoYXIgY3AsICpsaW5lOwogICAgICAgIEZJTEUgKmZwOwoKICAgICAgICBpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIikpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50ZigiVW5hYmxlIHRvIG9wZW46ICVzXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KCiAgICAgICAgZmdldHMobGluZSwgMTAsIGZwKTsKCiAgICAgICAgaWYgKHN0cm5jbXAobGluZSwgInJlZHNoaXJ0MiIsIDkpID09IDApIHsKICAgICAgICAgICAgICAgIGZzZWVrKGZwLCA5TCwgU0VFS19TRVQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yOiBOb3QgYSByZWRzaGlydDIgZmlsZVxuIik7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKGNwICE9IEVPRikgewogICAgICAgICAgICAgICAgY3AgPSBmZ2V0YyhmcCk7CiAgICAgICAgICAgICAgICBpZiAoY3AgPiAweDIwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgaSAlPSAxNjsKICAgICAgICAgICAgICAgICAgICAgICAgY3AgLT0gdGFibGVbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3AgPCAweDIwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwICs9IDB4NWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcmludGYoIiVjIiwgY3ApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuOwp9Cgp2b2lkIGVuc2hpcnQoY2hhciAqZmlsZW5hbWUpCnsKICAgICAgICBpbnQgaTsKICAgICAgICBjaGFyIGNwOwogICAgICAgIEZJTEUgKmZwOwoKICAgICAgICBpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIikpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50ZigiVW5hYmxlIHRvIG9wZW46ICVzXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KCiAgICAgICAgcHJpbnRmKCJyZWRzaGlydDIiKTsKCiAgICAgICAgd2hpbGUgKGNwICE9IEVPRikgewogICAgICAgICAgICAgICAgY3AgPSBmZ2V0YyhmcCk7CiAgICAgICAgICAgICAgICBpZiAoY3AgPiAweDIwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgaSAlPSAxNjsKICAgICAgICAgICAgICAgICAgICAgICAgY3AgKz0gdGFibGVbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3AgPCAweDIwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwIC09IDB4NWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcmludGYoIiVjIiwgY3ApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuOwp9Cg==