home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
215.lha
/
NRO
/
prnro.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-02-15
|
3KB
|
196 lines
#include <stdio.h>
#include <ctype.h>
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);
}