1. // Generates ASCII art text for printing on punched paper tape
  2.  
  3. #include <iostream>
  4. #include <fstream>
  5. #include <string>
  6. #include <stdio.h>
  7. using namespace std;
  8.  
  9. ifstream infile;
  10.  
  11. string buffer;
  12. int size;
  13. char c;
  14.  
  15. int lookup(char c)
  16. {
  17.     switch (c)
  18.     {
  19.         case 'a':
  20.             buffer = "\x60\x94\x94\x94\xf8";
  21.             size = 5;
  22.             break;
  23.         case 'b':
  24.             buffer = "\xff\x88\x88\x88\x70";
  25.             size = 5;
  26.             break;
  27.         case 'c':
  28.             buffer = "\x70\x88\x88\x88\x90";
  29.             size = 5;
  30.             break;
  31.         case 'd':
  32.             buffer = "\x70\x88\x88\x88\xff";
  33.             size = 5;
  34.             break;
  35.         case 'e':
  36.             buffer = "\x78\x94\x94\x94\x98";
  37.             size = 5;
  38.             break;
  39.         case 'f':
  40.             buffer = "\x10\xfe\x11";
  41.             size = 3;
  42.             break;
  43.         case 'g':
  44.             buffer = "\x98\xa4\xa4\x78";
  45.             size = 4;
  46.             break;
  47.         case 'h':
  48.             buffer = "\xff\x08\x08\x08\xf0";
  49.             size = 5;
  50.             break;
  51.         case 'i':
  52.             buffer = "\x88\xfa\x80";
  53.             size = 3;
  54.             break;
  55.         case 'j':
  56.             buffer = "\x40\x80\x84\x7d";
  57.             size = 4;
  58.             break;
  59.         case 'k':
  60.             buffer = "\xff\x20\x50\x88";
  61.             size = 4;
  62.             break;
  63.         case 'l':
  64.             buffer = "\x81\xff\x80";
  65.             size = 3;
  66.             break;
  67.         case 'm':
  68.             buffer = "\xf8\x08\xf8\x08\xf0";
  69.             size = 5;
  70.             break;
  71.         case 'n':
  72.             buffer = "\xf8\x08\x08\x08\xf0";
  73.             size = 5;
  74.             break;
  75.         case 'o':
  76.             buffer = "\x70\x88\x88\x88\x70";
  77.             size = 5;
  78.             break;
  79.         case 'p':
  80.             buffer = "\xf8\x24\x24\x18";
  81.             size = 4;
  82.             break;
  83.         case 'q':
  84.             buffer = "\x18\x24\x24\xf8";
  85.             size = 4;
  86.             break;
  87.         case 'r':
  88.             buffer = "\x08\xf0\x08\x10";
  89.             size = 4;
  90.             break;
  91.         case 's':
  92.             buffer = "\x90\xa8\xa8\xa8\x48";
  93.             size = 5;
  94.             break;
  95.         case 't':
  96.             buffer = "\x08\x7e\x88\x48";
  97.             size = 4;
  98.             break;
  99.         case 'u':
  100.             buffer = "\x78\x80\x80\x80\xf8";
  101.             size = 5;
  102.             break;
  103.         case 'v':
  104.             buffer = "\x18\x60\x80\x60\x18";
  105.             size = 5;
  106.             break;
  107.         case 'w':
  108.             buffer = "\x78\x80\x78\x80\x78";
  109.             size = 5;
  110.             break;
  111.         case 'x':
  112.             buffer = "\x88\x50\x20\x50\x88";
  113.             size = 5;
  114.             break;
  115.         case 'y':
  116.             buffer = "\x98\xa0\xa0\x78";
  117.             size = 4;
  118.             break;
  119.         case 'z':
  120.             buffer = "\x88\xc8\xa8\x98\x88";
  121.             size = 5;
  122.             break;
  123.         case 'A':
  124.             buffer = "\xfe\x09\x09\x09\xfe";
  125.             size = 5;
  126.             break;
  127.         case 'B':
  128.             buffer = "\xff\x89\x89\x89\x76";
  129.             size = 5;
  130.             break;
  131.         case 'C':
  132.             buffer = "\x73\x81\x81\x81";
  133.             size = 4;
  134.             break;
  135.         case 'D':
  136.             buffer = "\xff\x81\x81\x42\x3c";
  137.             size = 5;
  138.             break;
  139.         case 'E':
  140.             buffer = "\xff\x89\x89\x89\x81";
  141.             size = 5;
  142.             break;
  143.         case 'F':
  144.             buffer = "\xff\x09\x09\x09\x01";
  145.             size = 5;
  146.             break;
  147.         case 'G':
  148.             buffer = "\x7e\x81\x81\x89\x7a";
  149.             size = 5;
  150.             break;
  151.         case 'H':
  152.             buffer = "\xff\x08\x08\x08\xff";
  153.             size = 5;
  154.             break;
  155.         case 'I':
  156.             buffer = "\x81\xff\x81";
  157.             size = 3;
  158.             break;
  159.         case 'J':
  160.             buffer = "\x60\x80\x80\x7f";
  161.             size = 4;
  162.             break;
  163.         case 'K':
  164.             buffer = "\xff\x08\x14\xe3";
  165.             size = 4;
  166.             break;
  167.         case 'L':
  168.             buffer = "\xff\x80\x80\x80";
  169.             size = 4;
  170.             break;
  171.         case 'M':
  172.             buffer = "\xff\x02\x04\x18\x04\x02\xff";
  173.             size = 7;
  174.             break;
  175.         case 'N':
  176.             buffer = "\xff\x06\x18\x60\xff";
  177.             size = 5;
  178.             break;
  179.         case 'O':
  180.             buffer = "\x7e\x81\x81\x81\x7e";
  181.             size = 5;
  182.             break;
  183.         case 'P':
  184.             buffer = "\xff\x09\x09\x09\x06";
  185.             size = 5;
  186.             break;
  187.         case 'Q':
  188.             buffer = "\x3e\x41\x61\x41\xbe";
  189.             size = 5;
  190.             break;
  191.         case 'R':
  192.             buffer = "\xff\x09\x19\x29\xc6";
  193.             size = 5;
  194.             break;
  195.         case 'S':
  196.             buffer = "\x46\x89\x89\x89\x72";
  197.             size = 5;
  198.             break;
  199.         case 'T':
  200.             buffer = "\x01\x01\xff\x01\x01";
  201.             size = 5;
  202.             break;
  203.         case 'U':
  204.             buffer = "\x3f\x80\x80\x80\x3f";
  205.             size = 5;
  206.             break;
  207.         case 'V':
  208.             buffer = "\x3f\x40\x80\x40\x3f";
  209.             size = 5;
  210.             break;
  211.         case 'W':
  212.             buffer = "\x7f\x80\x70\x80\x7f";
  213.             size = 5;
  214.             break;
  215.         case 'X':
  216.             buffer = "\xe3\x14\x08\x14\xe3";
  217.             size = 5;
  218.             break;
  219.         case 'Y':
  220.             buffer = "\x07\x08\xf0\x08\x07";
  221.             size = 5;
  222.             break;
  223.         case 'Z':
  224.             buffer = "\xc1\xa1\x91\x89\x87";
  225.             size = 5;
  226.             break;
  227.         case '0':
  228.             buffer = "\x7e\xa1\x99\x85\x7e";
  229.             size = 5;
  230.             break;
  231.         case '1':
  232.             buffer = "\x81\xff\x80";
  233.             size = 3;
  234.             break;
  235.         case '2':
  236.             buffer = "\xc2\xa1\x91\x91\x8e";
  237.             size = 5;
  238.             break;
  239.         case '3':
  240.             buffer = "\x42\x81\x91\x91\x6e";
  241.             size = 5;
  242.             break;
  243.         case '4':
  244.             buffer = "\x1f\x10\x10\xff\x10";
  245.             size = 5;
  246.             break;
  247.         case '(':
  248.             buffer = "\x3c\x42\x81";
  249.             size = 3;
  250.             break;
  251.         case ')':
  252.             buffer = "\x81\x42\x3c";
  253.             size = 3;
  254.             break;
  255.         case '!':
  256.             buffer = "\xbf";
  257.             size = 1;
  258.             break;
  259.         case '?':
  260.             buffer = "\x02\x01\xb1\x09\x06";
  261.             size = 5;
  262.             break;
  263.         case '$':
  264.             buffer = "\x44\x4a\xff\x4a\x32";
  265.             size = 5;
  266.             break;
  267.         case '#':
  268.             buffer = "\x24\xff\x24\xff\x24";
  269.             size = 5;
  270.             break;
  271.         case '*':
  272.             buffer = "\x08\x2a\x1c\x2a\x08";
  273.             size = 5;
  274.             break;
  275.         case '.':
  276.             buffer = "\xc0\xc0";
  277.             size = 2;
  278.             break;
  279.         case '&':
  280.             buffer = "\x76\x89\x96\x60\x90";
  281.             size = 5;
  282.             break;
  283.         case '\"':
  284.             buffer = "\x07\x00\x07";
  285.             size = 3;
  286.             break;
  287.         case '\'':
  288.             buffer = "\x07";
  289.             size = 1;
  290.             break;
  291.         case ',':
  292.             buffer = "\xb0\x80";
  293.             size = 2;
  294.             break;
  295.         case '/':
  296.             buffer = "\xc0\x30\x0c\x03";
  297.             size = 4;
  298.             break;
  299.         case '\\':
  300.             buffer = "\x03\x0c\x30\xc0";
  301.             size = 4;
  302.             break;
  303.         case ':':
  304.             buffer = "\xc3\xc3";
  305.             size = 2;
  306.             break;
  307.         case ';':
  308.             buffer = "\xcb\xc7";
  309.             size = 2;
  310.             break;
  311.         case '[':
  312.             buffer = "\xff\x81\x81";
  313.             size = 3;
  314.             break;
  315.         case ']':
  316.             buffer = "\x81\x81\xff";
  317.             size = 3;
  318.             break;
  319.         case '%':
  320.             buffer = "\x46\x26\x10\xc8\xc4";
  321.             size = 5;
  322.             break;
  323.         case '^':
  324.             buffer = "\x04\x02\x01\x02\x04";
  325.             size = 5;
  326.             break;
  327.         case '_':
  328.             buffer = "\x80\x80\x80\x80\x80";
  329.             size = 5;
  330.             break;
  331.         case '=':
  332.             buffer = "\x28\x28\x28";
  333.             size = 3;
  334.             break;
  335.         case '+':
  336.             buffer = "\x10\x38\x10";
  337.             size = 3;
  338.             break;
  339.         case '-':
  340.             buffer = "\x10\x10\x10";
  341.             size = 3;
  342.             break;
  343.         case '{':
  344.             buffer = "\x08\x76\x81\x81";
  345.             size = 4;
  346.             break;
  347.         case '}':
  348.             buffer = "\x81\x81\x76\x08";
  349.             size = 4;
  350.             break;
  351.         case '<':
  352.             buffer = "\x20\x50\x88";
  353.             size = 3;
  354.             break;
  355.         case '>':
  356.             buffer = "\x88\x50\x20";
  357.             size = 3;
  358.             break;
  359.         case '@':
  360.             buffer = "\x7e\x81\x99\xa5\xbe\x80";
  361.             size = 6;
  362.             break;
  363.         case '|':
  364.             buffer = "\xf7";
  365.             size = 1;
  366.             break;
  367.         case '\n':
  368.         case ' ':
  369.             buffer = "\x00\x00\x00\x00\x00";
  370.             size = 5;
  371.             break;
  372.         default:
  373.             return -1;
  374.     }
  375.     return 0;
  376. }
  377.            
  378.                
  379.                
  380. int main(int argc, char** argv)
  381. {
  382.     if (argc > 1)
  383.     {
  384.         infile.open(argv[1]);
  385.         if (!infile.is_open())
  386.         {
  387.             cerr << "Error opening file" << endl;
  388.             return -1;
  389.         }
  390.         else
  391.         {
  392.             while (infile.good())
  393.             {
  394.                 c = infile.get();
  395.                 if (c >= 0 && c <= 255)
  396.                 {
  397.                    
  398.                     int error = lookup(c);
  399.                     char hexchar[32];
  400.                     if (error < 0)
  401.                     {
  402.                         cerr << "Character not defined: ";
  403.                         sprintf(hexchar, "0x%X\n",c);
  404.                         cerr << hexchar;
  405.                     }
  406.                     else
  407.                     {
  408.                         buffer += "\0";
  409.                         size++;
  410.                         cout.write(buffer.data(), size);
  411.                         //cerr << size << endl;
  412.                     }
  413.                 }
  414.             }
  415. //          buffer = "\0";
  416. //          cout << buffer;
  417.             infile.close();
  418.         }
  419.         return 0;
  420.     }
  421.     else
  422.     {
  423.         cerr << "Too few arguments" << endl;
  424.         return -1;
  425.     }
  426.     return 0;
  427. }