home *** CD-ROM | disk | FTP | other *** search
/ jppd.dyndns.org / jppd.dyndns.org.tar / jppd.dyndns.org / QUERYPRO / Impressora_PDF / converter.exe / GPLGS / uninfo.ps < prev    next >
Text File  |  2002-02-22  |  6KB  |  221 lines

  1. %!
  2. % Copyright (C) 1997 Aladdin Enterprises.  All rights reserved
  3. % This software is provided AS-IS with no warranty, either express or
  4. % implied.
  5. % This software is distributed under license and may not be copied,
  6. % modified or distributed except as expressly authorized under the terms
  7. % of the license contained in the file LICENSE in this distribution.
  8. % For more information about licensing, please refer to
  9. % http://www.ghostscript.com/licensing/. For information on
  10. % commercial licensing, go to http://www.artifex.com/licensing/ or
  11. % contact Artifex Software, Inc., 101 Lucas Valley Road #110,
  12. % San Rafael, CA  94903, U.S.A., +1(415)492-9861.
  13.  
  14. % $Id: uninfo.ps,v 1.4 2002/02/21 21:49:28 giles Exp $
  15. % uninfo.ps: Utilities for "printing" PostScript items, especially dictionaries
  16. % Usage:
  17. % (prefix-string) dict unprint
  18.  
  19. % Maximum Print-Width
  20. /HSpwidth 80 def
  21.  
  22. % any  HScvs string
  23. /HScvs {
  24. % Number-Syntax
  25.   dup type % stack: any /anytype
  26.   dup /integertype eq 1 index /realtype eq or { pop
  27.     16 string cvs
  28.   }{
  29. % Logical-Type
  30.     dup /booleantype eq { pop
  31.       5 string cvs
  32.     }{
  33. % Identifiers
  34.       dup /nametype eq { pop
  35.         dup length 1 add string
  36.         dup 0 (/) putinterval
  37.         exch 1 index 1 1 index length 1 sub getinterval cvs pop
  38.       }{
  39. % Strings
  40.         dup /stringtype eq { pop
  41. % ------- Compute Length
  42.           2 1 index { % stack: str len item
  43.             dup 32 lt 1 index 126 gt or { % need 4
  44.               pop 4 add
  45.             }{
  46.               dup 40 eq 1 index 41 eq or 1 index 92 eq or {
  47.                 pop 2 add
  48.               }{
  49.                 pop 1 add
  50.               } ifelse
  51.             } ifelse
  52.           } forall
  53. % ------- Allocate & Fill String
  54.           string dup 0 (\() putinterval 1
  55.           3 -1 roll { % outstr pos item
  56.             dup 32 lt 1 index 126 gt or {
  57.               dup 7 le {
  58.                 2 index 2 index (\\00) putinterval
  59.                 8 3 index 3 index 3 add 1 getinterval cvrs
  60.               }{
  61.                 dup 63 le {
  62.                   2 index 2 index (\\0) putinterval
  63.                   8 3 index 3 index 2 add 2 getinterval cvrs
  64.                 }{
  65.                   2 index 2 index (\\) putinterval
  66.                   8 3 index 3 index 1 add 3 getinterval cvrs
  67.                 } ifelse
  68.               } ifelse
  69.               pop 4 add
  70.             }{
  71.               dup 40 eq 1 index 41 eq or 1 index 92 eq or {
  72.                 2 index 2 index (\\) putinterval
  73.                 exch 1 add exch
  74.               } if
  75.               2 index exch 2 index exch put
  76.               1 add
  77.             } ifelse 
  78.           } forall
  79.           1 index exch (\)) putinterval
  80.         }{ exch pop
  81.           dup length 1 add string
  82.           dup 0 (-) putinterval
  83.           exch 1 index 1 1 index length 1 sub getinterval cvs pop
  84.           dup dup length 4 sub (-) putinterval
  85.           0 1 index length 3 sub getinterval
  86.         } ifelse
  87.       } ifelse
  88.     } ifelse
  89.   } ifelse
  90. } bind def
  91.  
  92. % int HSpindent - indent-spaces
  93. /HSpindent {
  94.   dup 0 gt {
  95.     1 1 3 -1 roll { pop ( ) print } for
  96.   }{
  97.     pop
  98.   } ifelse
  99. } bind def
  100.  
  101. % indent array HSaprint -> Print an Array
  102. /HSaprint {
  103.   dup type /arraytype eq {
  104.     ( [) print
  105.     exch 1 add dup 1 add
  106.     3 -1 roll { % rind pos item
  107.       HScvs dup length % rind pos str len
  108.       dup 3 index add HSpwidth ge {
  109.         (\n) print
  110.         3 index HSpindent
  111.         3 -1 roll pop
  112.         2 index add
  113.         exch
  114.       }{
  115.         ( ) print
  116.         2 index add 1 add 
  117.         3 -1 roll pop
  118.         exch
  119.       } ifelse
  120.       print
  121.     } forall
  122.     ( ]) print
  123.     pop pop
  124.   }{
  125.     ( ) print
  126.     HScvs print pop
  127.   } ifelse
  128.   (\n) print
  129. } bind def
  130.  
  131. % dict HSdnames dict names (creates sorted name-strings)
  132. /HSdnames {
  133. % Build namelist, stack: dic
  134.   dup length 0 eq {
  135.     []
  136.   }{
  137.     [ 1 index {
  138.         pop dup type /nametype eq {
  139.           dup length string cvs
  140.         }{ 
  141.           pop
  142.         } ifelse
  143.       } forall
  144.     ]
  145. % Sort the namelist, stack: dic nam
  146.     0 1 2 index length 2 sub { % stack: dic nam I
  147.       2 copy get % stack: pre dic nam I nam[I]
  148.       1 index 1 add 1 4 index length 1 sub { % stack: dic nam I nam[I] J
  149.         3 index 1 index get % dic nam I S[I] J S[J]
  150.         2 index 1 index gt { % swap them
  151.            4 index 2 index 4 index put 
  152.            4 index 4 index 2 index put
  153.            3 1 roll
  154.         } if
  155.         pop pop
  156.       } for
  157.       pop pop
  158.     } for
  159.   } ifelse
  160. } bind def
  161.  
  162. % string:prefix dict:which unprint
  163. /unprint {
  164.   HSdnames % pre dic nam
  165. % compute the maximum length
  166.   0 1 index { % pre dic nam maxlen nam[I]
  167.     length 2 copy lt { exch } if pop
  168.   } forall
  169. % Print out all the items, stack: pre dic nam maxlen
  170.   (\n) print  
  171.   exch { % pre dic maxlen nam[I]
  172. % no prefix yet, -> flush right
  173.     3 index length 0 eq {
  174.       dup length 2 index exch sub HSpindent
  175.     }{
  176.       3 index print (/) print
  177.     } ifelse 
  178. % print the name
  179.     dup print
  180. % prefix: fill up with blanks 
  181.     3 index length 0 ne {
  182.       dup length 2 index exch sub HSpindent
  183.     } if
  184. % now print the item itself, stack: pre dic maxlen nam[I]
  185.     2 index 1 index cvn get dup type % stack: pre dic maxlen nam[i] item typ 
  186. % Dict-Syntax
  187.     dup /dicttype eq { pop % stack: pre dic maxlen nam[i] item
  188.       ( ) print dup HScvs print
  189.       4 index length 0 eq { % brand new prefix
  190.         2 index string 0 1 5 index 1 sub { 1 index exch 32 put } for
  191.         dup 4 index 4 index length sub 5 -1 roll putinterval
  192.       }{
  193.         4 index length 1 add 2 index length add string
  194.         dup 0 7 index putinterval
  195.         dup 6 index length (/) putinterval
  196.         dup 6 index length 1 add 5 -1 roll putinterval
  197.       } ifelse
  198.       exch unprint
  199.     }{
  200.       3 -1 roll pop % tack: pre dic maxlen item typ
  201. % Array-Syntax
  202.       dup /arraytype eq { pop % stack: pre dic maxlen item
  203.         3 index length dup 0 ne { 1 add } if 2 index add 
  204.         exch HSaprint
  205.       }{ pop
  206.         ( ) print
  207.         HScvs print
  208.         (\n) print
  209.       } ifelse
  210.     } ifelse
  211.   } forall
  212.   pop pop length -1 eq { (\n) print } if
  213. } bind def
  214.  
  215. /currentpagedevice where { % check for currentpagedevice
  216.    /currentpagedevice get exec () exch unprint
  217. } if
  218.