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