[alt.sources] Psroff 2.0 Patch 3

clewis@ecicrl.UUCP (Chris Lewis) (10/13/90)

Archive-name: psroff2.0/Patch.03
Submitted-by: clewis@ecicrl.uucp

(Did it work Peter? ;-)

    This is official patch 03 for Psroff 2.0.
    Please apply it by:
	cd <psroff source directory>
	patch -N -p < <this file>

    Then rebuild all of psroff.

Amongst some minor bug fixes, this patch introduces some Ditroff drawing
emulation stuff.  If you pipe ditroff source through "catconv"
and then into psroff, psroff will attempt to emulate the \D drawing
codes.  Eg:

    pic foo | catconv | psroff

For this to work, INSPECIAL should be defined in defs.h, and you have to
have Perl to run catconv (probably R3).

Notes:
    - splines (\D'~) aren't implemented for postscript
    - nothing is implemented for HPPCL
    - ditroff output is completely supported (eg: tpscript).
    - This hasn't been tested very well and some \D'...'
      may fool "catconv".   Further, beyond a certain complexity,
      the backend (troff2ps) misses some of the sequences....
      Simple PIC stuff appears to work, manual \D'...' do too.

Don't bother telling me that catconv/ditroff drawing code doesn't
work completely - I know that, but fixes and code would be very
welcome - eg: postscript spline code or more reliable special
sequence recognition.

It's hard for me to work on this because I have no access to ANY
printers at the moment.

Followups have been directed to comp.text because I don't get
c.s.b or a.s at the moment.

./lib/ps.lib		Drawing code assists
./README		Slight fixups
./debug.c		bcopy fix.
./ps.c			drawing code.
./utils/pk2sfp.c	standalone compile (released in alt.sources)
./utils/psxlate.c	so compilers with "const" strings don't die.
./utils/catconv.S	new utility (see above)
./defs.h		PL3, drawing code, BCOPYLIB
./dt.c			drawing code
./dt.h			drawing code
./ps.h			drawing code
./psroff.S		accidentally hard-coded /usr/lib/font fix.

*** /tmp/PATCHold/./lib/ps.lib	Fri Oct 12 14:32:47 1990
--- ./lib/ps.lib	Fri Oct 12 14:32:49 1990
***************
*** 9,15 ****
  %	Module:		ps.lib
  %	Author: 	Chris Lewis
  %	Specs:		Predefinitions for PostScript
! %ident  @(#)ps.lib: 2.1 Copyright 90/07/18 16:52:37 Chris Lewis"
  
  /Y { 3 1 roll dup /CurY exch def moveto show } bind def
  /X { exch CurY moveto show } bind def
--- 9,15 ----
  %	Module:		ps.lib
  %	Author: 	Chris Lewis
  %	Specs:		Predefinitions for PostScript
! %ident  @(#)ps.lib: 2.2 Copyright 90/10/12 13:15:42 Chris Lewis"
  
  /Y { 3 1 roll dup /CurY exch def moveto show } bind def
  /X { exch CurY moveto show } bind def
***************
*** 405,410 ****
--- 405,444 ----
  } def end
  /BracketFont BracketFontDict definefont pop
  
+ /Ellipse {
+ 	/Yaxis exch 2 div def
+ 	/Xaxis exch 2 div def
+ 	currentpoint exch Xaxis add exch
+ 	/savematrix matrix currentmatrix def
+ 	translate
+ 	Xaxis Yaxis scale
+ 	1 0 moveto
+ 	0 0 1 0 360 arc
+ 	savematrix setmatrix
+ 	%currentpoint exch Xaxis 2 mul add exch moveto
+ } bind def
+ 
+ /Arc {
+ 	/eY exch def
+ 	/eX exch def
+ 	/cY exch def
+ 	/cX exch def
+ 	currentpoint cY add exch cX add exch	% center x y
+ 	cY dup mul cX dup mul add sqrt % radius
+ 	cY neg cX neg atan	% ang1
+ 	eY eX atan		% ang2
+ %	5 copy
+ %	(                    ) cvs print
+ %	( ) print
+ %	(                    ) cvs print
+ %	( ) print
+ %	(                    ) cvs print
+ %	( ) print
+ %	(                    ) cvs print
+ %	( ) print
+ %	(                    ) cvs print
+ 	arc
+ } bind def
  
  %	This macro is invoked by ShowPage to display the current form.
  %	Usually redefined to point at a form loaded by an include
*** /tmp/PATCHold/./README	Fri Oct 12 14:33:00 1990
--- ./README	Fri Oct 12 14:33:03 1990
***************
*** 1,4 ****
! 		PSROFF RELEASE 2.0 README 2.1 90/07/18
  
  			May 14, 1990
  			Chris Lewis
--- 1,4 ----
! 		PSROFF RELEASE 2.0 README 2.2 90/08/30
  
  			May 14, 1990
  			Chris Lewis
***************
*** 319,331 ****
        .sR.  Further, ".tm" has been redefined to make use of the
        .sR facility.
  
!     - troff2 has 8-font troff support, but:
  
  	    a) it's never been tested.
  	    b) I'm no longer convinced that the cat.5 man page is
  	       correct on how the decoding works.
  
!     - troff2 has BSDHACK support (one of the tilt opcodes being
        replaced by an opcode to multiply the next vertical motion
        by 64), but this has not been tested.  I never heard of it
        before til I saw it in Froyen's troff2lj source.  This cannot
--- 319,331 ----
        .sR.  Further, ".tm" has been redefined to make use of the
        .sR facility.
  
!     - psroff has 8-font troff support, but:
  
  	    a) it's never been tested.
  	    b) I'm no longer convinced that the cat.5 man page is
  	       correct on how the decoding works.
  
!     - psroff has BSDHACK support (one of the tilt opcodes being
        replaced by an opcode to multiply the next vertical motion
        by 64), but this has not been tested.  I never heard of it
        before til I saw it in Froyen's troff2lj source.  This cannot
***************
*** 391,397 ****
  	  With Laserjet driving:
  
  	    MDLF	max # downloaded fonts supported per page.
! 	    PRELOAD	# fonts statically downloaded
  	    SFP		enables SFP's with incremental font downloading.
  			Needs INCR.
  	    INCR	enable incremental font downloading.  Needs PARTIAL.
--- 391,398 ----
  	  With Laserjet driving:
  
  	    MDLF	max # downloaded fonts supported per page.
! 			LJ+ have this as 16.  Later models support more.
! 	    PRELOAD	# fonts statically downloaded.
  	    SFP		enables SFP's with incremental font downloading.
  			Needs INCR.
  	    INCR	enable incremental font downloading.  Needs PARTIAL.
***************
*** 567,573 ****
  	  The most important thing to remember is that you cannot extend
  	  the CAT's character sets without modifying troff - unlike ditroff
  	  where you can add them by changing the makedev files.  This
! 	  is how you do install overrides:
  
  	    - Put in a map override in the appropriate *.fonts file that
  	      emits the character you want in place of a character you
--- 568,574 ----
  	  The most important thing to remember is that you cannot extend
  	  the CAT's character sets without modifying troff - unlike ditroff
  	  where you can add them by changing the makedev files.  This
! 	  is how you do overrides:
  
  	    - Put in a map override in the appropriate *.fonts file that
  	      emits the character you want in place of a character you
***************
*** 582,588 ****
  
  		<troffchar> N|S|n <sequence> <x adjust> <y adjust> <scale>
  
! 	      x adjust, y adjust, scale default to 0, 0 and 0 respectively.
  	      x and y adjust are multiplied by .01, then the pointsize
  	      and of the output driver to give the shift factor in
  	      1/resolution units.  Scale allows you to change the size
--- 583,589 ----
  
  		<troffchar> N|S|n <sequence> <x adjust> <y adjust> <scale>
  
! 	      x adjust, y adjust, scale default to 0, 0 and 100 respectively.
  	      x and y adjust are multiplied by .01, then the pointsize
  	      and of the output driver to give the shift factor in
  	      1/resolution units.  Scale allows you to change the size
*** /tmp/PATCHold/./debug.c	Fri Oct 12 14:33:18 1990
--- ./debug.c	Fri Oct 12 14:33:19 1990
***************
*** 2,8 ****
  
  #ifndef	lint
  static char SCCSid[] =
!     "@(#)debug.c: 2.2 Copyright 90/08/08 13:14:09 Chris Lewis";
  #endif
  
  #ifdef	DEBUG
--- 2,8 ----
  
  #ifndef	lint
  static char SCCSid[] =
!     "@(#)debug.c: 2.3 Copyright 90/10/01 14:41:07 Chris Lewis";
  #endif
  
  #ifdef	DEBUG
***************
*** 115,132 ****
  }
  
  #ifdef	BCOPY
  /*	"slowish" routines when you don't have memcpy and friends
   */
  bcopy(from, to, len)
  register char *from, *to;
! register int n; {
!     while(n--)
  	*to++ = *from++;
  }
  bzero(array, len)
  register char *array;
! register int len; {
!     while(n--)
  	*array++ = '\0';
  }
  #endif
--- 115,137 ----
  }
  
  #ifdef	BCOPY
+ #ifndef BCOPYLIB
  /*	"slowish" routines when you don't have memcpy and friends
   */
  bcopy(from, to, len)
  register char *from, *to;
! register int len; 
! {
!   while(len--)
  	*to++ = *from++;
  }
+ 
  bzero(array, len)
  register char *array;
! register int len; 
! {
!   while(len--)
  	*array++ = '\0';
  }
+ #endif BCOPYLIB
  #endif
*** /tmp/PATCHold/./ps.c	Fri Oct 12 14:33:35 1990
--- ./ps.c	Fri Oct 12 14:33:37 1990
***************
*** 18,24 ****
  
  #ifndef	lint
  static char SCCSid[] =
!     "@(#)ps.c: 2.1 Copyright 90/07/18 16:47:36 Chris Lewis";
  #endif
  
  /*	ps.c will generate some additional "print" commands to cause
--- 18,24 ----
  
  #ifndef	lint
  static char SCCSid[] =
!     "@(#)ps.c: 2.2 Copyright 90/10/12 13:09:32 Chris Lewis";
  #endif
  
  /*	ps.c will generate some additional "print" commands to cause
***************
*** 358,363 ****
--- 358,365 ----
      }
  }
  
+ int indraw = 0;
+ 
  psChar(x, y, font, points, troffChar, sequence)
  int x, y;
  int font, points, troffChar;
***************
*** 370,375 ****
--- 372,398 ----
  	doPageStart();
      }
  
+     if (font < 0) {
+ #ifdef	TRY
+ 	if (!indraw) {
+ #endif
+ 	    printf("newpath\n");
+ 	    emitnum(nx);
+ 	    putchar(' ');
+ 	    emitnum(ny);
+ 	    printf(" moveto\n");
+ 	    indraw = 1;
+ #ifdef	TRY
+ 	}
+ #endif
+ 	return;
+ #ifdef	TRY
+     } else if (indraw) {
+ 	printf("stroke\n");
+ 	indraw = 0;
+ #endif
+     }
+ 
      charCount++;
  
      DBP((D_BEND,"BEFORE (troffChar,x,y,font,points) = (%d,%d,%d,%d,%d)\n",
***************
*** 556,559 ****
--- 579,676 ----
  #endif
  }
  
+ #ifdef	INSPECIAL
+ psDraw(origX, origY, s)
+ int origX, origY;
+ register char *s; {
+     register int opcode, ctindex = 0, temp, neg;
+     /*static int curDX = -1, curDY = -1;*/
+     short int numbers[100];
+ 
+     DBP((D_CAT, "psDraw: (%d,%d): %s\n", origX, origY, s));
+     /* Special invocation to get the newpath/moveto done */
+     psChar(origX, origY, -1, -1, (char*) NULL, (char*) NULL);
+     while(*s && isspace(*s)) s++;
+     opcode = *s;
+     neg = 1;
+     for (;*s;s++) {
+ 	if (isspace(*s))
+ 	    continue;
+ 	else if (*s == '\\')
+ 	    s += 3;
+ 	else if (*s == '-')
+ 	    neg = -1;
+ 	else if (!isdigit(*s))
+ 	    continue;
+ 	else {
+ 	    temp = *s - '0';
+ 	    while(isdigit(*(s+1)))
+ 		temp = temp * 10 + (*++s - '0');
+ 	    numbers[ctindex++] = neg * temp;
+ 	    neg = 1;
+ 	}
+     }
+     switch(opcode) {
+ 	case 'l':
+ 	    DBP((D_CAT, "drawline: %d, %d\n", numbers[0], numbers[1]));
+ 	    emitnum((int) numbers[0]);
+ 	    putchar(' ');
+ 	    emitnum((int) -numbers[1]);
+ 	    printf(" rlineto\n");
+ 	    break;
+ 	case 'a':
+ 	    for (temp = 0; temp < 4; temp++) {
+ 		emitnum((int) ((temp % 2) ? -numbers[temp]: numbers[temp]));
+ 		putchar(' ');
+ 	    }
+ 	    printf("Arc\n");
+ 	    break;
+ 	case 'c':
+ 	    numbers[1] = numbers[0];
+ 	case 'e':
+ 	    DBP((D_CAT, "drawellipse: %d, %d\n", numbers[0], numbers[1]));
+ 	    emitnum((int) numbers[0]);
+ 	    putchar(' ');
+ 	    emitnum((int) numbers[1]);
+ 	    printf(" Ellipse\n");
+ 	    break;
+ 	case '~':
+ 	    if (ctindex < 4) {
+ 		fprintf(stderr, "%s: too few points to spline: %s\n",
+ 		    progname, s);
+ 		break;
+ 	    }
+ 	    fprintf(stderr, "%s: Don't support splines yet\n", progname);
+ 	    /* Some of the following is inspired from tpscript.
+ 	       First convert to RELATIVE to the starting point.
+ 	       Further, There's a bug in PIC that returns negatively one
+ 	       unit LESS than it went forward - fudge it here */
+ 	    for (temp = 2; temp < ctindex; temp++) {
+ 		if (numbers[temp] < 0)
+ 		    numbers[temp]--;
+ 		numbers[temp] += numbers[temp-2];
+ 	    }
+ 	    if (ctindex == 4) {
+ 		emitnum((int) numbers[0] / 2);
+ 		putchar(' ');
+ 		emitnum((int) -numbers[1] / 2);
+ 		putchar(' ');
+ 		emitnum((int) (numbers[0] + numbers[2]) / 2);
+ 		putchar(' ');
+ 		emitnum((int) -(numbers[1] + numbers[3])/ 2);
+ 		putchar(' ');
+ 		emitnum((int) numbers[2]);
+ 		putchar(' ');
+ 		emitnum((int) -numbers[3]);
+ 		printf(" rcurveto\n");
+ 	    }
+ 	    break;
+ 	default:
+ 	    fprintf(stderr, "%s: invalid draw code %c\n", progname, opcode);
+ 	    indraw = 0;
+ 	    break;
+     }
+     printf("stroke\n");
+ }
+ #endif
  #endif /* PS */
*** /tmp/PATCHold/./utils/pk2sfp.c	Fri Oct 12 14:33:49 1990
--- ./utils/pk2sfp.c	Fri Oct 12 14:33:50 1990
***************
*** 1,4 ****
! /*	Copyright 1985, 1986, 1987, 1988 90/07/18 Chris Lewis
  		All Rights Reserved
  
      Permission to copy and further distribute is freely given provided
--- 1,4 ----
! /*	Copyright 1985, 1986, 1987, 1988 90/09/17 Chris Lewis
  		All Rights Reserved
  
      Permission to copy and further distribute is freely given provided
***************
*** 13,19 ****
  
  #ifndef	lint
  static char SCCSID[] =
!     "@(#)pk2sfp.c 2.1 Copyright 90/07/18 16:49:44 Chris Lewis";
  #endif
  
  #include "defs.h"
--- 13,19 ----
  
  #ifndef	lint
  static char SCCSID[] =
!     "@(#)pk2sfp.c 2.2 Copyright 90/09/17 10:50:03 Chris Lewis";
  #endif
  
  #include "defs.h"
***************
*** 43,48 ****
--- 43,49 ----
  
  char *progname;
  
+ #ifdef	PARTIAL
  extern struct enctab encNormal[], encSymbol[];
  
  needchar(font, character)
***************
*** 67,72 ****
--- 68,80 ----
  
      return(0);
  }
+ #else
+ needchar(font, character)
+ int font;
+ long character; {
+     return(1);
+ }
+ #endif
  
  main(argc, argv)
  int argc;
*** /tmp/PATCHold/./utils/psxlate.c	Fri Oct 12 14:33:57 1990
--- ./utils/psxlate.c	Fri Oct 12 14:33:58 1990
***************
*** 13,19 ****
  
  #ifndef	lint
  static char SCCSid[] =
!     "@(#)psxlate.c: 2.1 Copyright 90/07/18 16:49:52 Chris Lewis";
  #endif
  
  #include "defs.h"
--- 13,19 ----
  
  #ifndef	lint
  static char SCCSid[] =
!     "@(#)psxlate.c: 2.2 Copyright 90/10/12 13:12:11 Chris Lewis";
  #endif
  
  #include "defs.h"
***************
*** 39,45 ****
      struct headers *comments;
  } pageidx[MAXPAGE];
  
! char *tmp = "/tmp/psxXXXXXX";
  int page = 0;
  char *progname;
  int debug, verbose;
--- 39,45 ----
      struct headers *comments;
  } pageidx[MAXPAGE];
  
! char tmp[] = {"/tmp/psxXXXXXX"};
  int page = 0;
  char *progname;
  int debug, verbose;
*** /tmp/PATCHold/./utils/catconv.S	Fri Oct 12 14:34:06 1990
--- ./utils/catconv.S	Fri Oct 12 14:34:12 1990
***************
*** 0 ****
--- 1,89 ----
+ #! /usr/lbin/perl
+ eval "exec  /usr/lbin/perl -S $0 $*"
+ 	if $running_under_some_shell;
+ #	This does a very simpleminded conversion of ditroff-only-isms
+ #	(such as graphics) into something handleable by psroff.
+ #	Copyright 1990 Chris Lewis, All Rights Reserved.
+ #	You can do anything you want with this provided that it is
+ #	not for profit and this notice remains intact.
+ #	1.1 90/10/12
+ $inpic = 0;
+ print(".de lf\n");
+ print(".mk\n");
+ print("..\n");
+ 
+ while($line = <STDIN>) {
+     chop($line);
+     if ($line =~ /^\.PS/) {
+ 	$inpic = 1;
+ 	print "$line\n";
+ 	next;
+     }
+     if ($line =~ /^\.PE/) {
+ 	$inpic = 0;
+ 	print "$line\n";
+ 	next;
+     }
+     if ($inpic && ($line eq '.sp -1')) {
+ 	printf(".rt\n");
+ 	next;
+     }
+     if ($line =~ /\\D'/) {
+ 	$newline = do process($line);
+ 	print "$newline\n";
+     } else {
+ 	print "$line\n";
+     }
+ }
+ 
+ sub process {
+     local($line, $newline, $pre, $opcode, $arglist) = ($_[0]);
+ #    printf("in process: $line\n");
+     $predefs = '';
+     $index = 0;
+     while($line =~ /\\D'\s*(.)\s*([^']+)'/) {
+ 	($pre, $line, $opcode, $arglist) = ($`, $', $1, $2);
+ #	print("pre: $pre\nline: $line\nopcode: $opcode\narglist: $arglist\n");
+ 	$newline .= $pre;
+ 	$newargs = '';
+ 	$newy = '';
+ 	$newx = '';
+ 	@args = split(/[ \t]+/, $arglist);
+ 	for ($i = 0; $i <= $#args; $i++) {
+ 	    $arg = $args[$i];
+ 	    if ($arg =~ '-') {
+ 		$arg = "0$arg";
+ 	    }
+ 	    $predefs .= ".nr .$index $arg\n";
+ 	    $newargs .= "\\(ts\\n(.$index";
+ 	    if ($opcode eq '~') {
+ 		if ($i % 2) {
+ 		    $newy .= "+\\n(.$index";
+ 		} else {
+ 		    $newx .= "+\\n(.$index";
+ 		}
+ 	    }
+ 	    $index++;
+ 	}
+ 	$newline .= "\\ka\\o'\\(bs\\(bs'D$opcode$newargs\\(bs\\h'|\\nau";
+ 	# Reposition...
+ 	if ($opcode eq 'l') {
+ 	    $newline .= sprintf("+\\n(.%du'\\v'\\n(.%du'",
+ 		$index - 2, $index -1);
+ 	} elsif ($opcode eq 'c') {
+ 	    $newline .= sprintf("+\\n(.%du'", $index - 1);
+ 	} elsif ($opcode eq 'e') {
+ 	    $newline .= sprintf("+\\n(.%du'", $index - 2);
+ 	} elsif ($opcode eq '~') {
+ 	    $newy = substr($newy, 1, 9999);
+ 	    $newline .= "$newx'\\v'$newy'";
+ 	} else {
+ 	    $newline .= "'";
+ 	}
+ 	if ($line) {
+ 	    $newline .= "\\\n";
+ 	}
+     }
+     $newline .= $line;
+     return("$predefs$newline");
+ }
*** /tmp/PATCHold/./defs.h	Fri Oct 12 14:34:20 1990
--- ./defs.h	Fri Oct 12 14:34:22 1990
***************
*** 1,4 ****
! /*	Copyright 1988, 1989 15:04:07 Chris Lewis
  		All Rights Reserved
  
      Permission to copy and further distribute is freely given provided
--- 1,4 ----
! /*	Copyright 1988, 1989 13:38:22 Chris Lewis
  		All Rights Reserved
  
      Permission to copy and further distribute is freely given provided
***************
*** 6,18 ****
      sold for profit.
  
  	Project:	Generic Troff drivers
! 	Module:		defs.h 2.3 90/08/29 15:04:07
  	Author: 	Chris Lewis
  	Specs:		Main header file - contains some customization
   */
  
  /*	Official Release and Patch level:	*/
! #define	T2VERSION	"@(#)PSROFF Copyright 90/08/29 Chris Lewis - R2 P2"
  
  #ifndef	LIBDIR
  /*	Don't touch this */
--- 6,18 ----
      sold for profit.
  
  	Project:	Generic Troff drivers
! 	Module:		defs.h 2.7 90/10/12 13:38:22
  	Author: 	Chris Lewis
  	Specs:		Main header file - contains some customization
   */
  
  /*	Official Release and Patch level:	*/
! #define	T2VERSION	"@(#)PSROFF Copyright 90/10/12 Chris Lewis - R2 P3"
  
  #ifndef	LIBDIR
  /*	Don't touch this */
***************
*** 30,35 ****
--- 30,38 ----
  #undef	BCOPY		/* Define if you don't have memcpy and friends - eg:
  			   oldish BSD systems */
  
+ #undef  BCOPYLIB	/* Define if BCOPY is defined and you have */
+ 			/* a bcopy in the library */ 
+ 
  #undef	UNSIGNEDCHAR	/* Define if chars are unsigned on your machine */
  
  /*	The name of a routine that can be called thusly:
***************
*** 45,50 ****
--- 48,56 ----
  
  #define VFPRINTF	vfprintf
  
+ /* If you have the stand-alone pk2sfp distribution, do not touch
+    anything from here on */
+ 
  /*	Font width file configuration:
  
  	- If HEADERSIZE defined, use that many bytes as a prefix to the
***************
*** 157,162 ****
--- 163,170 ----
  #define	DEFYOFF   0	/* Default page vertical offset.  See README/TROUBLE/
  			   psroff(1) -Y options too */
  
+ #define	INSPECIAL	/* enables ditroff graphics capability */
+ 
  /*	Edit no more .... */
  
  #define	MAXDLFONTS (MDLF - PRELOAD)	/* # fonts troff2ps can download */
***************
*** 375,377 ****
--- 383,390 ----
  extern char *mustmalloc();
  
  extern char *version, *shortversion;
+ 
+ #ifdef	ALONE
+ #undef	PARTIAL
+ #undef	INCR
+ #endif
*** /tmp/PATCHold/./dt.c	Fri Oct 12 14:34:31 1990
--- ./dt.c	Fri Oct 12 14:34:33 1990
***************
*** 15,21 ****
  
  #ifndef	lint
  static char SCCSid[] =
!     "@(#)dt.c: 2.1 Copyright 90/07/18 16:51:27 Chris Lewis";
  #endif
  
  /*	These two tables are always included so that we have the
--- 15,21 ----
  
  #ifndef	lint
  static char SCCSid[] =
!     "@(#)dt.c: 2.2 Copyright 90/10/12 13:09:25 Chris Lewis";
  #endif
  
  /*	These two tables are always included so that we have the
***************
*** 413,418 ****
--- 413,419 ----
  	    else
  		printf("c%s\n", sequence);
  	}
+ 	lastXPos = nx;
  #ifdef	NOTYET
      }
  #endif
***************
*** 466,470 ****
--- 467,502 ----
      printf("x trailer\n");
      printf("x stop\n");
  }
+ 
+ #ifdef	INSPECIAL
+ dtDraw(origX, origY, s)
+ int origX, origY;
+ register char *s; {
+     register int temp, t2;
+     DBP((D_CAT, "dtDraw: (%d,%d): %s\n", origX, origY, s));
+     printf("H%d\n", TROFF2DTX(origX));
+     printf("V%d\n", TROFF2DTY(origY));
+     putchar('D');
+     putchar(*s);
+     s++;
+     /* We just pass these thru, scaling them to output resolution */
+     for (;*s;s++) {
+ 	if (isspace(*s))
+ 	    putchar(' ');
+ 	else if (!isdigit(*s))
+ 	    putchar(*s);
+ 	else {
+ 	    temp = *s - '0';
+ 	    while(isdigit(*(s+1))) {
+ 		temp = temp * 10 + (*++s - '0');
+ 	    }
+ 	    t2 = temp * dtresolution / TROFFRESOLUTION;
+ 	    DBP((D_CAT, "dtDraw (scale): %d -> %d\n", temp, t2)); 
+ 	    printf("%d", t2);
+ 	}
+     }
+     putchar('\n');
+ }
+ #endif
  
  #endif /* DT */
*** /tmp/PATCHold/./dt.h	Fri Oct 12 14:34:41 1990
--- ./dt.h	Fri Oct 12 14:34:42 1990
***************
*** 1,4 ****
! /*	Copyright 1985, 1986, 1987, 1988 16:51:29 Chris Lewis
  		All Rights Reserved
  
      Permission to copy and further distribute is freely given provided
--- 1,4 ----
! /*	Copyright 1985, 1986, 1987, 1988 13:09:46 Chris Lewis
  		All Rights Reserved
  
      Permission to copy and further distribute is freely given provided
***************
*** 6,12 ****
      sold for profit.
  
  	Project:	Generic Troff drivers
! 	Module:		dt.h 2.1 90/07/18
  	Author: 	Chris Lewis
  	Specs:		Ditroff driver definitions
  			Hacked from ps.h
--- 6,12 ----
      sold for profit.
  
  	Project:	Generic Troff drivers
! 	Module:		dt.h 2.2 90/10/12
  	Author: 	Chris Lewis
  	Specs:		Ditroff driver definitions
  			Hacked from ps.h
***************
*** 21,27 ****
  /*	11" paper length */
  #define	TROFF2DTY(y) ((((long) (y)+pageyoffset)*dtresolution)/TROFFRESOLUTION)
  
! extern int dtProlog(), dtEpilog(), dtChar(), dtPage(), dtPassthru();
  
  #ifdef	DT
  extern struct troff2befont dtSymFont[], dtStdFont[];
--- 21,27 ----
  /*	11" paper length */
  #define	TROFF2DTY(y) ((((long) (y)+pageyoffset)*dtresolution)/TROFFRESOLUTION)
  
! extern int dtProlog(), dtEpilog(), dtChar(), dtPage(), dtPassthru(), dtDraw();
  
  #ifdef	DT
  extern struct troff2befont dtSymFont[], dtStdFont[];
*** /tmp/PATCHold/./ps.h	Fri Oct 12 14:34:49 1990
--- ./ps.h	Fri Oct 12 14:34:50 1990
***************
*** 1,4 ****
! /*	Copyright 1985, 1986, 1987, 1988 16:51:42 Chris Lewis
  		All Rights Reserved
  
      Permission to copy and further distribute is freely given provided
--- 1,4 ----
! /*	Copyright 1985, 1986, 1987, 1988 13:09:42 Chris Lewis
  		All Rights Reserved
  
      Permission to copy and further distribute is freely given provided
***************
*** 6,12 ****
      sold for profit.
  
  	Project:	Generic Troff drivers
! 	Module:		ps.h 2.1 90/07/18
  	Author: 	Chris Lewis
  	Specs:		PostScript Driver definitions
   */
--- 6,12 ----
      sold for profit.
  
  	Project:	Generic Troff drivers
! 	Module:		ps.h 2.2 90/10/12
  	Author: 	Chris Lewis
  	Specs:		PostScript Driver definitions
   */
***************
*** 30,36 ****
  #define	EMITPS	printf
  
  /*	Entry points: */
! extern int psProlog(), psEpilog(), psChar(), psPage(),
      psOverlay(), psXlate();
  
  extern struct troff2befont psSymFont[], psStdFont[];
--- 30,36 ----
  #define	EMITPS	printf
  
  /*	Entry points: */
! extern int psProlog(), psEpilog(), psChar(), psPage(),psDraw(),
      psOverlay(), psXlate();
  
  extern struct troff2befont psSymFont[], psStdFont[];
*** /tmp/PATCHold/./psroff.S	Fri Oct 12 14:35:07 1990
--- ./psroff.S	Fri Oct 12 14:35:10 1990
***************
*** 11,17 ****
  #	Author: 	Chris Lewis
  #	Specs:		troff driver
  #
! #ident  "@(#)psroff.sh: 2.1 Copyright 90/07/18 16:51:55 Chris Lewis"
  
  LIBDIR="%%LIBDIR%%"
  FONTDIR="%%FONTDIR%%"
--- 11,17 ----
  #	Author: 	Chris Lewis
  #	Specs:		troff driver
  #
! #ident  "@(#)psroff.sh: 2.2 Copyright 90/10/01 14:41:16 Chris Lewis"
  
  LIBDIR="%%LIBDIR%%"
  FONTDIR="%%FONTDIR%%"
***************
*** 221,227 ****
      ) >&2
  fi
  
! if [ -n "$widtharg" -a ! -d /usr/lib/font/$width ]
  then
      echo "$0: troff doesn't have width tables ($width) for $type printer" >&2
      echo "Please see the README and gfnttab for creating them" >&2
--- 221,227 ----
      ) >&2
  fi
  
! if [ -n "$widtharg" -a ! -d %%FONTDIR%%/$width ]
  then
      echo "$0: troff doesn't have width tables ($width) for $type printer" >&2
      echo "Please see the README and gfnttab for creating them" >&2
-- 
Chris Lewis, Phone: TBA
UUCP: uunet!utai!lsuc!ecicrl!clewis
Moderator of the Ferret Mailing List (ferret-request@eci386)
Psroff mailing list (psroff-request@eci386)