[comp.lang.postscript] What's wrong with this PostScript output?

stuarth@csis.dit.csiro.au (Stuart Hungerford) (02/04/90)

I'm hoping some PostScript wizard out there can help me with this one.  I'm
using a pretty-printing program called `pps' which takes source code in various
languages and produces PostScript output with reserved words, comments, body
text etc in the fonts you specify.   In my case the language is C and body
text is Courier, reserved words are in Courier bold and (this is the problem)
comments in courier italic.

The problem with the comment text is that unless you use plain Courier or
New Century Schoolbook italic the code produced by pps dissapears into our
Apple LaserWriter Plus and nothing is printed.

I've included below a sample output from pps which demonstrates the problem.
(I've commented out the lines which print line and page numbers but that's OK,
it wasn't working before that either).  If anybody can spot the problem please 
email me the short answer before you post as I'm desperate and our newsfeed 
is very slow.

Thanks in anticipation,

                                       Stuart Hungerford
                                       stuarth@csis.dit.csiro.au

---------------------------------Cut Here---------------------------------------
%!PS-Adobe-1.0
%%Title:  test.c
%%Creator: pps ($Header: pps.sh,v 0.0 88/06/22 05:22:29 on Rel $)
%%CreationDate: Sun Feb  4 13:35:25 EST 1990
%%For: stuarth@regulus
%%EndComments
%%$Header: pps.pro,v 0.0 88/06/22 05:22:26 on Rel $

% General macros ( should be builtins :-)

/inch { 72 mul } def
/min { 2 copy gt { exch } if pop } def
/max { 2 copy lt { exch } if pop } def
/curx { currentpoint pop } def
/cury { currentpoint exch pop } def

% Show a string, right justified, and move to its beginning.
/rshow {	% string
	dup stringwidth pop neg		% string width, negative
	dup 0 rmoveto
	exch show
	0 rmoveto			% to beginning of string
} def

% Commands

/fname {	% string fname -
	/filename exch def
	/pageno 0 def
	/lineno 1 def
	1 f
} def

/fdate {	% string fdate -
	/date exch def
} def

/funct {	% string funct -
	gsave
	C titlesize scalefont setfont

	fbase
	dontstep ( ) stringwidth pop sub cury min
	moveto
	90 rotate
	rshow
	/dontstep curx ( ) stringwidth pop sub def	% Yech!

	grestore
} def

/t {	% ntabs t -
	{ 
		curx 1 add
		tabwidth div ceiling
		tabwidth mul
		dup rlimit gt {
			pop
			lcont marshow
			1 nl
		} {
			cury moveto
		} ifelse
	} repeat
} def

/nl {	% nlines nl -	(internal use)
	{
		cury dy add
		dup
		highth neg le {
			pop
			1 f
		} {
			0 exch
			moveto
		} ifelse
	} repeat
} def

% Show a string in margins, if there is enough room.
/marshow {	% string marshow -	(internal)
	cury dight add dontstep lt {
		gsave

		C setfont
		width cury moveto
		rshow
		/dontstep cury def

		grestore
	} if
} def

/n {	% nlines n -
	dup lineno add
	/lineno exch def

	nl
	% Bug: does not number blank lines!
	lineres 0 gt {
		lineno lineres mod 0 eq {
			lineno maxline cvs marshow
		} if
	} if
} def

/np {	% npages np -	(internal)
	totalpage 0 gt {
 		showpage
	} if
	/totalpage totalpage 1 add def
	margin ury translate
	0 0 moveto
} def

/f {	% npages f -
	{
		np
		/pageno pageno 1 add def
		titleput
		pageno 1 gt {
%			lineno maxline cvs marshow
		} if
	} repeat
} def
	
/s {	% string font s -
	setfont

	dup stringwidth pop
	curx add
	rlimit gt {
		lcont marshow
		1 nl
	} if
	show
} def

% This is a halfhearted attempt.
% The ultimate thing is a printf() like specification from argv[].
/titleput { % - titleput -
	0 dy 3 mul rmoveto	% space for title

	C setfont
	date show

	C titlesize scalefont setfont

	width cury moveto
%	pageno maxpage cvs rshow

	curx (  ) stringwidth pop sub rlimit min
	cury moveto
	currentdict /header known {
		header
	} {
		filename
	} ifelse rshow

	/dontstep cury def
	0 cury dy 2 mul add moveto
} def

% Init macro - must be called after definitions are changed.

/ppsinit { % - ppsinit -
	gsave

	/dy	 1 inch lpi div neg def
	fonts {
		findfont dy neg progsize mul scalefont def
	} forall

	% Paper limits
	initclip clippath pathbbox
	/ury exch def
	/urx exch 10 sub def	% margin may be set wrong
	/lly exch def
	/llx exch def

	% Line numbers are right justified to width.
	% We force a newline when rlimit is exceeded by text.
	/highth ury lly sub dy add def
	/margin llx 1 inch add def
	/width urx margin sub def

	% UnderlinePosition or FontBBox may be missing...
	% Measure sizes of things we print in margins.
	C setfont
	/rlimit width maxline stringwidth pop sub def	% right limit

	newpath 0 0 moveto
	(670) true charpath flattenpath pathbbox
	/dight exch def					% digit ht
	pop pop pop

	C titlesize scalefont setfont
	newpath 0 0 moveto
	(qypfgj\(\),_) true charpath flattenpath pathbbox
	pop pop exch pop width add
	/fbase exch def					% function base

	I setfont
	/tabwidth (n) stringwidth pop tabstop mul def

	/totalpage 0 def

	grestore
} def

/ppsdone {
	showpage
} def

% Page style -- may be modified.

/tabstop 4 def  	% Charcters per tabstop
/lineres 1000 def  	% Line numbering resolution
/maxline (9999) def	% Maximum lines / file
/maxpage (999) def	% Maximum pages / file

/lpi 7 def       	% Lines per inch
/progsize 70 72 div def	% Program point size / line spacing
/titlesize 1.1 def	% Title point size / program point size

% Default fonts -- need not be fixed pitch.
/fonts 4 dict def
fonts begin
	/C /Courier def           	% Comments
	/K /Courier-Bold def		% Keywords
	/S /Courier def                 % Strings
	/I /Courier def			% The rest
end

/lcont (\274) def	% Line continuation char (ellipsis)
%%EndProlog
fonts /C /Courier-Oblique put fonts /S /Courier put /tabstop 4 def /lineres 1000 def /lpi 7.5 def ppsinit
(Feb  4 13:05 1990) fdate
(test.c) fname
(/*-------------------------------------------------*/) C s 1 n
(/* This is a comment.                              */) C s 1 n
(/*-------------------------------------------------*/) C s 1 n
(#) I s (include) K s ( <stdio.h>     ) I s (/* That was a keyword */) C s 1 n
%%Trailer
ppsdone

-- 

Signature out of order!
stuarth@csis.oz