diff options
Diffstat (limited to 'Master/xemtex/gslib/uninfo.ps')
-rw-r--r-- | Master/xemtex/gslib/uninfo.ps | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/Master/xemtex/gslib/uninfo.ps b/Master/xemtex/gslib/uninfo.ps new file mode 100644 index 00000000000..211d3af15a5 --- /dev/null +++ b/Master/xemtex/gslib/uninfo.ps @@ -0,0 +1,221 @@ +%! +% Copyright (C) 1997 Aladdin Enterprises. All rights reserved +% +% This program is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 2 of the License, or (at your +% option) any later version. +% +% This program is distributed in the hope that it will be useful, but +% WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +% Public License for more details. +% +% You should have received a copy of the GNU General Public License along +% with this program; if not, write to the Free Software Foundation, Inc., +% 59 Temple Place, Suite 330, Boston, MA, 02111-1307. + +% $Id: uninfo.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $ +% uninfo.ps: Utilities for "printing" PostScript items, especially dictionaries +% Usage: +% (prefix-string) dict unprint + +% Maximum Print-Width +/HSpwidth 80 def + +% any HScvs string +/HScvs { +% Number-Syntax + dup type % stack: any /anytype + dup /integertype eq 1 index /realtype eq or { pop + 16 string cvs + }{ +% Logical-Type + dup /booleantype eq { pop + 5 string cvs + }{ +% Identifiers + dup /nametype eq { pop + dup length 1 add string + dup 0 (/) putinterval + exch 1 index 1 1 index length 1 sub getinterval cvs pop + }{ +% Strings + dup /stringtype eq { pop +% ------- Compute Length + 2 1 index { % stack: str len item + dup 32 lt 1 index 126 gt or { % need 4 + pop 4 add + }{ + dup 40 eq 1 index 41 eq or 1 index 92 eq or { + pop 2 add + }{ + pop 1 add + } ifelse + } ifelse + } forall +% ------- Allocate & Fill String + string dup 0 (\() putinterval 1 + 3 -1 roll { % outstr pos item + dup 32 lt 1 index 126 gt or { + dup 7 le { + 2 index 2 index (\\00) putinterval + 8 3 index 3 index 3 add 1 getinterval cvrs + }{ + dup 63 le { + 2 index 2 index (\\0) putinterval + 8 3 index 3 index 2 add 2 getinterval cvrs + }{ + 2 index 2 index (\\) putinterval + 8 3 index 3 index 1 add 3 getinterval cvrs + } ifelse + } ifelse + pop 4 add + }{ + dup 40 eq 1 index 41 eq or 1 index 92 eq or { + 2 index 2 index (\\) putinterval + exch 1 add exch + } if + 2 index exch 2 index exch put + 1 add + } ifelse + } forall + 1 index exch (\)) putinterval + }{ exch pop + dup length 1 add string + dup 0 (-) putinterval + exch 1 index 1 1 index length 1 sub getinterval cvs pop + dup dup length 4 sub (-) putinterval + 0 1 index length 3 sub getinterval + } ifelse + } ifelse + } ifelse + } ifelse +} bind def + +% int HSpindent - indent-spaces +/HSpindent { + dup 0 gt { + 1 1 3 -1 roll { pop ( ) print } for + }{ + pop + } ifelse +} bind def + +% indent array HSaprint -> Print an Array +/HSaprint { + dup type /arraytype eq { + ( [) print + exch 1 add dup 1 add + 3 -1 roll { % rind pos item + HScvs dup length % rind pos str len + dup 3 index add HSpwidth ge { + (\n) print + 3 index HSpindent + 3 -1 roll pop + 2 index add + exch + }{ + ( ) print + 2 index add 1 add + 3 -1 roll pop + exch + } ifelse + print + } forall + ( ]) print + pop pop + }{ + ( ) print + HScvs print pop + } ifelse + (\n) print +} bind def + +% dict HSdnames dict names (creates sorted name-strings) +/HSdnames { +% Build namelist, stack: dic + dup length 0 eq { + [] + }{ + [ 1 index { + pop dup type /nametype eq { + dup length string cvs + }{ + pop + } ifelse + } forall + ] +% Sort the namelist, stack: dic nam + 0 1 2 index length 2 sub { % stack: dic nam I + 2 copy get % stack: pre dic nam I nam[I] + 1 index 1 add 1 4 index length 1 sub { % stack: dic nam I nam[I] J + 3 index 1 index get % dic nam I S[I] J S[J] + 2 index 1 index gt { % swap them + 4 index 2 index 4 index put + 4 index 4 index 2 index put + 3 1 roll + } if + pop pop + } for + pop pop + } for + } ifelse +} bind def + +% string:prefix dict:which unprint +/unprint { + HSdnames % pre dic nam +% compute the maximum length + 0 1 index { % pre dic nam maxlen nam[I] + length 2 copy lt { exch } if pop + } forall +% Print out all the items, stack: pre dic nam maxlen + (\n) print + exch { % pre dic maxlen nam[I] +% no prefix yet, -> flush right + 3 index length 0 eq { + dup length 2 index exch sub HSpindent + }{ + 3 index print (/) print + } ifelse +% print the name + dup print +% prefix: fill up with blanks + 3 index length 0 ne { + dup length 2 index exch sub HSpindent + } if +% now print the item itself, stack: pre dic maxlen nam[I] + 2 index 1 index cvn get dup type % stack: pre dic maxlen nam[i] item typ +% Dict-Syntax + dup /dicttype eq { pop % stack: pre dic maxlen nam[i] item + ( ) print dup HScvs print + 4 index length 0 eq { % brand new prefix + 2 index string 0 1 5 index 1 sub { 1 index exch 32 put } for + dup 4 index 4 index length sub 5 -1 roll putinterval + }{ + 4 index length 1 add 2 index length add string + dup 0 7 index putinterval + dup 6 index length (/) putinterval + dup 6 index length 1 add 5 -1 roll putinterval + } ifelse + exch unprint + }{ + 3 -1 roll pop % tack: pre dic maxlen item typ +% Array-Syntax + dup /arraytype eq { pop % stack: pre dic maxlen item + 3 index length dup 0 ne { 1 add } if 2 index add + exch HSaprint + }{ pop + ( ) print + HScvs print + (\n) print + } ifelse + } ifelse + } forall + pop pop length -1 eq { (\n) print } if +} bind def + +/currentpagedevice where { % check for currentpagedevice + /currentpagedevice get exec () exch unprint +} if |