Source file: /~heha/hs/dos/hp2xx_hs.zip/hp2xx.c

/** hp2xx : A converter of HPGL files into popular raster and vector formats
 **
 **	xx =  mf (MetaFont), eps (PostScript), pcl (HP-PCL Level3),
 **	      pre(view), pcx (PaintBrush-Format), img (GEM),
 **	      pic (ATARI bitmap), pbm (Portable Bitmap), ...
 **
 ** (c) 1992, 1993  Heinz W. Werntges and the HP2xx team
 **
 ** Author:
 **
 **	HWW	Heinz W. Werntges  (werntges@convex.rz.uni-duesseldorf.de)
 **		Fruchtstr. 2,  40223 Duesseldorf, Germany
 **
 ** New maintainer since version 3.3 and (c) 1999:
 **     MK      Dr. Martin Kroeker (mk@daveg.com, 
 **                                 martin@ruby.chemie.uni-freiburg.de)
 **             Zum Markwald 6, D-63165 Muehlheim, Germany                    
 **
 ** Amiga stuff & PBM & ILBM by:
 **
 **	CHL	Claus H. Langhans (Claus_Langhans@wildcat.fido.de)
 **		Unter den Nussbaeumen 19, 65779 Kelkheim (Ts.), Germany
 **
 **
 ** Atari stuff & IMG by:
 **
 **	NM	Norbert Meyer (sorry - no email)
 **		Reinhold-Schneider-Str. 83, 40595 Duesseldorf
 **
 **	AS	Andreas Schwab (schwab@ls5.informatik.uni-dortmund.de)
 **
 **	JE	Joern Eggers (II040EG@DTHAC11.bitnet)
 **
 ** OS/2 Full-Screen previewer by:
 **
 **	HSz	Host Szillat (szillat@iaas-berlin.d400.de)
 **
 ** X11 previewer by:
 **
 **	MSch	Michael Schoene (michael@nero.uni-bonn.de)
 **		Karolinger Str. 81,  40223 Duesseldorf, Germany
 **
 **
 ** Many thanks to all the other fine people who supported HP2xx by testing,
 ** correcting, porting, suggesting improvements, and otherwise spending
 ** their time on HP2xx, especially:
 **
 ** -- Michael Schmitz
 **  & Gerhard Steger 	 for their invaluable help with VAX/VMS,
 ** -- Juergen Gross     for access to a HP 9000 machine
 ** -- Roland Emmerich   for proofreading, beta-testing, and his HGC support
 ** -- Jon Gillian       for valuable suggestions
 ** -- Lawrence Lowe     for various improvements and contributions
 **-------------------------------------------------------------------------
 **/

/** hp2xx.c:
 **
 ** 91/01/12  V 1.00  HWW  PC version
 ** 91/01/17  V 1.01  HWW  Disk swapping added
 ** 91/01/19  V 1.02  HWW  Reorganized: mf mode revived, pcx mode added
 ** 91/01/29  V 1.03  HWW  SUN portation; HP-specials added
 ** 91/01/31  V 1.04  HWW  (-F) FF added
 ** 91/02/01  V 1.05  HWW  Flag -S added (Deskjet specials)
 ** 91/02/15  V 1.06  HWW  stdlib.h & VAX_C supported
 ** 91/02/19  V 2.01  HWW  file unchanged, but new package release!
 ** 91/06/09  V 2.10  HWW  (beta) More options; options x & y changed to o & O
 ** 91/06/15  V 2.11  HWW  (beta) VGA option added; PCX bug (on SUN) removed
 ** 91/06/20  V 2.12  HWW  Rotate (-r) option & Copyright added
 ** 91/06/20  V 2.12b HWW  Minor reformatting
 ** 91/06/29  V 2.13a HWW  PostScript support
 ** 91/08/28  V 2.14  HWW  ATARI 32K format added (prelim.)
 ** 91/10/15  V 2.14c HWW  atari & stad formats; hwtools.h eliminated
 ** 91/10/20  V 2.14d HWW  ATARI-->pic (packing removed)
 ** 91/10/24  V 2.15  HWW  ATARI-->pic stable now; "LT;" & "LT0;" supported
 ** 91/11/22  V 2.16b HWW  "SPn;" support
 ** 92/01/12  V 2.17  HWW  HPGL scanner improved, to_ps() debugged, ps --> eps,
 **			  More portabel code (ATARI acknowledged)
 ** 92/02/06  V 2.18e HWW  Better parser, IMG & various previews supported,
 **			  preview control via -h, -w; -W removed!
 ** 92/02/21  V 2.19d HWW  LB etc. supported, PG; (option -P) added
 ** 92/03/03  V 2.20c HWW  Modes added: -m epic,em,pac(ATARI) / LB bugs fixed
 ** 92/04/15  V 2.20d HWW  Width & height treated symmetrically now
 ** 92/04/28  V 2.20e HWW  -m pre: -d, -D effective again, default 75; PBM added
 ** 92/05/02  V 2.21a HWW  -m pre is default now. New opt: -l logfile
 ** 92/05/19  V 3.00c HWW  Color support (VGA preview), multiple input files
 ** 92/05/25  V 3.00f HWW  Color support (more modes)
 ** 92/06/09  V 3.01d HWW  XT,YT,TL,SM supported; ATARI update acknowledged;
 **			   Mode list added for easier expansion; debugged
 ** 92/10/20  V 3.02a HWW  LT now fully supported
 ** 92/11/08  V 3.02b HWW  Page range allowed
 ** 92/12/10  V 3.02c HWW  Mode "cad" added; DJ version: bug fix extended;
 ** 92/12/12  V 3.02d HWW  2 bug fixes for option -f
 ** 92/12/16  V 3.03a HWW  Option -t (+truesize) added
 ** 92/12/27  V 3.03b HWW  -S int (for Deskjet color support)
 ** 93/01/02  V 3.10a HWW  Source brushed up; ready for distribution
 ** 93/02/08  V 3.12a HWW  Support of Joern Eggers' cs mode added (ATARI only)
 **			   HAS_X11, HAS_SUNVIEW: added/modified
 ** 93/04/13  V 3.12b HWW  UC added (A. Treindl), small changes; CMYK added,
 **			   New previewer selection scheme // NEW RELEASE 3.1.2
 ** 93/04/25  V 3.12c HWW  Minor bug fixes (to_pcl.c, hpgl.c / Eric)
 ** 93/05/20  V 3.12d HWW  LT1 adjustment; '--version' option added (GNU std)
 ** 93/07/20  V 3.12e HWW  SilentWait() modified (UNIX) according to A. Bagge,
 **			   new OS/2 previewer by HSz, TIFF compression for PCL mode
 ** 93/09/03  V 3.13a HWW  Wait() renamed to NormalWait() (name collision on VAX),
 **			   Option -P : Option parser modified; -m hpgl added
 ** 93/09/22  V 3.13b HWW  Fix in autoset_outfile_name()
 ** 94/01/01  V 3.14a HWW  Additions by L. Lowe
 ** 94/02/14  V 3.20b HWW  Re-structured to facilitate multiple user interfaces
 ** Separate additions to HWW's V 3.20, assembled in this release  by MK:
 ** 94/03/23          EB   Mode "gpt", Gnuplot, added by Emmanuel Bigler
 ** 94/08/08          IMP  Mode "xfig" added by Ian MacPhedran
 ** 97/11/29          MS   Mode "png" added by Michael Schmitz
 ** 99/09/01  V 3.30a MK   CA,CS,IW,SA,SS,NP,PC,PW,PE and charsets1-8 added
 ** 99/09/12  V3.30a2 MK   RO,PS,EW added, bugfixes for IW,PC,PW,EA
 ** 99/10/01  V 3.30  MK   RO/PS changes
 ** 99/12/01  V 3.31  MK   fixes for RO,PS,LB,DI,DR, completed PE 
 ** 00/02/06          MK   fixes for scaling and PE; allow overriding of PC/PW
 ** 00/02/12  V 3.32  MK   Mode "tiff" added by M.Liberi (changed to use ZIP
 **                        instead of patented LZW compression; needs libtiff)
 ** 00/02/26          MK   Mode "escp" (Epson Esc/P2 printer language)
 **/

char	*VERS_NO = "3.4.0";
char	*VERS_DATE = "01/02/09";
char	*VERS_COPYRIGHT = "(c) 1991 - 1994 (V3.20) Heinz W. Werntges";
#if defined(AMIGA)
char	*VERS_ADDITIONS =
	"\tAmiga additions (V 2.00) by Claus Langhans (92/12/16)\n";
#elif defined (ATARI)
char	*VERS_ADDITIONS =
	"\tAtari additions (V 2.10) by N. Meyer / J. Eggers / A. Schwab  (93/01/xx)\n";
#else
char	*VERS_ADDITIONS = "                              (c) 1999 - 2001 Martin Kroeker\n";
#endif


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "bresnham.h"
#include "pendef.h"
#include "hp2xx.h"



/**
 ** When adding your special mode, add a line here.
 ** Please note the alphabetical order (and keep it).
 ** Also see the definition of "hp2xx_mode" in hp2xx.h.
 **/

mode_list  ModeList[] =
{
	{XX_CAD,	"cad"},	/* LaTeX: TeXcad compatible output	*/
#ifdef	ATARI
	{XX_CS,		"cs"},	/* LaTeX using \special{...} for C. Strunk's TeX	*/
#endif
	{XX_EM,		"em"},	/* LaTeX using \special{em:...}		*/
	{XX_EPIC,	"epic"},/* LaTeX using epic.sty macros		*/
	{XX_EPS,	"eps"},	/* Encapulated PostScript		*/
	{XX_FIG,        "fig"}, /* FIG 3.1 Drawing Files                */
	{XX_GPT,        "gpt"}, /* gnuplot vector ascii format          */
	{XX_HPGL,	"hpgl"},/* Simplified HP-GL			*/
#ifdef	AMIGA
	{XX_ILBM,	"ilbm"},/* Special AMIGA format			*/
#endif
	{XX_IMG,	"img"},	/* Digital Research IMG raster format	*/
	{XX_MF,		"mf"},	/* Metafont source output		*/
	{XX_PBM,	"pbm"},	/* Portable Bitmap			*/
	{XX_PCL,	"pcl"},	/* HP-PCL Level 5 printer code		*/
	{XX_PCX,	"pcx"},	/* Paintbrush's PCX raster format	*/
#ifdef	PIC_PAC
	{XX_PAC,	"pac"},	/* for ATARI, e.g. used by StaD		*/
	{XX_PIC,	"pic"},	/* for ATARI. Try to replace by IMG	*/
#endif
	{XX_RGIP,	"rgip"},/* Uniplex RGIP vector format		*/
#ifdef PNG
        {XX_PNG,        "png"}, /* Portable Network Graphics            */
#endif
	{XX_PRE,	"pre"},	/* DEFAULT: Preview on screen		*/
#ifdef TIF
        {XX_TIFF,        "tiff"}, /* Tagged image file format            */
#endif
#ifdef EPSON
	{XX_ESC2,	"esc2"}, /* Epson Esc/P2 printer language       */
#endif
	{XX_TERM,	""},	/* Dummy: List terminator		*/
};



void	print_supported_modes(void)
{
int	i;

  Eprintf ("%s", ModeList[0].modestr);
  for (i=1; ModeList[i].mode != XX_TERM; i++)
	Eprintf (",%s", ModeList[i].modestr);
  Eprintf ("\n");
}




void	Send_version(void)
{
  Eprintf ("\n%s\tV %s  (%s)   %s\n%s",
	"HP2xx:\tA HPGL converter (xx = mf, eps, pcl, pcx, img ...)\n",
	VERS_NO, VERS_DATE, VERS_COPYRIGHT, VERS_ADDITIONS);
#ifdef WIN32
  Eprintf("Win32 version\n");
#endif
}



void	usage_msg (const GEN_PAR *pg, const IN_PAR *pi, const OUT_PAR *po)
{
if (pg->quiet)
	return;

Send_version();

#ifdef ATARI
  Eprintf ("Usage:\tdouble-click on HP2XX.TTP, type parameters into\n");
  Eprintf ("\tcommand-line with following syntax:\n");
  Eprintf ("\t[options] [hpglfile]\n");
  Eprintf ("\n\t(if command-line offers not enough space for all parameters\n");
  Eprintf ("\tuse a command-line interpreter for starting HP2xx)\n");
#else
  Eprintf ("Usage:\thp2xx [options] [file1 [file2 ...]]\n");
#endif	/* ATARI */

  Eprintf ("\tUnix: Filter usage (.. | hp2xx -q -f- [options] | ..) ok\n");
NormalWait();

  Eprintf ("\nOpt fmt   defaults\tComment:\n");
  Eprintf (
"---------------------------------------------------------------------------\n");
  Eprintf ("-m strg   %s\t\tMode. Valid mode strings are:\n\t\t\t", pg->mode);
print_supported_modes();
  
  Eprintf ("-n        %s\t\tno filling of polygons (ignore FP commands)\n",
  	FLAGSTATE(pg->nofill));
  
  Eprintf ("-f strg   (auto gen.)\tName of output file ('-' = to stdout)\n");
  Eprintf ("-l strg   (stderr)\tName of log file\n");
  Eprintf ("-p strg   %d%d%d%d%d%d%d%d\tPensize(s) (in 1/10 mm (mf,ps) or dots (rest)).\n",
	pt.width[1], pt.width[2], pt.width[3], pt.width[4],
	pt.width[5], pt.width[6], pt.width[7], pt.width[8]);
  Eprintf ("\t\t\t\"strg\" must consist of 1 to 8 digits '0'-'9'\n");
  Eprintf ("-c strg   %d%d%d%d%d%d%d%d\tPen color(s) (see manual for details).\n",
	pt.color[1], pt.color[2], pt.color[3], pt.color[4],
	pt.color[5], pt.color[6], pt.color[7], pt.color[8]);
  Eprintf ("-P n:n    %d:%d\t\tPage range (0:0 = all pages).\n",
	pi->first_page, pi->last_page);
  Eprintf ("-q        %s\t\tQuiet mode (no diagnostics)\n",
	FLAGSTATE(pg->quiet));
  Eprintf ("-r float%5.1f\t\tRotation angle [deg]. -r90 = landscape\n",
	pi->rotation);
  Eprintf ("-s strg   %s\tName of swap file\n", pg->swapfile);

  Eprintf ("\nBitmap controls:\n");
  Eprintf ("-d int    %d\t\tDPI value for x or x&y, if -D unused.\n",
	po->dpi_x);
  Eprintf ("-D int    %d\t\tDPI value for y ONLY\n", po->dpi_x);
	 /* x, not y! */
NormalWait();

  Eprintf ("\nPCL-exclusive options:\n");
  Eprintf ("-i         %s\tPre-initialize printer\n", FLAGSTATE (po->init_p));
  Eprintf ("-F         %s\tSend a FormFeed at end\n", FLAGSTATE(po->formfeed));
  Eprintf ("-S int     %d\tUse Deskjet special commands (0=off, 1=B/W, 3=CMY, 4=CMYK)\n",
	po->specials);
  Eprintf ("NOTE:    \tOnly valid for -d: 300/150/100/75; -D invalid!\n");

  Eprintf ("\nPCL / PostScript / Preview options:\n");
  Eprintf ("-o float %5.1f\tX offset [mm] of picture\n", pi->xoff);
  Eprintf ("-O float %5.1f\tY offset [mm] of picture\n", pi->yoff);
  Eprintf ("-C           \tFit picture into center of (-a/-h/-w) rectangle\n");

  Eprintf ("\nTiff-exclusive options:\n");
  Eprintf ("-S int     %d\tUse Tiff Compression Format (0/1=None, 2=RLE, 3=G3Fax, 4=G4Fax, 5=LZW, 6=OJpeg, 7=Jpeg, 8=Deflate)\n",
	po->specials);

  Eprintf ("\nPCX-exclusive options:\n");
  Eprintf ("-i         %s\tInvert bitmap\n", FLAGSTATE (po->init_p));

  Eprintf ("\nSize controls:\n");

  Eprintf ("-a float %5.1f\tAspect factor (x/y correction). Valid: > 0.0\n",
	pi->aspectfactor);
  Eprintf ("-h float %5.1f\tHeight [mm] of picture\n",pi->height);
  Eprintf ("-w float %5.1f\tWidth  [mm] of picture\n",pi->width );
  Eprintf ("-t         %s\tShow true HPGL size. Disables -a -h -w !\n",
	FLAGSTATE (pi->truesize));
  Eprintf ("-x float   -\tManual HPGL-coord range presetting: x0\n");
  Eprintf ("-X float   -\tManual HPGL-coord range presetting: x1\n");
  Eprintf ("-y float   -\tManual HPGL-coord range presetting: y0\n");
  Eprintf ("-Y float   -\tManual HPGL-coord range presetting: y1\n");

#ifdef DOS
  Eprintf ("\n-V int   %d\tVGA mode byte (decimal). Change at own risk!\n",
		po->vga_mode);
#endif

NormalWait();

  Eprintf ("Corresponding long options:\n\n");
  Eprintf ("hp2xx   [--mode] [--colors] [--pensizes] [--pages] [--quiet]\n");
  Eprintf ("\t[--nofill] [--width] [--height] [--aspectfactor] [--truesize]\n");
  Eprintf ("\t[--x0] [--x1] [--y0] [--y1]\n");
  Eprintf ("\t[--xoffset] [--yoffset] [--center]\n");
  Eprintf ("\t[--DPI] [--DPI_x] [--DPI_y]\n");
  Eprintf ("\t[--outfile] [--logfile] [--swapfile]\n");
  Eprintf ("\t[--PCL_formfeed] [--PCL_init] [--PCL_Deskjet]\n");
#ifdef DOS
  Eprintf ("\t[--VGAmodebyte]");
#endif
  Eprintf ("\t[--help] [--version]\n");


#ifdef PURE_C
  Eprintf("\nPress RETURN key\n");
getchar();
#endif
}




void	reset_par (IN_PAR *pi)
/**
 ** Reset some parameter struct elements which may have been changed
 ** by action() to their defaults
 **/
{
  pi->x0	=  1e10;	/* HP7550A's range is about     */
  pi->x1	= -1e10;	/* [-2^24, 2^24], so we're safe */
  pi->y0	=  1e10;
  pi->y1	= -1e10;
}




void	preset_par (GEN_PAR *pg, IN_PAR *pi, OUT_PAR *po)
/**
 ** Pre-set constant parameter struct elements with reasonable defaults
 **/
{
int	i;

  pi->aspectfactor = 1.0;
  pi->center_mode  = FALSE;
  pi->height	= 200.0;
  pi->width	= 200.0;
  pi->xoff	= 0.0;
  pi->yoff	= 0.0;
  pi->truesize	= FALSE;
  pi->hwcolor	= FALSE;
  pi->hwsize	= FALSE;
  pi->rotation	= 0.0;
  pi->in_file	= "";
  pi->hd	= NULL;
  pi->first_page= 0;
  pi->last_page	= 0;

  po->init_p	= FALSE;
  po->formfeed	= FALSE;
  po->specials	= 0;
  po->dpi_x	= 75;
  po->dpi_y	= 0;
  po->vga_mode	= 18;		/* 0x12: VGA 640x480, 16 colors */
  po->picbuf	= NULL;
  po->outfile	= "";

  pg->logfile	= "";
  pg->swapfile	= "hp2xx.swp";
  pg->mode	= "pre";
  pg->td	= NULL;
  pg->xx_mode	= XX_PRE;
  pg->nofill	= FALSE;
  pg->quiet	= FALSE;
  pg->maxpensize= 1;		/* in pixel or 1/10 mm		*/
  pg->maxcolor	= 1;		/* max. color index		*/
  pg->maxpens=8;
  pg->is_color	= FALSE;

  pt.width[0] = 0;		/* in pixel or 1/10 mm		*/
  pt.color[0] = xxBackground;
  for (i=1; i<=NUMPENS; i++) {
	pt.width[i]	= 1;	/* in pixel or 1/10 mm		*/
        pt.color[i]	= xxForeground;
  }

  set_color_rgb(xxBackground,255,255,255);
  set_color_rgb(xxForeground,  0,  0,  0);
  set_color_rgb(xxRed,       255,  0,  0);
  set_color_rgb(xxGreen     ,  0,255,  0);
  set_color_rgb(xxBlue      ,  0,  0,255);
  set_color_rgb(xxCyan      ,  0,255,255);
  set_color_rgb(xxMagenta   ,255,  0,255);
  set_color_rgb(xxYellow    ,255,255,  0);

  reset_par (pi);
}




void	Send_Copyright(void)
/**
 **	Remnant of older (non-GNU) releases. Leave here if you like
 **/
{
static	unsigned char msg[] =
	{0xaf,0xa8,0xcd,0xd5,0x97,0xdd,0xdd,0x9f,
	 0x85,0x8d,0xc6,0x8c,0x85,0xed,0x8b,0x85,
	 0xf2,0xc0,0xd7,0xcb,0xd1,0xc2,0xc0,0xd6,
	 0xaf,0xa8,0xa5};
unsigned char	*p;

  p = msg;
  while (*p!=0xa5)
	Eprintf("%c", (*p++ ^ 0xa5));
  exit  (COPYNOTE);
}




void	autoset_outfile_name(
		const char* mode, const char *in_name,
		char** outfile)
{
int	len, i;

  if (**outfile=='-')	/* If output explicitly to stdout:		*/
	return;		/*    then nothing's to do here			*/

  if (isascii(**outfile) && strlen(*outfile) >0){/* If this looks like an output file name:	*/
	return;		/*    Just accept it! Add validity check later?	*/
}
  if (*in_name == '-')	/* If input from stdin				*/
	len = 0;
  else
	len = strlen(in_name);

  if (len == 0)		/* If input from stdin:				*/
  {			/*    then supply a default file name		*/
	*outfile="hp2xx.out";
	return;
  }

  if (strcmp(mode,"pre") == 0)
	return;		/* If preview mode:				*/
			/*    then output file name is unused		*/

  for (i=len-1; i; i--)	/* Search for (last) '.' char in path		*/
	if (in_name[i] == '.')
		break;
  i++;

/**
 ** We can assume a valid inp_name file name here.
 ** If not, the following fopen() in main() will fail
 ** and no harm will be done by an incorrect output file name.
 **/

  if ((*outfile = malloc(len+2+strlen(mode))) == NULL)
  {
	Eprintf("Error: No mem for output file name!\n");
	PError ("autoset_outfile_name");
	exit   (ERROR);
  }
  strcpy(*outfile, in_name);

  if (i==1 || len-i > 3) /* No or non-DOS extension: Add mode string	*/
  {
	strcat(*outfile, ".");
	strcat(*outfile, mode);	/* Mode string is extension!	*/
  }
  else
	strcpy(*outfile+i, mode);	/* Replace extension	*/
}



/**************************************************************************
 **
 ** cleanup_x ():
 **
 ** Call these functions to close & remove the temp. and input file
 **	as well as to free the raster picture buffer.
 ** Calling is ok even if the buffer is already freed or the files
 **	are already closed, so just call them when in doubt.
 **/

void
cleanup_g (GEN_PAR *pg)
{
  if (pg != NULL && pg->td != NULL)
  {
	fclose (pg->td);
	pg->td = NULL;
  }

#if defined(DOS) && defined (GNU)
/**
 ** GNU libc.a (DJ's DOS port) bug fix:
 **/
  unlink ("hp2xx.$$$");
#endif
}


void
cleanup_i (IN_PAR *pi)
{
  if (pi != NULL && pi->hd != NULL)
  {
	if (pi->hd != stdin)
		fclose (pi->hd);
	pi->hd = NULL;
  }
}


void
cleanup_o (OUT_PAR *po)
{
  if (po != NULL && po->picbuf != NULL)
  {
	free_PicBuf (po->picbuf);
	po->picbuf = NULL;
  }
}




void
cleanup (GEN_PAR *pg, IN_PAR *pi, OUT_PAR *po)
{
  cleanup_g (pg);
  cleanup_i (pi);
  cleanup_o (po);
}




/**************************************************************************
 **
 ** HPGL_to_TMP ():
 **
 ** This call opens a single HP-GL input file, scans and interprets
 ** its commands, and writes elementary move/draw commands into
 ** a temporary file.
 **	The input file is closed after returning, but the temp. file
 ** is kept open. You may re-use it multiple times. Close it finally!
 **	Calling this function invalidates later processing stages like
 ** the picture buffer.
 **/

int HPGL_to_TMP (GEN_PAR *pg, IN_PAR *pi) {
  /**
   ** Clean up previous leftovers (if any)
   **/

  cleanup_g (pg);
  cleanup_i (pi);

  /**
   ** Open HP-GL input file. Use stdin if selected.
   **/

  if (*pi->in_file == '-')
	pi->hd = stdin;
  else
	if ((pi->hd=fopen (pi->in_file, READ_BIN)) == NULL)
	{
		PError("hp2xx");
		return ERROR;
	}

  /**
   ** Open temporary intermediate file.
   **
   ** GNU libc.a (DJ's DOS port) bug fix (part 1 of 2):
   **	 tmpfile() does not seem to work!
   ** See code below for part 2/2 (removing hp2xx.$$$).
   ** NOTE:
   **	If program terminates abnormally, delete hp2xx.$$$ manually!!
   **/

#if defined(DOS) && defined (GNU)
  if ((pg->td = fopen("hp2xx.$$$","w+b")) == NULL)
#elif defined(AMIGA)
  if ((pg->td = fopen("t:hp2xx.tmp","w+b")) == NULL)
#else
  if ((pg->td = tmpfile()) == NULL)
#endif	/** !DOS && GNU	**/
  {
	PError("hp2xx -- opening temporary file");
	return ERROR;
  }

  /**
   ** Convert HPGL data into compact temporary binary file, and obtain
   ** scaling data (xmin/xmax/ymin/ymax in plotter coordinates)
   **/

  read_HPGL (pg, pi);

  if (pi->hd != stdin)
  {
	fclose (pi->hd);
	pi->hd = NULL;
  }
  return 0;
}



/**************************************************************************
 **
 ** TMP_to_VEC ():
 **
 ** Vector mode conversions.
 **	Call any number of times as long as the temp. file is opened.
 **
 ** Returns:
 **	ERROR	if error
 **	1	if mode not found
 **	0 	if successfully processed
 **/

int	TMP_to_VEC (const GEN_PAR *pg, const OUT_PAR *po)
{
  if (pg->td == NULL)
	return ERROR;

  rewind (pg->td);		/* Rewind temp file for re-reading	*/

  switch (pg->xx_mode)
  {
    case XX_MF:
	to_mftex(pg, po, 0);
	return 0;

    case XX_EM:
	to_mftex(pg, po, 1);
	return 0;

    case XX_EPIC:
	to_mftex(pg, po, 2);
	return 0;

    case XX_CAD:
	to_mftex(pg, po, 3);
	return 0;

#ifdef	ATARI
    case XX_CS:
	to_mftex(pg, po, 4);
	return 0;
#endif

    case XX_GPT:
	to_mftex(pg, po, 6);
	return 0;

    case XX_HPGL:
	to_mftex(pg, po, 5);
	return 0;

    case XX_EPS:
	to_eps	(pg, po);
	return 0;

    case XX_RGIP:
	to_rgip	(pg, po);
	return 0;

    case XX_FIG:
	to_fig (pg, po);
	return 0;

    default:
	return 1;
  }
}



/**************************************************************************
 **
 ** TMP_to_BUF ():
 **
 ** Rasterization into a memory buffer
 **	A pre-requisite for all raster formats. Call any number of times
 **		as long as the temp. file is opened.
 **	An internal raster picture buffer is maintained in memory
 **		by this call.
 **	The picture buffer is kept allocated after this call so that
 **		the time-consuming rasterization is needed only once.
 **		De-allocate at program end or when not needed anymore!
 **
 ** Returns:
 **	ERROR	if error
 **	0 	if successfully processed
 **/

int TMP_to_BUF (const GEN_PAR *pg, OUT_PAR *po) {
 DevPt size;

 if (pg->td == NULL) return ERROR;

 rewind (pg->td);		/* Rewind temp file for re-reading	*/

 cleanup_o (po);

/**
 ** 1) Allocate virtual plotter area
 **/

  size_PicBuf (pg, po, &size);

 po->picbuf=allocate_PicBuf(pg, &size);
 if (!po->picbuf) {
  Eprintf("Fatal error: cannot allocate %d*%d picture buffer\n",
    size.x, size.y);
  return ERROR;
 }

/**
 ** Read vectors from temporary file and plot them in memory buffer
 **/

 tmpfile_to_PicBuf (pg, po);

 return 0;
}



/**************************************************************************
 **
 ** BUF_to_RAS ():
 **
 ** Conversion of raster picture buffer into the final output format.
 **
 ** Returns:
 **	ERROR	if error
 **	1 	if output mode not found
 **	0 	if successfully processed
 **/

int	BUF_to_RAS (const GEN_PAR *pg, const OUT_PAR *po)
{
  if (po->picbuf == NULL)
	return ERROR;

  switch (pg->xx_mode)
  {
	case XX_PCL:		/* HP PCL Level 3	*/
		return PicBuf_to_PCL (pg, po);

	case XX_PCX:		/* Paintbrush PCX	*/
		return PicBuf_to_PCX (pg, po);

#ifdef	PIC_PAC			/*   To be phased out!	*/
	case XX_PIC:		/* ATARI 32K format	*/
		return PicBuf_to_PIC (pg, po);

	case XX_PAC:		/* ATARI STaD format	*/
		return PicBuf_to_PAC (pg, po);
#endif

#ifdef	AMIGA
	case XX_ILBM:		/* AMIGA IFF-ILBM fmt	*/
		return PicBuf_to_ILBM(pg, po);
#endif

	case XX_IMG:		/* GEM's IMG format	*/
		return PicBuf_to_IMG (pg, po);

	case XX_PBM:		/* Portable BitMap fmt	*/
		return PicBuf_to_PBM (pg, po);
#ifdef PNG
	case XX_PNG:            /* Portable Network fmt */
	       return PicBuf_to_PNG (pg, po);
#endif

#ifdef TIF
	case XX_TIFF:            /* Tagged image file fmt */
	       return PicBuf_to_TIF (pg, po);
#endif
#ifdef EPSON
	case XX_ESC2:		/* Epson Esc/P2	*/
		return PicBuf_to_ESCP2 (pg, po);
#endif
/**
 ** Previewers (depending on hardware platform):
 **/
	case XX_PRE:
#if   defined(HAS_DOS_DJGR)
		return PicBuf_to_DJ_GR (pg, po);
#elif defined(HAS_DOS_HGC)
		return PicBuf_to_HGC	(pg, po);
#elif defined(HAS_DOS_VGA)
		return PicBuf_to_VGA	(pg, po);
#elif defined(HAS_OS2_EMX)
		return PicBuf_to_OS2	(pg, po);
#elif defined(HAS_OS2_PM)
		return PicBuf_to_PM	(pg, po);
#elif defined(HAS_UNIX_X11)
		return PicBuf_to_X11	(pg, po);
#elif defined(HAS_UNIX_SUNVIEW)
		return PicBuf_to_Sunview(pg, po);
#elif defined(ATARI)
		return PicBuf_to_ATARI	(pg, po);
#elif defined(AMIGA)
		return PicBuf_to_AMIGA	(pg, po);
#elif defined(VAX)
		return PicBuf_to_UIS	(pg, po);
#elif defined(WIN32)
   return 1;
#else
		return PicBuf_to_Dummy	();
#endif	/* defined(...)	*/
  }
  return 1;
}



/**********************************************************************
 **
 **  My intention is to facilitate the implementation of various
 **  user interfaces including e.g. a Windows front-end.
 **
 **  Note that e.g. in Windows programs there is a "win_main()" function
 **  instead of "main()", and that waiting for user acknowledgement
 **  or diagnostic output must not use stdin/out/err...
 **
 **  In a separate file, one of possibly several versions of
 **  user interface dependend functions + local utility functions
 **  is supplied. The traditional version can be found in "std_main.c"
 **
 **	Function	Tradiditional equivalent
 **
 **	EPrintf(...)	fprintf(stderr, ...)
 **	PError		perror
 **	SilentWait	-
 **	NormalWait	-
 **	...		main
 **/
Detected encoding: ASCII (7 bit)2