home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / mskermit / mspep4.c < prev    next >
C/C++ Source or Header  |  2020-01-01  |  10KB  |  272 lines

  1. /* Program ep437.c */
  2.  
  3. /* Print IBM PC Code Page 437 Files on an Epson FX-80 or RX-80 Printer */
  4. /* Converts PC character set into Epson character set. */
  5. /* When the Epson does not have an equivalent to a PC character, this */
  6. /* Program attempts to approximate it by overstriking (like a-ring, */
  7. /* i-acute, less-than-or-equal, etc). If an overstruck version can't be */
  8. /* made, this program prints a round blob.  Most Greek characters are */
  9. /* written with Roman equivalents (alpha = a, sigma = s, etc). */
  10.  
  11. /* Users are encouraged to improve this program and to adapt it for use */
  12. /* with other code pages (like CP850) and with other kinds of printers */
  13. /* (like Postscript). */ 
  14.  
  15. /* Usage: On PC, "ep437 filename > prn" or "program | ep437 > prn"
  16.  
  17. /* F. da Cruz, Columbia University, December 1989 */
  18.  
  19. #include <stdio.h>
  20.  
  21. /* Add "\33O" to reset if you want to defeat "skip-over-perforation". */
  22.  
  23. char *reset = "\33@";            /* Escape sequence to reset printer */
  24. char *ascii = "\33R0";            /* Sequence to switch character set */
  25.                     /* to US ASCII. */
  26.  
  27. /* 7-bit characters are plain ASCII, untranslated. */
  28. /* The following translation table is for 8-bit characters. */
  29. /* Constants are in octal, since that's how C likes them. */
  30. /* First, the "national" language-related characters... */
  31.  
  32. char *t[] = {
  33. "\33R\1\134",                /* 128 C-cedilla */ 
  34. "\33R\2\175",                /* 129 u-umlaut */
  35. "\33R\1\173",                /* 130 e-acute */ 
  36. "\33R0a\10\136",            /* 131 a-circumflex */ 
  37. "\33R\2\173",                /* 132 a-umlaut */ 
  38. "\33R\1\100",                /* 133 a-grave */ 
  39. "\33R\6\133\10\141",            /* 134 a-ring (overstrike) */ 
  40. "\33R\1\134",                /* 135 c-cedilla (use uppercase) */ 
  41. "\33R0e\10^",                /* 136 e-circumflex */ 
  42. "\33R0e\10\33R\1\176",            /* 137 e-umlaut (overstrike) */ 
  43. "\33R0\33R\1\175",            /* 138 e-grave (overstrike) */ 
  44. "\33R0i\10\33R\1\176",            /* 139 i-umlaut (overstrike) */ 
  45. "\33R0i\10^",                /* 140 i-circumflex (overstrike) */ 
  46. "\33R\6\176",                /* 141 i-grave */ 
  47. "\33R\2\133",                /* 142 A-umlaut */ 
  48. "\33R\4\135",                /* 143 A-ring */ 
  49. "\33R\5\100",                /* 144 E-acute */ 
  50. "\33R\4\173",                /* 145 ae digraph */ 
  51. "\33R\4\133",                /* 146 AE digraph */ 
  52. "\33R0o\10^",                /* 147 o-circumflex (overstrike) */ 
  53. "\33R\2\174",                /* 148 o-umlaut */ 
  54. "\33R\6\174",                /* 149 o-grave */ 
  55. "\33R\2\175\10^",            /* 150 u-circumflex (overstrike) */ 
  56. "\33R\1\174",                /* 151 u-grave */ 
  57. "\33R0y\10\33R\1\176",            /* 152 y-umlaut (overstrike) */ 
  58. "\33R\2\134",                /* 153 O-umlaut */ 
  59. "\33R\2\135",                /* 154 U-umlaut */ 
  60. "\33R0c\10\033R0/",            /* 155 cent (overstrike) */ 
  61. "\33R\3\43",                /* 156 pound */ 
  62. "\33R\10\134",                /* 157 yen */ 
  63. "\33R\7\43",                /* 158 Pt */ 
  64. "\33R0f",                /* 159 florin */ 
  65. "\33R0a\10'",                /* 160 a-acute (overstrike) */ 
  66. "\33R0i\10'",                /* 161 i-acute (overstrike) */ 
  67. "\33R0o\10'",                /* 162 o-acute (overstrike) */ 
  68. "\33R0u\10'",                /* 163 u-acute (overstrike) */ 
  69. "\33R\7\174",                /* 164 n-tilde */ 
  70. "\33R\7\134",                /* 165 N-tilde */ 
  71. "\33S0a\33T",                /* 166 fem. ordinal (superscript) */ 
  72. "\33S0o\33T",                /* 167 masc. ordinal (superscript) */
  73. "\33R\7\135",                /* 168 ?-inverted */ 
  74.  
  75. /* The following are approximations of IBM box & line drawing characters */
  76.  
  77. "\33m\4\207",                /* 169 u.l.corner */ 
  78. "\33m\4\210",                /* 170 u.r.corner */ 
  79. "\33m\4\217",                /* 171 1/2 unk */ 
  80. "\33m\4\217",                /* 172 1/4 unk */ 
  81. "\33R\7\133",                /* 173 !-inv */ 
  82. "\33R0<",                /* 174 << */ 
  83. "\33R0>",                /* 175 >> */ 
  84. "\33m\4\213",                /* 176 light box */ 
  85. "\33m\4\213",                /* 177 med box */ 
  86. "\33m\4\214",                /* 178 dark box */ 
  87. "\33m\4\206",                /* 179 vert line */ 
  88. "\33m\4\203",                /* 180 -| */ 
  89. "\33m\4\203",                /* 181 =| */ 
  90. "\33m\4\203",                /* 182 -|| */ 
  91. "\33m\4\210",                /* 183 overline || (u.r.corner) */ 
  92. "\33m\4\210",                /* 184 double overline | (u.r.c) */ 
  93. "\33m\4\203",                /* 185 double -| */ 
  94. "\33m\4\206",                /* 186 || */ 
  95. "\33m\4\210",                /* 187 double u.r.corner */ 
  96. "\33m\4\212",                /* 188 double l.r.corner */ 
  97. "\33m\4\212",                /* 189 _|| */ 
  98. "\33m\4\212",                /* 190 double underline | */ 
  99. "\33m\4\210",                /* 191 u.r.corner */ 
  100. "\33m\4\211",                /* 192 l.l.corner */ 
  101. "\33m\4\201",                /* 193 inv-T.corner */ 
  102. "\33m\4\202",                /* 194 T.corner */ 
  103. "\33m\4\204",                /* 195 |- */ 
  104. "\33m\4\205",                /* 196 center line */ 
  105. "\33m\4\200",                /* 197 big plus */ 
  106. "\33m\4\204",                /* 198 |= */ 
  107. "\33m\4\204",                /* 199 ||- */ 
  108. "\33m\4\211",                /* 200 double l.l.corner */ 
  109. "\33m\4\207",                /* 201 double u.l.corner */ 
  110. "\33m\4\201",                /* 202 double inv.T.corner */ 
  111. "\33m\4\202",                /* 203 double T.corner */ 
  112. "\33m\4\204",                /* 204 double |- */ 
  113. "\33m\4\205",                /* 205 double center line */ 
  114. "\33m\4\200",                /* 206 double big plus */ 
  115. "\33m\4\201",                /* 207 double center line, | over */ 
  116. "\33m\4\201",                /* 208 double | w/center line under */
  117. "\33m\4\202",                /* 209 double center line, | under */ 
  118. "\33m\4\202",                /* 210 || with overline (T) */ 
  119. "\33m\4\211",                /* 211 ||_ */ 
  120. "\33m\4\211",                /* 212 | with = l.l.corner */ 
  121. "\33m\4\207",                /* 213 | with = u.l.corner */ 
  122. "\33m\4\207",                /* 214 || with overline u.l.corner */ 
  123. "\33m\4\200",                /* 215 || with -- thru center */ 
  124. "\33m\4\200",                /* 216 == with | thru center */ 
  125. "\33m\4\212",                /* 217 l.r.corner */ 
  126. "\33m\4\207",                /* 218 u.l.corner */ 
  127. "\33m\4\214",                /* 219 big black square */ 
  128. "\33m\4\215",                /* 220 low center black rectangle */ 
  129. "\33m\4\216",                /* 221 left black rectangle */ 
  130. "\33m\4\216",                /* 222 right black rectangle */ 
  131. "\33m\4\215",                /* 223 high black rectangle */ 
  132. "\33R0a",                /* 224 Greek alpha (use a) */ 
  133. "\33R\2\176",                /* 225 Greek beta */
  134. "\33m\4\207",                /* 226 Greek Gamma (use u.l.corner */ 
  135. "\33R0n",                /* 227 Greek pi (use l.c. n) */ 
  136. "\33R0S",                /* 228 Greek Sigma (overstrike) */
  137. "\33R0s",                /* 229 Greek sigma (use l.c. s) */ 
  138. "\33R0u",                /* 230 Greek mu (use u) */ 
  139. "\33R0t",                /* 231 Greek tau (use t) */ 
  140. "\33R00\10\033R0I",            /* 232 Greek Fi (overstrike) */ 
  141. "\33R00\10-",                /* 233 Greek Theta (overstrike) */ 
  142. "\33R0O",                /* 234 Greek Omega (use O) */ 
  143. "\33R0d",                /* 235 Greek delta (use d) */ 
  144. "\33m\4\217",                /* 236 infinity (unk) */
  145. "\33R0o\10/",                /* 237 Greek fi */ 
  146. "\33R0e",                /* 238 Greek epsilon (use e) */ 
  147. "\33m\4\217",                /* 239 set thing (unk) */ 
  148. "\33R0=",                /* 240 = with 3 lines (use =) */ 
  149. "\33m\4\237",                /* 241 plus/minus */ 
  150. "\33R0>\10=",                /* 242 greater-equal (overstrike) */ 
  151. "\33R0<\10=",                /* 243 less-equal (overstrike) */ 
  152. "\33m\4\217",                /* 244 integral top (unk) */ 
  153. "\33m\4\217",                /* 245 integral bottom (unk) */ 
  154. "\33m\4\236",                /* 246 division */ 
  155. "\33R0\176\10\33S1\176\33T",        /* 247 approx equal (overstrike) */ 
  156. "\33R\1\133",                /* 248 degree */ 
  157. "\33S0.\33T",                /* 249 center dot (superscript) */ 
  158. "\33S0.\33T",                /* 250 big center dot (superscript) */ 
  159. "\33m\4\217",                /* 251 radical */ 
  160. "\33S0n\33T",                /* 252 n superscript */ 
  161. "\33S02\33T",                /* 253 2 superscript */ 
  162. "\33m\4\217",                /* 254 small center box */ 
  163. "\33R0 \10"                /* 255 nothing */
  164. };
  165.  
  166. FILE *fp, *fopen();
  167.  
  168. main(argc,argv) int argc; char *argv[]; { /* Main function. */
  169.     int i, j, n;
  170.  
  171.     if ((argc == 2) && (!strcmp(argv[1],"-t"))) {
  172.     table();            /* -t means to print tables */
  173.     exit(0);
  174.     }
  175.     if (argc == 1) {            /* If no files given, use stdin */
  176.     fp = stdin;
  177.     xlate();
  178.     exit(0);
  179.     }
  180.     n = 0;                /* File counter */
  181.     while (++n < argc) {        /* Filenames given on command line */
  182.         fprintf(stderr,"%s...\n",argv[n]);
  183.     if ((fp = fopen(argv[n],"r")) == NULL) { /* Open the file */
  184.       fprintf(stderr,"Can't open %s, skipping.\n",argv[n]);
  185.           continue;
  186.         }
  187.     xlate();            /* Translate the file */
  188.     fclose(fp);            /* Close the file */
  189.     printf("%s","\014");        /* Print a formfeed */
  190.     }
  191.     exit(0);                /* Done */
  192. }
  193.  
  194. xlate() {                /* Translation function. */
  195.     int mode, y;
  196.     unsigned char x;
  197.  
  198.     printf("%s",reset);            /* Reset the printer */
  199.     mode = 1;                /* 0 = Regular ASCII, 1 = special */
  200.     while (1) {
  201.     x = y = getc(fp);        /* Get a character */
  202.     if (y == EOF) {            /* EOF, done */
  203.         printf("%s",reset);
  204.         return(0);
  205.     } else if (x < 128) {        /* If regular ASCII character */
  206.         if (mode) {            /* If necessary, */
  207.         printf("%s",ascii);    /* go back to ASCII */
  208.         mode = 0;        /* and remember mode. */
  209.         }
  210.         putchar(x);            /* then print the character. */
  211.     } else {            /* If special character */
  212.         printf("%s",t[x-128]);    /* print its translation */
  213.         mode = 1;            /* and remember mode. */
  214.     }
  215.     }
  216. }
  217.  
  218. /* Special positions in 7-bit national replacement character sets */
  219.  
  220. char c[] = { 35, 36, 64, 91, 92, 93, 94, 96, 123, 124, 125, 126 } ;
  221.  
  222. /* Function to print character tables... */
  223.  
  224. table() {
  225.     int i, j, k;
  226.  
  227. /* Print the Epson national character set table. */
  228.  
  229.     printf("%s","Epson FX/RX Built-in National Characters:\n\n");
  230.     printf("Dec / Oct   %s",
  231.       "\33-1USA  FR   GE   UK   DK   SW   IT   SP   JP   NO\33-0\n\n");
  232.     for (i = 0; i < 12; i++) {        /* Loop for each line */
  233.     printf("%s",reset);        /* Reset printer */
  234.     printf("%3d / %3o:  0/%c  ",c[i], c[i], c[i]);
  235.     for (j = 1; j < 10; j++) {    /* Loop for each character set */
  236.         printf("%d/",j);
  237.         putchar('\33');        /* ESC */
  238.         putchar('R');        /* R */
  239.         putchar((char) j);        /* Country character set number */
  240.         putchar(c[i]);        /* Character to print */
  241.         putchar(' ');        /* Spaces */
  242.         putchar(' ');
  243.     }
  244.     putchar('\n');            /* End of line */
  245.     }
  246.  
  247. /* Print the CP437 character table. */
  248. /* Compare this with the real CP437 table in the back of the DOS manual. */
  249.  
  250.     printf("%s%s",reset,ascii);        /* Reset printer, select ASCII */
  251.     printf("\n\nIBM Code Page 437:\n\n"); /* Print heading */
  252.     printf("   %s%c","\33-",'1');    /* Underline on */
  253.     for (j = 2; j < 16; j++)            /* Column headings */    
  254.     printf("%3d",j);
  255.     printf("%s%c\n\n","\033-",'0');    /* Underline off */
  256.  
  257.     for    (i = 0; i < 16; i++) {        /* Loop for each row */
  258.     printf("%s%2d:  ",reset,i);    /* Reset printer */
  259.     for (j = 2; j < 16; j++) {    /* Loop for each character in row */
  260.         k = i + (j * 16);            /* Code for this character */
  261.         if (k < 0177)             /* 7-bit ASCII character */
  262.         printf("%s%c  ", ascii, k);     /* Print it in ASCII mode */
  263.         else if (k == 0177)                 /* DEL */
  264.         printf("   ");                 /* Just print a space */
  265.         else                                /* 8-bit character */
  266.         printf("%s  ",t[k - 0200]);     /* Use table */
  267.     }
  268.     printf("\n");            /* End of row. */
  269.     }                    /* Loop till done. */
  270.     printf("%s",reset);            /* Reset printer. */
  271. }
  272.