#include #include char KosmoSoftID[] = "(@)# prnro.c 1.0 V14.04.88 (C) KosmoSoft"; /* * prnro.c * * konverteer ANSI printerkodes naar epson-kode. * Alleen geschikt voor gebruik met NRO, omdat alleen * bold/italic/underline ondersteund worden. * Voor de aardigheid heb ik er ook nog NLQ aan/uit bij * gedaan. * * Werkt van stdin naar stdout. * * (C) Copyright KosmoSoft 1988 * */ void AnsiToEpson(), DoEscape(), DoCSI(), CollectCommand(); void DoSGR(), DoDEN(), Initialize(); int CollectParameter(); FILE *in, *out; int Parameter[8]; int NumPars; int Command; #define SGR 'm' #define DEN '"' #define NBSP 0xA0 #define ESC 0x1B #define CSI 0x9B #define CSI2 '[' main(argc, argv) int argc; char *argv[]; { in = stdin; out = stdout; AnsiToEpson(); } void AnsiToEpson() { int chr; Initialize(); /* Start in bekende toestand */ while ((chr = getc(in)) != EOF) { switch (chr) { case NBSP: putc(' ', out); continue; case ESC: DoEscape(); continue; case CSI: DoCSI(); continue; default: putc(chr, out); } } Initialize(); /* en laat geen rommel achter */ } void DoEscape() { int chr; if ((chr = getc(in)) == CSI2) { DoCSI(); } else if (chr != EOF) { putc(chr, out); } } void DoCSI() { CollectCommand(); switch (Command) { case SGR: DoSGR(); break; case DEN: DoDEN(); break; } } void CollectCommand() { register int chr; NumPars = 0; while ( (chr = CollectParameter()) == ';') ; Command = chr; } int CollectParameter() { register int chr; register int par; par = 0; while (isdigit(chr = getc(in))) { par *= 10; par += chr - '0'; } Parameter[NumPars++] = par; return chr; } char SGR0[] = "\0335\033-0\033F", /* normal characters */ SGR3[] = "\0334", /* italics on */ SGR23[]= "\0335", /* off */ SGR4[] = "\033-1", /* underline on */ SGR24[]= "\033-0", /* off */ SGR1[] = "\033E", /* boldface on */ SGR22[]= "\033F"; /* off */ void DoSGR() { register int i; register char *string = NULL; for (i = 0; i < NumPars; i++) { switch (Parameter[i]) { case 0: string = SGR0; break; case 3: string = SGR3; break; case 23: string = SGR23; break; case 4: string = SGR4; break; case 24: string = SGR24; break; case 1: string = SGR1; break; case 22: string = SGR22; break; } if (string) fputs(string, out); } } char DEN1[] = "\033x0", /* NLQ off */ DEN2[] = "\033x1", /* on */ DEN3[] = "\033H", /* double strike off */ DEN4[] = "\033G"; /* on */ char *DENs[] = { "", DEN1, DEN2, DEN3, DEN4 }; void DoDEN() { register int i; register int den; for (i = 0; i < NumPars; i++) { if ( (den = Parameter[i]) <= 4) fputs(DENs[den], out); } } char RIS[] = "\375\033@\375"; void Initialize() { fputs(SGR0, out); }