[comp.lang.postscript] The Doctor is IN

jim@nih-csl.UUCP (jim sullivan) (02/09/89)

Here is a postscript routine I've written called Laser Doctor.  I want
to thank all those who sent me ideas to include in it, they were most
helpful.  This program, when sent to a postscript printer, will printout one
page with the following information.

	The printer name
	The version of postscript being used
	All fonts
	The painttype of each font (filled, stroked, etc...)
	An example of each font (some fonts, from wordprocessor
				 software and other software, will
				 cause an error whan selected.  In
				 this program, these errors are trapped
				 and an 'error implementing font' is
				 printed.)
	The status of virtual memory
	The status of cache memory
	A benchmark test (Time to print a graphic. This can be used to
			  measure the relative speeds of printers.)

There is room for improvement and additional features so if you make a
significant improvement, please share it with the net.  Some features
which were suggested I did not add, such as checking the status of the
attached disk drives, since we do not have any on our printers.  This was
tested on an Apple LaserWriter II and a TI Omnilaser 2115.

Enjoy!


------------------------------------ cut here -------------------------

%!
%% Laser Doctor, Version 1.0.0
%% Written by Jim Sullivan, January, 1989.
%% This was written out of a need to display as much information
%% about various Postscript Laserprinters onto one page.  More
%% can be added and anyone is free to modify it for their own
%% needs.

gsave

%% Beginning of definitions ********************************

/HB  {/Helvetica-Bold} def
/CBO {/Courier-BoldOblique} def
/C   {/Courier} def
/FF  {findfont} def
/SS  {scalefont setfont} def
/mt  {moveto} def
/s   {show} def
/fontname 30 string def
/getfont {pop fntnm cvs /fontname exch def} def
/fntnm 30 string def
/str 20 string def
/BOLD {CBO FF 10 SS} def
/NORMAL {C FF 10 SS} def
/cnt 0 def
/btime 0 def
/circleofbench
        { 15 15 345
            {gsave
               rotate 0 0 mt
               (Benchmark) oshow
             grestore
            } for
        } def
/oshow {true charpath stroke} def

%% End of definitions *****************************************

BOLD
200 756 mt
(Analysis by Doctor Laser, Version 1.0.0) s      %Print title
20 720 mt
NORMAL (This printer is a ) s
BOLD statusdict/product get str cvs s          %Gets the name of the
NORMAL ( running version ) s                   %printer from
BOLD version str cvs s                         %statusdict/product
NORMAL ( of Postscript.) s                     %and the version number
20 700 translate                               %of Postscript from the
                                               %'version' command
0 0 mt
(Available Fonts : (PaintType)FontName:Example of font) s   %Heading
0 -10 mt
(PaintType = 0\(filled\), 1\(stroked\), 2\(outlined\),) s
0 -20 mt
(            3\(mixed\), ?\(unknown\)) s
0 -30 translate

BOLD
FontDirectory {BOLD 0 0 mt                      %Push directory of fonts and
getfont                                         %get the fonts one at a time.
(\() s
{fontname cvn FF /PaintType get str cvs s} stopped {%ifelse
(?) s } {} ifelse              %Get the font's PaintType and print its value,
(\)) s                         %or if it is not supplied, print a '?'.

fontname s                     %Print the name of the font.

mark
fontname length 1 30 {(-) s} for   %Print dashes out to the font sample column.
(:) s                              %Print a colon.

{fontname cvn FF 10 SS ( ABCDEFGH abcdefgh) s } stopped {%ifelse
NORMAL (Error implementing font) s } {} ifelse      %Show a sample of each
cleartomark                                         %font.  If an error is
cnt 10 add                                          %trapped, print message
/cnt exch def                                       %indicating an error
0 -10 translate} forall                             %occurred.  Use the
NORMAL                                              %variable 'cnt' to count
cnt 30 add /cnt exch def                            %the number of fonts.

350 cnt mt                       %Move back up the page 'cnt' points.
(Virtual Memory Status:) s       %Print the Virtual Memory Status
0 0 translate                    %using 'vmstatus'.
370 cnt 20 sub mt
(Maximum Available Bytes = ) s BOLD vmstatus str cvs s NORMAL
370 cnt 30 sub mt
(Bytes currently in use  = ) s BOLD str cvs s NORMAL
370 cnt 40 sub mt
(Level of Save Nesting   = ) s BOLD str cvs s NORMAL
350 cnt 60 sub mt

(Cache status \(Red book p126\):) s  %Print out the cache status.
cachestatus
370 cnt 80 sub mt NORMAL (blimit = ) s BOLD str cvs s
370 cnt 90 sub mt NORMAL (  cmax = ) s BOLD str cvs s
370 cnt 100 sub mt NORMAL ( csize = ) s BOLD str cvs s
370 cnt 110 sub mt NORMAL (  mmax = ) s BOLD str cvs s
370 cnt 120 sub mt NORMAL ( msize = ) s BOLD str cvs s
370 cnt 130 sub mt NORMAL (  bmax = ) s BOLD str cvs s
370 cnt 140 sub mt NORMAL ( bsize = ) s BOLD str cvs s

usertime /btime exch def                %Print a graphic (circleofbench)
HB FF 12 SS                             %and time how long it takes for
430 cnt 230 sub translate               %the printer to interpret it.
.5 setlinewidth
circleofbench
0 0 moveto
(Benchmark Testing) true charpath
gsave 1 setgray fill grestore
stroke
-40 -80 mt
NORMAL
(Time to print) s
-40 -90 mt
(the above graphic) s
-40 -100 mt
(was ) s
BOLD
usertime btime sub 0.001 mul str cvs s  %Print out the time in seconds.
NORMAL
( seconds.) s
grestore
showpage

--------------------------------- cut here ----------------------------------

						Jim
						jim@alw.nih.gov