home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume7 / thack / thack.c < prev   
C/C++ Source or Header  |  1989-06-03  |  10KB  |  543 lines

  1. #include "th.h"
  2.  
  3. int xpos, ypos, cx, cy;
  4. int font, cfont, size, csize, tfont, tsize;
  5. char *pstr, *cstr();
  6.  
  7. main()
  8. {
  9.     int c, i;
  10.     int sflag;
  11.     int hdist, vdist;
  12.     int esc, lead;
  13.     int fh;
  14.  
  15.     hdist = vdist = 0;
  16.     cfont = csize = -1;
  17.     tfont = font = 0;
  18.     tsize = size = 12;
  19.     esc = lead = 1;
  20.     cy = ypos = 1692;
  21.     cx = xpos = 0;
  22.     sflag = 0;
  23.     prolog();
  24.     newpage();
  25.     while ((c = getchar()) != EOF) {
  26.         font = tfont;
  27.         size = tsize;
  28.         if (c & 0x80)
  29.             hdist += ~c & 0x7f;
  30.         else if ((c & 0xe0) == 0x60)
  31.             vdist += ~c & 0x1f;
  32.         if ((c & 0xc0) == 0) {
  33.             if ((c & 0x3f) != 0) {
  34.                 if (hdist || vdist) {
  35.                     xpos += esc * hdist;
  36.                     ypos -= lead * vdist;
  37.                     if (ypos <= 0) {
  38.                         endpage();
  39.                         newpage();
  40.                         while (ypos < 0)
  41.                             ypos += 1584;
  42.                     }
  43.                     hdist = 0;
  44.                     vdist = 0;
  45.                 }
  46.                 sflag = 1;
  47.                 if (table[(font % 4) == 3][fh][c & 0x3f] == ' ') {
  48.                     if (font % 4 != 3)
  49.                         if (fh == 0)
  50.                             switch (c & 0x3f) {
  51.                             case 18:
  52.                                 pstr = "\\320";
  53.                                 break;    /* \(em */
  54.                             case 28:
  55.                                 illegal("1/4");
  56.                                 break;    /* \(14 */
  57.                             case 30:
  58.                                 illegal("1/2");
  59.                                 break;    /* \(12 */
  60.                             case 38:
  61.                                 illegal("3/4");
  62.                                 break;    /* \(34 */
  63.                             default:
  64.                                 fprintf(stderr, ">>>>> L%d/%d\n", font, c & 0x3f);
  65.                             }
  66.                         else
  67.                             switch (c & 0x3f) {
  68.                             case 19:
  69.                                 pstr = "\\320";
  70.                                 break;    /* \- */
  71.                             case 20:
  72.                                 pstr = "\\256";
  73.                                 break;    /* fi */
  74.                             case 21:
  75.                                 pstr = "\\257";
  76.                                 break;    /* fl */
  77.                             case 22:
  78.                                 pstr = "ff";
  79.                                 break;    /* ff */
  80.                             case 23:
  81.                                 pstr = "\\242";
  82.                                 break;    /* cent */
  83.                             case 24:
  84.                                 pstr = "f\\257";
  85.                                 break;    /* ffl */
  86.                             case 25:
  87.                                 pstr = "f\\256";
  88.                                 break;    /* ffi */
  89.                             case 30:
  90.                                 fontps(3, size, "\\260");
  91.                                 break;    /* degree */
  92.                             case 31:
  93.                                 pstr = "\\262";
  94.                                 break;    /* dagger */
  95.                             case 33:
  96.                                 fontps(3, size, "\\322");
  97.                                 break;    /* reg */
  98.                             case 38:
  99.                                 pstr = "\\267";
  100.                                 break;    /* bullet */
  101.                             case 40:
  102.                                 fontps(3, size, "\\242");
  103.                                 break;    /* footmark */
  104.                             case 43:
  105.                                 fontps(3, size, "\\323");
  106.                                 break;    /* c'right */
  107.                             case 44:
  108.                                 pstr = "\\250";
  109.                                 break;    /* square ? */
  110.                             default:
  111.                                 fprintf(stderr, ">>>>> U%d/%d\n", font, c & 0x3f);
  112.                             }
  113.                     else if (fh == 0)
  114.                         switch (c & 0x3f) {
  115.                         case 18:
  116.                             fontps(0, size, "@");
  117.                             break;    /* @ */
  118.                         case 19:
  119.                             pstr = "\\257";
  120.                             break;    /* down arrow */
  121.                         case 22:
  122.                             pstr = cstr('|');
  123.                             break;    /* OR */
  124.                         case 24:
  125.                             fontps(0, size, "\"");
  126.                             break;    /* " */
  127.                         case 28:
  128.                             pstr = "\\254";
  129.                             break;    /* <- */
  130.                         case 30:
  131.                             pstr = "\\255";
  132.                             break;    /* up arrow */
  133.                         case 33:
  134.                             fontps(0, size, "\\\\");
  135.                             break;    /* Backslash ! */
  136.                         case 35:
  137.                             illegal("Bell Logo");
  138.                             break;    /* Bell Logo */
  139.                         case 36:
  140.                             pstr = "\\245";
  141.                             break;    /* infinity */
  142.                         case 38:
  143.                             pstr = "\\312";
  144.                             break;    /* impr. super */
  145.                         case 39:
  146.                             pstr = "\\265";
  147.                             break;    /* proportional */
  148.                         case 40:
  149.                             pstr = "\\336";
  150.                             break;    /* right hand */
  151.                         case 43:
  152.                             pstr = "\\321";
  153.                             break;    /* grad */
  154.                         case 48:
  155.                             pstr = "\\310";
  156.                             break;    /* union */
  157.                         case 49:
  158.                             pstr = "\\140";
  159.                             break;    /* sqrtroof */
  160.                         case 54:
  161.                             pstr = "\\362";
  162.                             break;    /* integral */
  163.                         case 56:
  164.                             pstr = "\\314";
  165.                             break;    /* subset */
  166.                         case 57:
  167.                             pstr = "\\311";
  168.                             break;    /* superset */
  169.                         case 58:
  170.                             pstr = cstr('~');
  171.                             break;    /* approximate */
  172.                         case 59:
  173.                             pstr = "\\256";
  174.                             break;    /* partial */
  175.                         case 61:
  176.                             pstr = "\\326";
  177.                             break;    /* sqrt */
  178.                         case 63:
  179.                             pstr = "\\273";
  180.                             break;    /* ~= */
  181.                         default:
  182.                             fprintf(stderr, ">>>>> L%d/%d\n", font, c & 0x3f);
  183.                         }
  184.                     else
  185.                         switch (c & 0x3f) {
  186.                         case 5:
  187.                             pstr = "\\307";
  188.                             break;    /* intersect */
  189.                         case 7:
  190.                             pstr = "\\330";
  191.                             break;    /* not */
  192.                         case 8:
  193.                             pstr = "\\371";
  194.                             break;    /* righceil, sq */
  195.                         case 9:
  196.                             pstr = "\\354";
  197.                             break;    /* leftop, curly */
  198.                         case 10:
  199.                             pstr = "\\357";
  200.                             break;    /* bold vertical */
  201.                         case 11:
  202.                             pstr = "\\355";
  203.                             break;    /* lefcent, curly */
  204.                         case 12:
  205.                             pstr = "\\356";
  206.                             break;    /* leftbot, curly */
  207.                         case 13:
  208.                             pstr = "\\374";
  209.                             break;    /* rightop, curly */
  210.                         case 14:
  211.                             pstr = "\\375";
  212.                             break;    /* righcen, curly */
  213.                         case 15:
  214.                             pstr = "\\376";
  215.                             break;    /* rightbot, curly */
  216.                         case 16:
  217.                             pstr = "\\373";
  218.                             break;    /* rigfloor, sq */
  219.                         case 17:
  220.                             pstr = "\\353";
  221.                             break;    /* lefloor, sq */
  222.                         case 18:
  223.                             pstr = "\\351";
  224.                             break;    /* leftceil, sq */
  225.                         case 19:
  226.                             pstr = "\\264";
  227.                             break;    /* times */
  228.                         case 20:
  229.                             pstr = "\\270";
  230.                             break;    /* divide */
  231.                         case 21:
  232.                             pstr = "\\261";
  233.                             break;    /* +- */
  234.                         case 22:
  235.                             pstr = "\\243";
  236.                             break;    /* <= */
  237.                         case 23:
  238.                             pstr = "\\263";
  239.                             break;    /* >= */
  240.                         case 24:
  241.                             pstr = "\\272";
  242.                             break;    /* ident. equ */
  243.                         case 25:
  244.                             pstr = "\\271";
  245.                             break;    /* != */
  246.                         case 28:
  247.                             fontps(0, size, "\\302");
  248.                             break;    /* acute */
  249.                         case 29:
  250.                             fontps(0, size, "\\301");
  251.                             break;    /* grave */
  252.                         case 30:
  253.                             fontps(0, size, "^");
  254.                             break;    /* ^ */
  255.                         case 32:
  256.                             pstr = "\\334";
  257.                             break;    /* left hand */
  258.                         case 33:
  259.                             pstr = "\\316";
  260.                             break;    /* Member of */
  261.                         case 35:
  262.                             pstr = "\\306";
  263.                             break;    /* Empty set */
  264.                         case 37:
  265.                             fontps(0, size, "\\263");
  266.                             break;    /* doubdagg */
  267.                         case 38:
  268.                             pstr = "\\275";
  269.                             break;    /* box vertical */
  270.                         case 40:
  271.                             pstr = "\\315";
  272.                             break;    /* impr. subset */
  273.                         case 41:
  274.                             illegal("circle");
  275.                             break;    /* circle */
  276.                         case 44:
  277.                             pstr = "\\256";
  278.                             break;    /* -> */
  279.                         case 45:
  280.                             fontps(0, size, "\\247");
  281.                             break;    /* section */
  282.                         default:
  283.                             fprintf(stderr, ">>>>> U%d/%d\n", font, c & 0x3f);
  284.                         }
  285.                 }
  286.                 else {
  287.                     switch (table[(font % 4) == 3][fh][c & 0x3f]) {
  288.                     case '(':
  289.                         pstr = "\\(";
  290.                         break;
  291.                     case ')':
  292.                         pstr = "\\)";
  293.                         break;
  294.                     default:
  295.                         pstr = cstr(table[(font % 4) == 3][fh][c & 0x3f]);
  296.                         break;
  297.                     }
  298.                 }
  299.                 tprint();
  300.             }
  301.         }
  302.         else if ((c & 0xf0) == 0x50) {
  303.             switch (c & 0x0f) {
  304.             case 0:
  305.                 size = 7;
  306.                 break;
  307.             case 1:
  308.                 size = 8;
  309.                 break;
  310.             case 2:
  311.                 size = 10;
  312.                 break;
  313.             case 3:
  314.                 size = 11;
  315.                 break;
  316.             case 4:
  317.                 size = 12;
  318.                 break;
  319.             case 5:
  320.                 size = 14;
  321.                 break;
  322.             case 6:
  323.                 size = 18;
  324.                 break;
  325.             case 7:
  326.                 size = 9;
  327.                 break;
  328.             case 8:
  329.                 size = 6;
  330.                 break;
  331.             case 9:
  332.                 size = 16;
  333.                 break;
  334.             case 10:
  335.                 size = 20;
  336.                 break;
  337.             case 11:
  338.                 size = 22;
  339.                 break;
  340.             case 12:
  341.                 size = 24;
  342.                 break;
  343.             case 13:
  344.                 size = 28;
  345.                 break;
  346.             case 14:
  347.                 size = 36;
  348.                 break;
  349.             default:
  350.                 fprintf(stderr, "Size: %x\n", c & 0x0f);
  351.             }
  352.             crsize(csize, size);
  353.             tsize = size;
  354.         }
  355.         else if ((c & 0xf0) == 0x40) {
  356.             c &= 0xf;
  357.             switch (c) {
  358.             case 0:/* fprintf(stderr,"INIT\n"); */
  359.                 break;
  360.             case 1:
  361.                 font &= 30;
  362.                 break;
  363.             case 2:
  364.                 font |= 1;
  365.                 break;
  366.             case 3:
  367.                 font |= 2;
  368.                 break;
  369.             case 4:
  370.                 font &= 29;
  371.                 break;
  372.             case 5:
  373.                 fh = 0;
  374.                 break;
  375.             case 6:
  376.                 fh = 1;
  377.                 break;
  378.             case 7:
  379.                 esc = 1;
  380.                 break;
  381.             case 8:
  382.                 esc = -1;
  383.                 break;
  384.             case 9:/* fprintf(stderr,"STOP\n"); */
  385.                 break;
  386.             case 10:
  387.                 lead = 1;
  388.                 break;
  389.             case 12:
  390.                 lead = -1;
  391.                 break;
  392.             case 14:
  393.                 font |= 4;
  394.                 break;
  395.             case 15:
  396.                 font &= 27;
  397.                 break;
  398.             default:
  399.                 fprintf(stderr, "ILLEGAL\n");
  400.                 break;
  401.             }
  402.             tfont = font;
  403.         }
  404.     }
  405.     if (sflag)
  406.         endpage();
  407. }
  408.  
  409. tprint()
  410. {
  411.     if (font != cfont || size != csize) {
  412.         printf("%d ", size * 6);
  413.         switch (font) {
  414.         case 0:
  415.             printf("TR");
  416.             break;
  417.         case 1:
  418.             printf("TI");
  419.             break;
  420.         case 2:
  421.             printf("TB");
  422.             break;
  423.         case 3:
  424.             printf("S");
  425.             break;
  426.         case 8:
  427.             printf("H");
  428.             break;
  429.         case 9:
  430.             printf("HO");
  431.             break;
  432.         case 10:
  433.             printf("HB");
  434.             break;
  435.         case 11:
  436.             printf("S");
  437.             break;
  438.         case 16:
  439.             printf("C");
  440.             break;
  441.         case 17:
  442.             printf("CO");
  443.             break;
  444.         case 18:
  445.             printf("CB");
  446.             break;
  447.         case 19:
  448.             printf("S");
  449.             break;
  450.         case 24:
  451.             printf("TBI");
  452.             break;
  453.         case 25:
  454.             printf("HBO");
  455.             break;
  456.         case 26:
  457.             printf("CBO");
  458.             break;
  459.         case 27:
  460.             printf("S");
  461.             break;
  462.         default:
  463.             fprintf(stderr, "Illegal Font %d\n", font);
  464.         }
  465.         printf(" F\n");
  466.         cfont = font;
  467.         csize = size;
  468.     }
  469.     if (ypos == cy)
  470.         printf("(%s)%d X\n", pstr, xpos);
  471.     else
  472.         printf("(%s)%d %d P\n", pstr, xpos, 3 * ypos);
  473.     cx = xpos;
  474.     cy = ypos;
  475. }
  476.  
  477. fontps(f1, ps, str)
  478. char *str;
  479. {
  480.     tfont = cfont;
  481.     tsize = csize;
  482.     pstr = str;
  483.     size = ps;
  484.     font = f1;
  485. }
  486.  
  487. illegal(s)
  488. char *s;
  489. {
  490.     fprintf(stderr, "Sequence %s is not allowed\n", s);
  491. }
  492.  
  493. crsize(old, new)
  494. {
  495.     if ((old == 16 || old >= 20) && (new != 16 && new < 20))
  496.         xpos += 55;
  497.     else if ((new == 16 || new >= 20) && (old != 16 && old < 20))
  498.         xpos -= 55;
  499. }
  500.  
  501. char *
  502. cstr(c)
  503. char c;
  504. {
  505.     static char s[2] = " ";
  506.  
  507.     *s = c;
  508.     return s;
  509. }
  510.  
  511. newpage()
  512. {
  513.     printf("save\n");
  514. }
  515.  
  516. prolog()
  517. {
  518.     printf("/P {moveto show} def\n");
  519.     printf("/X {currentpoint exch pop moveto show} def\n");
  520.     printf("/F {findfont exch scalefont setfont} def\n");
  521.     printf("/TR /Times-Roman def\n");
  522.     printf("/TI /Times-Italic def\n");
  523.     printf("/TB /Times-Bold def\n");
  524.     printf("/S /Symbol def\n");
  525.     printf("/H /Helvetica def\n");
  526.     printf("/HO /Helvetica-Oblique def\n");
  527.     printf("/HB /Helvetica-Bold def\n");
  528.     printf("/C /Courier def\n");
  529.     printf("/CO /Courier-Oblique def\n");
  530.     printf("/CB /Courier-Bold def\n");
  531.     printf("/TBI /Times-BoldItalic def\n");
  532.     printf("/HBO /Helvetica-BoldOblique def\n");
  533.     printf("/CBO /Courier-BoldOblique def\n");
  534.     printf("1 6 div dup scale\n");
  535. }
  536.  
  537. endpage()
  538. {
  539.     printf("showpage\n");
  540.     printf("restore\n");
  541.     cfont = csize = -1;    /* Doing this will cause a new font message */
  542. }
  543.