#! /bin/sh

# This is a PostScript program wrapped as a shell script.

# copyright 1987 by Peter Greenberg. You may use, copy, or redistribute this
# work freely so long as this message and the copyright message are retained.

# comments/bug fixes to:
# Peter Greenberg
# Swarthmore College
# Swarthmore, PA 19081
# (215) 328-8610
# UUCP: ...!seismo!bpa!swatsun!greenber
# ARPA: swatsun!greenber@seismo.CSS.GOV

# USAGE:
# mapfont [mapfrom [mapto]]
# defaults: mapfrom=Courier ; mapto=Helvetica

# CHANGE THESE LINES TO USE ANTOHER SPOOLER
spooler=lpr
spoolopts=

case $# in
	0) FONT1=Courier ; FONT2=Helvetica ;;
	1) FONT1=Courier ; FONT2=$1 ;;
	*) FONT1=$1 ; FONT2=$2 ;;
esac

cat <<End-Of-Main-Stuff | $spooler $spoolopts
%!
/Font1 /$FONT1 def
/Font2 /$FONT2 def
% This program maps one PostScript font to another. For each character
% code in a specific range, this program will print (to the actual page)
% the character code in octal, the character in Font1, then the character
% in Font2. The reason for this is to show which characters are associated
% with which ASCII codes in each font. It is especially useful to see what
% non-alphabetical fonts like Symbol and ZapfDingbats have to offer. 
% The output is in neat columns, determined by taking into account the
% left and right margins and top and bottom margins and the pitch of the 
% characters. Presently these are set to produce a nice looking 8.5 x 11 inch
% page but this can be fiddled with.

% Unfortunately, this program takes about 3 minutes to execute on an LW+.

/ArrayToStr
{
	/Array exch def
	/Length Array length def
	/Str Length string def
	
	0 1 Length 1 sub { Str exch dup Array exch get put } for
	Str
} bind def

/IntToChar %char is a one character string
{
	/Int exch def
	/Str 1 string def
	Str 0 Int put
	Str
} def

/FontSet 
{
	findfont Size scalefont setfont
} bind def
 
/IntToOctString { %integer. Only handles 3-digit octal (0..511)
	/DecInt exch def	
	/OctStr 3 string def
	OctStr 0 DecInt 64 idiv 48 add put
	/DecInt DecInt 64 mod def
	OctStr 1 DecInt 8 idiv 48 add put
	/DecInt DecInt 8 mod def 
	OctStr 2 DecInt 48 add put
	OctStr
} bind def

/inch { 72 mul } def

/Top 9.5 inch def
/Bottom 0.5 inch def
/Left 0.5 inch def
/Right 7 inch def
/Size 12 def
/Lineheight Size 5 add def
/FirstChar 0 def
/LastChar 255 def
/SpaceStr (: ) def

/CharsPerCol Top Bottom sub Lineheight div cvi def
/ColPerPage  LastChar FirstChar sub CharsPerCol div cvi def
/ColWidth Right Left sub ColPerPage div cvi def

 Left Top 0.5 inch add moveto
Font1 FontSet
(Mapping from ) show Font1 80 string cvs show ( to ) show Font2 80 string cvs 
	show
/PresentCol Left def
/PresentRow Top def
FirstChar 1 LastChar {
	/ThisChar exch def
	PresentCol PresentRow moveto
	Font1 FontSet
	ThisChar dup IntToOctString show ( ) show 
	IntToChar dup show SpaceStr show
	Font2 FontSet show
	/PresentRow PresentRow Lineheight sub def
	PresentRow Bottom lt { 
		/PresentRow Top def 
		/PresentCol PresentCol ColWidth add def
	} if
} bind for 
showpage
End-Of-Main-Stuff

exit 0
.
