#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);
}
