home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
archives
/
mskermit.zip
/
mspep4.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-01-18
|
11KB
|
272 lines
/* 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 <stdio.h>
/* 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. */
}