// Generates ASCII art text for printing on punched paper tape #include #include #include #include using namespace std; ifstream infile; string buffer; int size; char c; int lookup(char c) { switch (c) { case 'a': buffer = "\x60\x94\x94\x94\xf8"; size = 5; break; case 'b': buffer = "\xff\x88\x88\x88\x70"; size = 5; break; case 'c': buffer = "\x70\x88\x88\x88\x90"; size = 5; break; case 'd': buffer = "\x70\x88\x88\x88\xff"; size = 5; break; case 'e': buffer = "\x78\x94\x94\x94\x98"; size = 5; break; case 'f': buffer = "\x10\xfe\x11"; size = 3; break; case 'g': buffer = "\x98\xa4\xa4\x78"; size = 4; break; case 'h': buffer = "\xff\x08\x08\x08\xf0"; size = 5; break; case 'i': buffer = "\x88\xfa\x80"; size = 3; break; case 'j': buffer = "\x40\x80\x84\x7d"; size = 4; break; case 'k': buffer = "\xff\x20\x50\x88"; size = 4; break; case 'l': buffer = "\x81\xff\x80"; size = 3; break; case 'm': buffer = "\xf8\x08\xf8\x08\xf0"; size = 5; break; case 'n': buffer = "\xf8\x08\x08\x08\xf0"; size = 5; break; case 'o': buffer = "\x70\x88\x88\x88\x70"; size = 5; break; case 'p': buffer = "\xf8\x24\x24\x18"; size = 4; break; case 'q': buffer = "\x18\x24\x24\xf8"; size = 4; break; case 'r': buffer = "\x08\xf0\x08\x10"; size = 4; break; case 's': buffer = "\x90\xa8\xa8\xa8\x48"; size = 5; break; case 't': buffer = "\x08\x7e\x88\x48"; size = 4; break; case 'u': buffer = "\x78\x80\x80\x80\xf8"; size = 5; break; case 'v': buffer = "\x18\x60\x80\x60\x18"; size = 5; break; case 'w': buffer = "\x78\x80\x78\x80\x78"; size = 5; break; case 'x': buffer = "\x88\x50\x20\x50\x88"; size = 5; break; case 'y': buffer = "\x98\xa0\xa0\x78"; size = 4; break; case 'z': buffer = "\x88\xc8\xa8\x98\x88"; size = 5; break; case 'A': buffer = "\xfe\x09\x09\x09\xfe"; size = 5; break; case 'B': buffer = "\xff\x89\x89\x89\x76"; size = 5; break; case 'C': buffer = "\x73\x81\x81\x81"; size = 4; break; case 'D': buffer = "\xff\x81\x81\x42\x3c"; size = 5; break; case 'E': buffer = "\xff\x89\x89\x89\x81"; size = 5; break; case 'F': buffer = "\xff\x09\x09\x09\x01"; size = 5; break; case 'G': buffer = "\x7e\x81\x81\x89\x7a"; size = 5; break; case 'H': buffer = "\xff\x08\x08\x08\xff"; size = 5; break; case 'I': buffer = "\x81\xff\x81"; size = 3; break; case 'J': buffer = "\x60\x80\x80\x7f"; size = 4; break; case 'K': buffer = "\xff\x08\x14\xe3"; size = 4; break; case 'L': buffer = "\xff\x80\x80\x80"; size = 4; break; case 'M': buffer = "\xff\x02\x04\x18\x04\x02\xff"; size = 7; break; case 'N': buffer = "\xff\x06\x18\x60\xff"; size = 5; break; case 'O': buffer = "\x7e\x81\x81\x81\x7e"; size = 5; break; case 'P': buffer = "\xff\x09\x09\x09\x06"; size = 5; break; case 'Q': buffer = "\x3e\x41\x61\x41\xbe"; size = 5; break; case 'R': buffer = "\xff\x09\x19\x29\xc6"; size = 5; break; case 'S': buffer = "\x46\x89\x89\x89\x72"; size = 5; break; case 'T': buffer = "\x01\x01\xff\x01\x01"; size = 5; break; case 'U': buffer = "\x3f\x80\x80\x80\x3f"; size = 5; break; case 'V': buffer = "\x3f\x40\x80\x40\x3f"; size = 5; break; case 'W': buffer = "\x7f\x80\x70\x80\x7f"; size = 5; break; case 'X': buffer = "\xe3\x14\x08\x14\xe3"; size = 5; break; case 'Y': buffer = "\x07\x08\xf0\x08\x07"; size = 5; break; case 'Z': buffer = "\xc1\xa1\x91\x89\x87"; size = 5; break; case '0': buffer = "\x7e\xa1\x99\x85\x7e"; size = 5; break; case '1': buffer = "\x81\xff\x80"; size = 3; break; case '2': buffer = "\xc2\xa1\x91\x91\x8e"; size = 5; break; case '3': buffer = "\x42\x81\x91\x91\x6e"; size = 5; break; case '4': buffer = "\x1f\x10\x10\xff\x10"; size = 5; break; case '(': buffer = "\x3c\x42\x81"; size = 3; break; case ')': buffer = "\x81\x42\x3c"; size = 3; break; case '!': buffer = "\xbf"; size = 1; break; case '?': buffer = "\x02\x01\xb1\x09\x06"; size = 5; break; case '$': buffer = "\x44\x4a\xff\x4a\x32"; size = 5; break; case '#': buffer = "\x24\xff\x24\xff\x24"; size = 5; break; case '*': buffer = "\x08\x2a\x1c\x2a\x08"; size = 5; break; case '.': buffer = "\xc0\xc0"; size = 2; break; case '&': buffer = "\x76\x89\x96\x60\x90"; size = 5; break; case '\"': buffer = "\x07\x00\x07"; size = 3; break; case '\'': buffer = "\x07"; size = 1; break; case ',': buffer = "\xb0\x80"; size = 2; break; case '/': buffer = "\xc0\x30\x0c\x03"; size = 4; break; case '\\': buffer = "\x03\x0c\x30\xc0"; size = 4; break; case ':': buffer = "\xc3\xc3"; size = 2; break; case ';': buffer = "\xcb\xc7"; size = 2; break; case '[': buffer = "\xff\x81\x81"; size = 3; break; case ']': buffer = "\x81\x81\xff"; size = 3; break; case '%': buffer = "\x46\x26\x10\xc8\xc4"; size = 5; break; case '^': buffer = "\x04\x02\x01\x02\x04"; size = 5; break; case '_': buffer = "\x80\x80\x80\x80\x80"; size = 5; break; case '=': buffer = "\x28\x28\x28"; size = 3; break; case '+': buffer = "\x10\x38\x10"; size = 3; break; case '-': buffer = "\x10\x10\x10"; size = 3; break; case '{': buffer = "\x08\x76\x81\x81"; size = 4; break; case '}': buffer = "\x81\x81\x76\x08"; size = 4; break; case '<': buffer = "\x20\x50\x88"; size = 3; break; case '>': buffer = "\x88\x50\x20"; size = 3; break; case '@': buffer = "\x7e\x81\x99\xa5\xbe\x80"; size = 6; break; case '|': buffer = "\xf7"; size = 1; break; case '\n': case ' ': buffer = "\x00\x00\x00\x00\x00"; size = 5; break; default: return -1; } return 0; } int main(int argc, char** argv) { if (argc > 1) { infile.open(argv[1]); if (!infile.is_open()) { cerr << "Error opening file" << endl; return -1; } else { while (infile.good()) { c = infile.get(); if (c >= 0 && c <= 255) { int error = lookup(c); char hexchar[32]; if (error < 0) { cerr << "Character not defined: "; sprintf(hexchar, "0x%X\n",c); cerr << hexchar; } else { buffer += "\0"; size++; cout.write(buffer.data(), size); //cerr << size << endl; } } } // buffer = "\0"; // cout << buffer; infile.close(); } return 0; } else { cerr << "Too few arguments" << endl; return -1; } return 0; }