[alt.sources] NEC P5 or EPSON to PostScript filter

bernd@actisb.UUCP (Bernd-Gunter Nitzler) (04/24/88)

	N E C - P 5     to     P o s t s c r i p t (TM)    F i l t e r

Version 0.5		(not completely tested)

This is a filter to translate the ESC- and FS-sequences
of the NEC P5 Series printer (and since this is a superset
of the EPSON printer commands also EPSON and compatible
printers) to Postscript.

It is based very loosely on the IBM Graphics printer to
postscript translator posted a couple of weeks before to the
net. That version was copyrighted by Jonathan Greenblatt and
changed by Mark Alexander. Since I started from scratch and
used only about 5% of the original code I include my own
copyright notice.

Copyright (c) 1988, Bernd-Gunter Nitzler,
	pyramid!actisb!bernd
	unido!tub!actisb!bernd

	A similar program was copyrighted before:
Copyright (c) 1988, Jonathan Greenblatt,
	<jonnyg@rover.umd.edu> (128.8.2.73)
	<jonnyg@umd5.umd.edu> (128.8.10.5)
	<pcproj@gymble.umd.edu> (128.8.128.16)

	and changed by:
Mark Alexander <uunet!amdahl!drivax!alexande@umd5.UMD.EDU>

I post this version only as a beta test version, not as a final
release because I am out of town until 15th of June 1988 and I
look forward to receive bug fixes and enhancements until then.
About half of the control sequences I implemented were only
roughly tested, the graphics sequences were only tested in the
8-pin part sinc I have no graphics program which can handle
24-pin graphics.

Please mail any bug fixes and enhancements or comments to me
because our news system has an expire period of 4 to 7 days only
and all news messages will be deleted when I come back to the
office.

#--- cut --- cut --- cut --- cut --- cut --- cut --- cut --- cut
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	README
#	defaults.h
#	necp5.c
# This archive created: Sun Apr 24 00:00:38 1988
export PATH; PATH=/bin:$PATH
echo shar: extracting "'README'" '(1859 characters)'
if test -f 'README'
then
	echo shar: will not over-write existing file "'README'"
else
sed 's/^X//' << \SHAR_EOF > 'README'
X	N E C - P 5     to     P o s t s c r i p t (TM)
X
XVersion 0.5		(not completely tested)
X
XThis is a filter to translate the ESC- and FS-sequences
Xof the NEC P5 Series printer (and since this is a superset
Xof the EPSON printer commands also EPSON and compatible
Xprinters) to Postscript.
X
XIt is based very loosely on the IBM Graphics printer to
Xpostscript translator posted a couple of weeks before to the
Xnet. That version was copyrighted by Jonathan Greenblatt and
Xchanged by Mark Alexander. Since I started from scratch and
Xused only about 5% of the original code I include my own
Xcopyright notice.
X
XCopyright (c) 1988, Bernd-Gunter Nitzler,
X	pyramid!actisb!bernd
X	unido!tub!actisb!bernd
X
X	A similar program was copyrighted before:
XCopyright (c) 1988, Jonathan Greenblatt,
X	<jonnyg@rover.umd.edu> (128.8.2.73)
X	<jonnyg@umd5.umd.edu> (128.8.10.5)
X	<pcproj@gymble.umd.edu> (128.8.128.16)
X
X	and changed by:
XMark Alexander <uunet!amdahl!drivax!alexande@umd5.UMD.EDU>
X
XThis program may be redistributed in source form,
Xprovided no fee is charged and this copyright notices are preserved.
X
XThis filter translates most of the control sequences of the
XNEC P5 printer and all graphics modes as well as the international
Xlanguage character sets and a part of the IBM character set.
X
XI post this version only as a beta test version, not as a final
Xrelease because I am out of town until 15th of June 1988 and I
Xlook forward to receive bug fixes and enhancements until then.
XAbout half of the control sequences I implemented were only
Xroughly tested, the graphics sequences were only tested in the
X8-pin part sinc I have no graphics program which can handle
X24-pin graphics.
X
XPlease mail any bug fixes and enhancements or comments to me
Xbecause our news system has an expire period of 4 to 7 days only
Xand all news messages will be deleted when I come back to the
Xoffice.
SHAR_EOF
if test 1859 -ne "`wc -c < 'README'`"
then
	echo shar: error transmitting "'README'" '(should have been 1859 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'defaults.h'" '(797 characters)'
if test -f 'defaults.h'
then
	echo shar: will not over-write existing file "'defaults.h'"
else
sed 's/^X//' << \SHAR_EOF > 'defaults.h'
X#define CR	0
X#define CRLF	1
X#define LF	2
X
X			/* Printer switch settings */
X
X#define LINESPACING	6	/* Line spacing default 6/8		*/
X#define PERFSKIP	0	/* 1-Inch perforation skip 0/1		*/
X#define FFLENGTH	72	/* Form feed length default 66/72	*/
X#define AUTOLF		1	/* Auto line feed when buffer full 0/1	*/
X#define LINEFEED	CRLF	/* Linefeed CRLF/LF			*/
X#define CARRIAGE	CR	/* Carriage return CR/CRLF		*/
X#define SHAPE0		0	/* Shape of the default 0 0/1		*/
X#define LEFTMARGIN	1	/* Left Margin for sheet feeder 1/35	*/
X#define COUNTRY		0	/* USA=0/France=1/Germany=2/England=3/
X				   Denmark I=4/Sweden=5/Italy=6/Spain=7/
X				   Japan=8/Norway=9/Denmark II=10/
X				   Netherlands=11			*/
X#define CHARSET		0	/* Character set default Italic/IBM 0/1	*/
X
X			/* Additional settings */
X
X#define	RIGHTMARGIN	78
SHAR_EOF
if test 797 -ne "`wc -c < 'defaults.h'`"
then
	echo shar: error transmitting "'defaults.h'" '(should have been 797 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'necp5.c'" '(18839 characters)'
if test -f 'necp5.c'
then
	echo shar: will not over-write existing file "'necp5.c'"
else
sed 's/^X//' << \SHAR_EOF > 'necp5.c'
X/*
X *		N E C - P 5     to     P o s t s c r i p t (TM)
X *
X *	Version 0.5		(not completely tested)
X *
X *	This is a filter to translate the ESC- and FS-sequences
X *	of the NEC P5 Series printer (and since this is a superset
X *	of the EPSON printer commands also EPSON and compatible
X *	printers) to Postscript.
X *
X *	It is very loosely based on the IBM Graphics printer to
X *	postscript translator posted a couple of weeks before to the
X *	net. That version was copyrighted by Jonathan Greenblatt and
X *	changed by Mark Alexander. Since I started from scratch and
X *	used only about 5% of the original code I include my own
X *	copyright notice.
X *
X *	Copyright (c) 1988, Bernd-Gunter Nitzler,
X *		pyramid!actisb!bernd
X *		unido!tub!actisb!bernd
X *
X *		A similar program was copyrighted before:
X *	Copyright (c) 1988, Jonathan Greenblatt,
X *		<jonnyg@rover.umd.edu> (128.8.2.73)
X *		<jonnyg@umd5.umd.edu> (128.8.10.5)
X *		<pcproj@gymble.umd.edu> (128.8.128.16)
X *
X *		and changed by:
X *	Mark Alexander <uunet!amdahl!drivax!alexande@umd5.UMD.EDU>
X *
X *      This program may be redistributed in source form,
X *      provided no fee is charged and this copyright notices are preserved.
X *
X *	This filter translates most of the control sequences of the
X *	NEC P5 printer and all graphics modes as well as the international
X *	language character sets and a part of the IBM character set.
X *
X */
X
X#include	<stdio.h>
X#include	"defaults.h"
X
X#define	MAXX	2880			/* X scaled to 360 points per inch */
X#define	MAXY	3960			/* Y scaled to 360 points per inch */
X
X#define	YANFANG	point_sizey
X#define	YENDE	MAXY
X
X#define get_pointx(cpi)	(360/(cpi))
X#define get_pointy(lpi)	(360/(lpi))
X#define	H_ENLARGE(x)	((x)*(horz_enlarge + 1))
X#define	V_ENLARGE(x)	((x)*(vert_enlarge + 1))
X
XFILE	*file;
Xchar	*filename;
X
Xint	eof = 0;
X
X#define	NUM_TABS	32
Xint tabs[NUM_TABS+1];
Xint tabindex;
X
X#define	NUM_VTABS	16
Xint vtabs[NUM_VTABS+1];
Xint vtabindex;
X
X#define SPC	1000
X
X		/* Language Character Sets and Paranthesis */
X
Xchar	*language[12][14] = {
X
X	/*  0x23,   0x24,   0x28,    0x29,   0x40,   0x5b,   0x5c,   0x5d,
X	       0x5e,   0x60,   0x7b,   0x7c,   0x7d,   0x7e  */
X
X	{    "#",    "$",  "\\(",   "\\)",    "@",    "[", "\\\\",    "]",
X		"^",    "`",    "{",    "|",    "}",    "~"},
X
X	{    "#",    "$",  "\\(",   "\\)","\\326","\\312","\\300","\\247",
X		"^",    "`","\\323","\\324","\\332","\\310"},
X
X	{    "#",    "$",  "\\(",   "\\)","\\247","\\276","\\311","\\321",
X		"^",    "`","\\325","\\327","\\333","\\373"},
X
X	{"\\243",    "$",  "\\(",   "\\)",    "@",    "[", "\\\\",    "]",
X		"^",    "`",    "{",    "|",    "}",    "~"},
X
X	{    "#",    "$",  "\\(",   "\\)",    "@","\\341","\\351","\\322",
X		"^",    "`","\\361","\\371","\\334",    "~"},
X
X	{    "#","\\250",  "\\(",   "\\)","\\265","\\276","\\311","\\322",
X		"\\321","\\323","\\325","\\327","\\334","\\333"},
X
X	{    "#",    "$",  "\\(",   "\\)",    "@","\\312", "\\\\","\\323",
X		"^","\\324","\\260","\\330","\\332","\\241"},
X
X	{    "#",    "$",  "\\(",   "\\)",    "@","\\241","\\314","\\277",
X		"^",    "`","\\310","\\331",    "}",    "~"},
X
X	{    "#",    "$",  "\\(",   "\\)",    "@",    "[","\\245",    "]",
X		"^",    "`",    "{",    "|",    "}",    "~"},
X
X	{    "#","\\250",  "\\(",   "\\)","\\265","\\341","\\351","\\322",
X		"\\321","\\323","\\361","\\371","\\334","\\333"},
X
X	{    "#",    "$",  "\\(",   "\\)","\\265","\\341","\\351","\\322",
X		"\\321","\\323","\\361","\\371","\\334","\\333"},
X
X	{"\\243",    "$",  "\\(",   "\\)",    "@",    "[", "\\\\",    "]",
X		"^",    "`",    "{",    "|",    "}",    "~"}};
X
Xint charset[256] = {
X	     0,     0,     0,     0,     0,     0,     0,     0,
X	     0,     0,     0,     0,     0,     0,     0,     0,
X	     0,     0,     0,     0,     0,'\247',     0,     0,
X	     0,     0,     0,     0,     0,     0,     0,     0,
X	   ' ',   '!',  '\"', SPC+0, SPC+1,   '%',   '&',  '\'',
X	 SPC+2, SPC+3,   '*',   '+',   ',',   '-',   '.',   '/',
X	   '0',   '1',   '2',   '3',   '4',   '5',   '6',   '7',
X	   '8',   '9',   ':',   ';',   '<',   '=',   '>',   '?',
X	 SPC+4,   'A',   'B',   'C',   'D',   'E',   'F',   'G',
X	   'H',   'I',   'J',   'K',   'L',   'M',   'N',   'O',
X	   'P',   'Q',   'R',   'S',   'T',   'U',   'V',   'W',
X	   'X',   'Y',   'Z', SPC+5, SPC+6, SPC+7, SPC+8,   '_',
X	 SPC+9,   'a',   'b',   'c',   'd',   'e',   'f',   'g',
X	   'h',   'i',   'j',   'k',   'l',   'm',   'n',   'o',
X	   'p',   'q',   'r',   's',   't',   'u',   'v',   'w',
X	   'x',   'y',   'z',SPC+10,SPC+11,SPC+12,SPC+13,     0,
X	'\335','\333','\323','\336','\325','\260','\334','\300',
X	'\337','\340','\332','\342','\344','\345','\276','\322',
X	'\265','\361','\341','\346','\327','\330','\347','\324',
X	'\354','\311','\321','\242','\243','\245',   'P','\246',
X	'\355','\356','\357','\360','\331','\314','\343','\353',
X	'\277',   ' ',   ' ',   ' ',   ' ','\241','\253','\273',
X	   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',
X	   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',
X	   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',
X	   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',
X	   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',
X	   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',
X	   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',
X	   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',
X	   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',
X	   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' '};
X
Xint	graphic_dpi[32] = { 60, 120, 120, 240, 80, 0, 90, 180 };
X
Xint	gmodeK = 0;
Xint	gmodeL = 1;
Xint	gmodeY = 2;
Xint	gmodeZ = 3;
X
Xshort	repeatbuf[2048];
X
Xenum	{normal,bold,doublenorm,doublebold,
X	italicnorm,italicbold,doubleinorm,doubleibold}	font_type;
X
Xstruct font {
X	char	*odescr;
X	char	*descr;
X	char	*name;
X	int	pointx;
X	int	pointy;
X	} fonts[] = {
X	{"Courier",		"LCourier",	"normal",	10,	6},
X	{"Courier-Bold",	"LCourier-B",	"bold",		10,	6},
X	{"Courier",		"LCourier",	"doublenorm",	5,	6},
X	{"Courier-Bold",	"LCourier-B",	"doublebold",	5,	6},
X	{"Courier-Oblique",	"LCourier-O",	"italicnorm",	10,	6},
X	{"Courier-BoldOblique",	"LCourier-BO",	"italicbold",	10,	6},
X	{"Courier-Oblique",	"LCourier-O",	"doubleinorm",	5,	6},
X	{"Courier-BoldOblique",	"LCourier-BO",	"doubleibold",	5,	6}
X};
X
Xint	cx;
Xint	cy;
Xint	point_sizex;
Xint	point_sizey;
Xint	ulpositionx;
X
Xint	line_space = LINESPACING;
Xint	vert_enlarge = 0;
Xint	horz_enlarge = 0;
Xint	intext = 0;
Xint	underline = 0;
Xint	subscript =  0;
Xint	doublewidth = 0;
Xint	highlight = 0;
Xint	emphasize = 0;
Xint	italic = 0;
Xint	italic_char = 0;
Xint	linefeed = 0;
Xint	curlang = COUNTRY;
Xint	lftype = LINEFEED;
Xint	crtype = CARRIAGE;
Xint	left_margin = LEFTMARGIN-1;
Xint	right_margin = RIGHTMARGIN-1;
Xint	page = 0;
Xint	repeatsw = 0;
Xint	repeatcnt = 0;
Xint	repeatidx = 0;
Xint	repeatmax = 0;
Xint	control8 = 0;
Xint	bit8 = 0;
Xint	italic_ibm = CHARSET;
X
Xdefine_font(f,def)
Xstruct font	*f;
Xint		def;
X{
X	int	s;
X
X	s = get_pointx(f->pointx)*10;
X	if (def)
X		printf("/%s /%s langvec Lang\n",f->odescr,f->descr);
X	printf("/%s {/%s findfont [%d 0 0 -%d 0 -8] makefont setfont} def\n",
X		f->name,f->descr,s/6,get_pointy(f->pointy));
X}
X
Xnew_page()
X{
X	cx = H_ENLARGE(left_margin * point_sizex);
X	cy = YANFANG;
X	page++;
X	printf("%%%%Page: %d %d\n",page,page);
X	printf("gsave\n");
X}
X
Xset_font()
X{
X	int	boldface;
X
X	boldface = highlight || emphasize;
X	if (doublewidth) {
X		if (italic || italic_char)
X			font_type = boldface ? doubleibold : doubleinorm;
X		else
X			font_type = boldface ? doublebold : doublenorm;
X	} else {
X		if (italic || italic_char)
X			font_type = boldface ? italicbold : italicnorm;
X		else
X			font_type = boldface ? bold: normal;
X	}
X	point_sizex = get_pointx(fonts[(int)font_type].pointx);
X	point_sizey = get_pointy(fonts[(int)font_type].pointy);
X	printf("%s\n",fonts[(int)font_type].name);
X}
X
Xeject_page()
X{
X	printf("showpage grestore\n");
X	new_page();
X}
X
Xcheck_page()
X{
X	int oldcy;
X
X	if (cy > YENDE) {
X/*		oldcy = cy;	*/
X		eject_page();
X/*		cy = oldcy - YENDE;	*/
X	} else if (cy < YANFANG)
X		cy = YANFANG;
X
X}
X		
Xinit_printer()
X{
X	line_space = get_pointy(fonts[(int)normal].pointy);
X	printf("%%!PS-Adobe-1.0\n");
X	printf("%%%%DocumentFonts: (atend)\n");
X	printf("%%%%Title: %s\n",filename);
X	printf("%%%%Creator: %s\n",getenv("USER"));
X	printf("%%%%Pages: (atend)\n");
X	printf("%%%%EndComments\n");
X	printf("/m {moveto} def\n");
X	printf("/s {show} def\n");
X	printf("/ul {1 index m lineto stroke} def\n");
X	printf("/langdict 12 dict def\n");
X	printf("/Lang {langdict begin /codes exch def /newfont exch def /basefont exch def\n");
X	printf(" /basedict basefont findfont def /newdict basedict maxlength dict def\n");
X	printf(" basedict {exch dup /FID ne {dup /Encoding eq {exch dup length array copy\n");
X	printf("    newdict 3 1 roll put} {exch newdict 3 1 roll put} ifelse} {pop pop}\n");
X	printf("  ifelse} forall newdict /FontName newfont put codes aload pop\n");
X	printf(" codes length 2 idiv {newdict /Encoding get 3 1 roll put} repeat\n");
X	printf(" newfont newdict definefont pop end} def\n");
X	printf("/langvec [8#260 /agrave 8#265 /Eacute 8#276 /Adieresis 8#300 /ccedilla\n");
X	printf(" 8#311 /Odieresis 8#314 /Ntilde 8#321 /Udieresis 8#322 /Aring 8#323 /eacute\n");
X	printf(" 8#324 /ugrave 8#325 /adieresis 8#326 /agrave 8#327 /odieresis 8#330 /ograve\n");
X	printf(" 8#331 /ntilde 8#332 /egrave 8#333 /udieresis 8#334 /aring\n");
X	printf(" 8#335 /Ccedilla 8#336 /acircumflex 8#337 /ecircumflex 8#340 /edieresis\n");
X	printf(" 8#342 /idieresis 8#344 /icircumflex 8#345 /igrave 8#346 /ocircumflex\n");
X	printf(" 8#347 /ucircumflex 8#354 /ydieresis 8#355 /aacute 8#356 /iacute\n");
X	printf(" 8#357 /oacute 8#360 /uacute] def\n");
X	printf("clippath pathbbox exch pop exch pop translate\n");
X	printf("0.2 -0.2 scale\n");
X	printf("1 setlinejoin 1 setlinecap 1 setlinewidth\n");
X	printf("newpath\n");
X
X	/* Define the normal-width fonts. */
X	define_font(&fonts[(int)normal],1);
X	define_font(&fonts[(int)bold],1);
X	define_font(&fonts[(int)italicnorm],1);
X	define_font(&fonts[(int)italicbold],1);
X
X	/* Define the double-width fonts. */
X	define_font(&fonts[(int)doublenorm],0);
X	define_font(&fonts[(int)doublebold],0);
X	define_font(&fonts[(int)doubleinorm],0);
X	define_font(&fonts[(int)doubleibold],0);
X	font_type = normal;
X	set_font();
X	printf("%%%%EndProlog\n");
X	new_page();
X}
X
Xnewline()
X{
X	if (linefeed)
X	    cy -= V_ENLARGE(line_space);
X	else
X	    cy += V_ENLARGE(line_space);
X	check_page();
X}
X
Xstop_underline()
X{
X	if (underline)
X		printf("%d %d %d ul\n",cx-1,cy+8,ulpositionx);
X}
X
Xend_underline()
X{
X	stop_underline();
X	underline = 0;
X}
X
Xend_text()
X{
X	if (intext) {
X		if (subscript || vert_enlarge || horz_enlarge)
X			printf(") s grestore\n");
X		else
X			printf(") s\n");
X		intext = 0;
X	}
X}
X
Xint eofgetc()
X{
X	int	c;
X
X	if (repeatsw == 2) {	/* Do repeat */
X		do {
X			if (repeatidx < repeatmax)
X				return(repeatbuf[repeatidx++]);
X			repeatidx = 0;
X		} while (--repeatcnt);
X		repeatsw = 0;
X	}
X	if (eof || (c = getc(file)) == EOF) {
X		eof = 1;
X		c = '\0';
X	}
X	if (control8)
X		c = c & 0x7f | bit8;
X	if (repeatsw == 1 && repeatmax < sizeof(repeatbuf))
X		repeatbuf[repeatmax++] = c;
X	return(c);
X}
X
Xdographic(mode)
Xint	mode;
X{
X	int	n1, n2, c;
X	int	px, pins;
X
X	end_underline();
X	if (mode < 32) {		/* For 24 Pin Printers */
X		pins = 8;
X		px = graphic_dpi[mode];
X	} else {
X		pins = 24;
X		if (mode < 60) {
X			mode -= 32;
X			px = graphic_dpi[mode];
X		} else
X			px = mode;
X	}
X	if (px == 0)
X		fprintf(stderr,"Unknown graphic mode: %d\n",mode);
X	n1 = eofgetc();
X	n2 = eofgetc();
X	n1 = n2 * 256 + n1;
X#ifdef TRACE
Xfprintf(stderr,"Graphic: mode=%d n=%d\n",mode,n1);
X#endif
X	if (n1) {
X		printf("gsave %d %d translate %d %d scale\n",
X			cx,cy,get_pointx(px)*8,48);
X		printf("%d %d true [ 0 %d %d 0 %d 0 ] { <\n",pins,n1,
X			pins,pins,pins);
X		if (pins == 24)
X			n1 *= 3;
X		n2 = 0;
X		while (n1-- && !eof)
X			printf("%02x%c",eofgetc(),++n2 & 15 ? ' ' : '\n');
X		printf("> } imagemask grestore\n");
X	}
X}
X
Xdoescape()
X{
X	int	c;
X	int	mode;
X
X	c = eofgetc();
X#ifdef TRACE
Xfprintf(stderr,"Escape: %c\n",c);
X#endif
X	switch (c) {
X	case '#':
X		control8 = 0;
X		break;
X	case '*':
X		mode = eofgetc();
X		if (!eof)
X			dographic(mode);
X		break;
X	case '-':
X		c = eofgetc();
X		if (c == '\0' && underline) {
X			end_underline();
X			underline = 0;
X		} else if (c == '\1') {
X			underline = 1;
X			ulpositionx = cx;
X		}
X		break;
X	case '0':	/* set line spacing to 1/8 inch	*/
X		line_space = get_pointy(8);
X		break;
X	case '1':
X		c = eofgetc();
X		if (H_ENLARGE(c * point_sizex) < MAXX)
X			left_margin = c;
X		break;
X	case '2':	/* set line spacing to 1/6 inch	*/
X		line_space = get_pointy(6);
X		break;
X	case '3':
X		c = eofgetc();
X		line_space = c*2;
X		break;
X	case '4':
X		italic = 1;
X		italic_char = 0;
X		set_font();
X		break;
X	case '5':
X		italic = 0;
X		italic_char = 0;
X		set_font();
X		break;
X	case '<':		/* Print Head to Left Margin */
X		break;
X	case '=':
X		control8 = 1;
X		bit8 = 0x00;
X		break;
X	case '>':
X		control8 = 1;
X		bit8 = 0x80;
X		break;
X	case '?':
X		c = eofgetc();
X		mode = eofgetc();
X		switch (c) {
X		case 'K':
X			gmodeK = mode;
X			break;
X		case 'L':
X			gmodeL = mode;
X			break;
X		case 'Y':
X			gmodeY = mode;
X			break;
X		case 'Z':
X			gmodeZ = mode;
X			break;
X		default:
X			fprintf(stderr,"Unknown Graphic Control: 0x%02x\n",c);
X			break;
X		}
X		break;
X	case 'A':
X		c = eofgetc();
X		line_space = c*5;
X		break;
X	case 'B':
X		vtabindex = 0;
X		while (c = eofgetc())
X			if (vtabindex < NUM_TABS)
X				vtabs[vtabindex++] = c;
X		vtabs[vtabindex] = 0;
X		break;
X	case 'D':
X		tabindex = 0;
X		while (c = eofgetc())
X			if (tabindex < NUM_TABS)
X				tabs[tabindex++] = c;
X		tabs[tabindex] = 0;
X		break;
X	case 'E':
X		emphasize = 1;
X		set_font();
X		break;
X	case 'F':
X		emphasize = 0;
X		set_font();
X		break;
X	case 'G':
X		highlight = 1;
X		set_font();
X		break;
X	case 'H':
X		highlight = 0;
X		set_font();
X		break;
X	case 'J':
X		stop_underline();
X		c = eofgetc();
X		cy += c*2;
X		check_page();
X		ulpositionx = cx;
X		break;
X	case 'K':
X		dographic(gmodeK);
X		break;
X	case 'L':
X		dographic(gmodeL);
X		break;
X	case 'M':
X		point_sizex = get_pointx(12);
X		break;
X	case 'P':
X		point_sizex = get_pointx(10);
X		break;
X	case 'Q':
X		c = eofgetc();
X		if (H_ENLARGE(c * point_sizex) < MAXX)
X			right_margin = c;
X		break;
X	case 'R':
X		c = eofgetc();
X		if (c < 12)	curlang = c;
X		break;
X	case 'S':
X		c = eofgetc();
X		if (c == '\0')	subscript = 2;
X		else if (c == '\1')	subscript = 1;
X		break;
X	case 'T':
X		subscript = 0;
X		break;
X	case 'U':		/* Uni/Bidirectional printing */
X		c = eofgetc();
X		break;
X	case 'V':
X		c = eofgetc();
X		if (c) {
X			repeatsw = 1;
X			repeatcnt = c;
X			repeatmax = 0;
X		} else if (--repeatcnt) {
X			repeatsw = 2;
X			repeatidx = 0;
X			repeatmax -= 3;	/* forget repeat end */
X		} else
X			repeatsw = 0;
X		break;
X	case 'W':
X		c = eofgetc();
X		if (c == '\0')	doublewidth = 0;
X		else if (c == '\1')	doublewidth = 1;
X		set_font();
X		break;
X	case 'Y':
X		dographic(gmodeY);
X		break;
X	case 'Z':
X		dographic(gmodeZ);
X		break;
X	case 'f':
X		stop_underline();
X		c = eofgetc();
X		if (c == 0) {		/* Print head move */
X			c = eofgetc();
X			cx += H_ENLARGE(get_pointx(c));
X		} else {		/* Paper advance */
X			c = eofgetc();
X			cy += get_pointy(c);
X			check_page();
X		}
X		ulpositionx = cx;
X		break;
X	case 'j':
X		stop_underline();
X		c = eofgetc();
X		cy -= c*2;
X		check_page();
X		ulpositionx = cx;
X		break;
X	case 's':		/* Half Speed Printing */
X		c = eofgetc();
X		break;
X	default:
X		end_underline();
X		fprintf(stderr,"Unknown sequence: ESC 0x%x\n",c);
X		break;
X	}
X}
X
Xdoformsep()
X{
X	int	c;
X
X	c = eofgetc();
X#ifdef TRACE
Xfprintf(stderr,"Form Sep: %c\n",c);
X#endif
X	switch (c) {
X	case '3':
X		c = eofgetc();
X		line_space = c;
X		break;
X	case 'E':
X		c = eofgetc();
X		horz_enlarge = c;
X		break;
X	case 'F':
X		linefeed = 0;	/* forward */
X		break;
X	case 'I':
X		c = eofgetc();
X		italic_ibm = c;
X		break;
X	case 'R':
X		linefeed = 1;	/* reverse */
X		break;
X	case 'V':
X		c = eofgetc();
X		vert_enlarge = c;
X		break;
X	case 'Z':
X		dographic(360);
X		break;
X	default:
X		end_underline();
X		fprintf(stderr,"Unknown sequence: FS 0x%x\n",c);
X		break;
X	}
X}
X
Xdochar()
X{
X	int	c;
X
X	c = eofgetc();
X#ifdef TRACE
Xfprintf(stderr,"Character: 0x%02x\n",c);
X#endif
X	if (!italic_ibm &&
X	    (italic_char && (c & 0x80) == 0 || !italic_char && (c & 0x80))) {
X		end_text();
X		italic_char = !italic_char;
X		set_font();
X	} else if (charset[c] == 0)
X		end_text();
X	if (italic_char)
X		c &= 0x7f;
X	switch (c) {
X	case '\000':
X	case '\032':
X	case '\177':
X		break;
X	case '\010':
X		if (cx > H_ENLARGE(left_margin * point_sizex))
X			cx -= H_ENLARGE(point_sizex);
X		break;
X	case '\011':
X		{
X			int i,l;
X
X			l = cx / H_ENLARGE(point_sizex);
X			for (i = 0; i < NUM_TABS && tabs[i] && tabs[i] <= l; i++) ;
X			cx = H_ENLARGE(tabs[i] * point_sizex);
X		}
X		break;
X	case '\014':
X		stop_underline();
X		eject_page();
X		ulpositionx = cx;
X		break;
X	case '\033':
X		doescape();
X		break;
X	case '\034':
X		doformsep();
X		break;
X	case '\n':
X		stop_underline();
X		newline();
X		if (lftype == CRLF)
X			cx = H_ENLARGE(left_margin * point_sizex);
X		ulpositionx = cx;
X		break;
X	case '\r':
X		stop_underline();
X		cx = H_ENLARGE(left_margin * point_sizex);
X		if (crtype == CRLF)
X			newline();
X		ulpositionx = cx;
X		break;
X	default:
X		if (cx > MAXX || cx > H_ENLARGE((right_margin - 1) * point_sizex)) {
X			end_text();
X			cx = H_ENLARGE(left_margin * point_sizex);
X			newline();
X		}
X		if (!intext) {
X			switch (subscript) {
X			case 0:
X				if (vert_enlarge || horz_enlarge)
X					printf("%d %d m gsave %d %d scale (",
X						cx,cy+point_sizey*vert_enlarge,
X						horz_enlarge+1,vert_enlarge+1);
X				else
X					printf("%d %d m (",cx,cy);
X				break;
X			case 1:			/* Subscript */
X				printf("%d %d m gsave %d %f scale (",
X					cx,cy+point_sizey*vert_enlarge,
X					horz_enlarge+1,(double)((vert_enlarge+1)*0.5));
X				break;
X			case 2:			/* Superscript */
X				printf("%d %d m gsave %d %f scale (",
X					cx,cy-point_sizey/2+point_sizey*vert_enlarge,
X					horz_enlarge+1,(double)((vert_enlarge+1)*0.5));
X				break;
X			}
X			intext = 1;
X		}
X		if (c >= ' ' && c <= 255) {
X			c = charset[c];
X			if (c >= SPC)
X				printf(language[curlang][c-SPC]);
X			else if (c) {
X				if (c & 0x80)
X					printf("\\%3o",c & 0xff);
X				else
X					putchar(c);
X			} else
X				putchar(' ');
X		} else
X			fprintf(stderr,"Unknown control: 0x%02x\n",c);
X		cx += H_ENLARGE(point_sizex);
X		break;
X	}
X}
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X	int i;
X
X	if (argc > 2) {
X		fprintf(stderr,"Usage: %s [file]\n",argv[0]);
X		exit(1);
X	}
X	if (argc == 2) {
X		if ((file = fopen(argv[1],"r")) == NULL) {
X			fprintf(stderr,"%s: Unable to open %s\n",argv[0],argv[1]);
X			exit(2);
X		}
X		filename = argv[1];
X	} else {
X		file = stdin;
X		filename = "(STDIN)";
X	}
X	init_printer();
X	do {
X		dochar();
X	} while (!eof);
X	end_text();
X	if (cx > H_ENLARGE(left_margin * point_sizex) || cy > YANFANG)
X		printf("showpage grestore\n");
X	printf("%%%%Trailer\n");
X	printf("%%%%DocumentFonts: ");
X	for (i = 2;i < 6;i++)
X		printf("%s ",fonts[i].odescr);
X	printf("\n%%%%Pages: %d\n",page);
X	exit(0);
X}
SHAR_EOF
if test 18839 -ne "`wc -c < 'necp5.c'`"
then
	echo shar: error transmitting "'necp5.c'" '(should have been 18839 characters)'
fi
fi # end of overwriting check
#	End of shell archive
exit 0
--
Bernd-Gunter Nitzler                    VoiceNet: 49 / (30) 88 43 01-31
ACTIS in Berlin GmbH                    UUCP: mcvax!unido!tub!actisb!bernd
Kurfuerstendamm 65                            uunet/         /
D-1000 Berlin 15                                     pyramid/
W. Germany