home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 April / PCWorld_2001-04_cd.bin / Software / Vyzkuste / gs / gs650w32.exe / gs6.50 / lib / uninfo.ps < prev    next >
Text File  |  2000-12-05  |  6KB  |  223 lines

  1. %!
  2. % Copyright (C) 1997 Aladdin Enterprises.  All rights reserved
  3. % This file is part of AFPL Ghostscript.
  4. % AFPL Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author or
  5. % distributor accepts any responsibility for the consequences of using it, or
  6. % for whether it serves any particular purpose or works at all, unless he or
  7. % she says so in writing.  Refer to the Aladdin Free Public License (the
  8. % "License") for full details.
  9. % Every copy of AFPL Ghostscript must include a copy of the License, normally
  10. % in a plain ASCII text file named PUBLIC.  The License grants you the right
  11. % to copy, modify and redistribute AFPL Ghostscript, but only under certain
  12. % conditions described in the License.  Among other things, the License
  13. % requires that the copyright notice and this notice be preserved on all
  14. % copies.
  15.  
  16. % $Id: uninfo.ps,v 1.2 2000/09/19 18:29:11 lpd Exp $
  17. % uninfo.ps: Utilities for "printing" PostScript items, especially dictionaries
  18. % Usage:
  19. % (prefix-string) dict unprint
  20.  
  21. % Maximum Print-Width
  22. /HSpwidth 80 def
  23.  
  24. % any  HScvs string
  25. /HScvs {
  26. % Number-Syntax
  27.   dup type % stack: any /anytype
  28.   dup /integertype eq 1 index /realtype eq or { pop
  29.     16 string cvs
  30.   }{
  31. % Logical-Type
  32.     dup /booleantype eq { pop
  33.       5 string cvs
  34.     }{
  35. % Identifiers
  36.       dup /nametype eq { pop
  37.         dup length 1 add string
  38.         dup 0 (/) putinterval
  39.         exch 1 index 1 1 index length 1 sub getinterval cvs pop
  40.       }{
  41. % Strings
  42.         dup /stringtype eq { pop
  43. % ------- Compute Length
  44.           2 1 index { % stack: str len item
  45.             dup 32 lt 1 index 126 gt or { % need 4
  46.               pop 4 add
  47.             }{
  48.               dup 40 eq 1 index 41 eq or 1 index 92 eq or {
  49.                 pop 2 add
  50.               }{
  51.                 pop 1 add
  52.               } ifelse
  53.             } ifelse
  54.           } forall
  55. % ------- Allocate & Fill String
  56.           string dup 0 (\() putinterval 1
  57.           3 -1 roll { % outstr pos item
  58.             dup 32 lt 1 index 126 gt or {
  59.               dup 7 le {
  60.                 2 index 2 index (\\00) putinterval
  61.                 8 3 index 3 index 3 add 1 getinterval cvrs
  62.               }{
  63.                 dup 63 le {
  64.                   2 index 2 index (\\0) putinterval
  65.                   8 3 index 3 index 2 add 2 getinterval cvrs
  66.                 }{
  67.                   2 index 2 index (\\) putinterval
  68.                   8 3 index 3 index 1 add 3 getinterval cvrs
  69.                 } ifelse
  70.               } ifelse
  71.               pop 4 add
  72.             }{
  73.               dup 40 eq 1 index 41 eq or 1 index 92 eq or {
  74.                 2 index 2 index (\\) putinterval
  75.                 exch 1 add exch
  76.               } if
  77.               2 index exch 2 index exch put
  78.               1 add
  79.             } ifelse 
  80.           } forall
  81.           1 index exch (\)) putinterval
  82.         }{ exch pop
  83.           dup length 1 add string
  84.           dup 0 (-) putinterval
  85.           exch 1 index 1 1 index length 1 sub getinterval cvs pop
  86.           dup dup length 4 sub (-) putinterval
  87.           0 1 index length 3 sub getinterval
  88.         } ifelse
  89.       } ifelse
  90.     } ifelse
  91.   } ifelse
  92. } bind def
  93.  
  94. % int HSpindent - indent-spaces
  95. /HSpindent {
  96.   dup 0 gt {
  97.     1 1 3 -1 roll { pop ( ) print } for
  98.   }{
  99.     pop
  100.   } ifelse
  101. } bind def
  102.  
  103. % indent array HSaprint -> Print an Array
  104. /HSaprint {
  105.   dup type /arraytype eq {
  106.     ( [) print
  107.     exch 1 add dup 1 add
  108.     3 -1 roll { % rind pos item
  109.       HScvs dup length % rind pos str len
  110.       dup 3 index add HSpwidth ge {
  111.         (\n) print
  112.         3 index HSpindent
  113.         3 -1 roll pop
  114.         2 index add
  115.         exch
  116.       }{
  117.         ( ) print
  118.         2 index add 1 add 
  119.         3 -1 roll pop
  120.         exch
  121.       } ifelse
  122.       print
  123.     } forall
  124.     ( ]) print
  125.     pop pop
  126.   }{
  127.     ( ) print
  128.     HScvs print pop
  129.   } ifelse
  130.   (\n) print
  131. } bind def
  132.  
  133. % dict HSdnames dict names (creates sorted name-strings)
  134. /HSdnames {
  135. % Build namelist, stack: dic
  136.   dup length 0 eq {
  137.     []
  138.   }{
  139.     [ 1 index {
  140.         pop dup type /nametype eq {
  141.           dup length string cvs
  142.         }{ 
  143.           pop
  144.         } ifelse
  145.       } forall
  146.     ]
  147. % Sort the namelist, stack: dic nam
  148.     0 1 2 index length 2 sub { % stack: dic nam I
  149.       2 copy get % stack: pre dic nam I nam[I]
  150.       1 index 1 add 1 4 index length 1 sub { % stack: dic nam I nam[I] J
  151.         3 index 1 index get % dic nam I S[I] J S[J]
  152.         2 index 1 index gt { % swap them
  153.            4 index 2 index 4 index put 
  154.            4 index 4 index 2 index put
  155.            3 1 roll
  156.         } if
  157.         pop pop
  158.       } for
  159.       pop pop
  160.     } for
  161.   } ifelse
  162. } bind def
  163.  
  164. % string:prefix dict:which unprint
  165. /unprint {
  166.   HSdnames % pre dic nam
  167. % compute the maximum length
  168.   0 1 index { % pre dic nam maxlen nam[I]
  169.     length 2 copy lt { exch } if pop
  170.   } forall
  171. % Print out all the items, stack: pre dic nam maxlen
  172.   (\n) print  
  173.   exch { % pre dic maxlen nam[I]
  174. % no prefix yet, -> flush right
  175.     3 index length 0 eq {
  176.       dup length 2 index exch sub HSpindent
  177.     }{
  178.       3 index print (/) print
  179.     } ifelse 
  180. % print the name
  181.     dup print
  182. % prefix: fill up with blanks 
  183.     3 index length 0 ne {
  184.       dup length 2 index exch sub HSpindent
  185.     } if
  186. % now print the item itself, stack: pre dic maxlen nam[I]
  187.     2 index 1 index cvn get dup type % stack: pre dic maxlen nam[i] item typ 
  188. % Dict-Syntax
  189.     dup /dicttype eq { pop % stack: pre dic maxlen nam[i] item
  190.       ( ) print dup HScvs print
  191.       4 index length 0 eq { % brand new prefix
  192.         2 index string 0 1 5 index 1 sub { 1 index exch 32 put } for
  193.         dup 4 index 4 index length sub 5 -1 roll putinterval
  194.       }{
  195.         4 index length 1 add 2 index length add string
  196.         dup 0 7 index putinterval
  197.         dup 6 index length (/) putinterval
  198.         dup 6 index length 1 add 5 -1 roll putinterval
  199.       } ifelse
  200.       exch unprint
  201.     }{
  202.       3 -1 roll pop % tack: pre dic maxlen item typ
  203. % Array-Syntax
  204.       dup /arraytype eq { pop % stack: pre dic maxlen item
  205.         3 index length dup 0 ne { 1 add } if 2 index add 
  206.         exch HSaprint
  207.       }{ pop
  208.         ( ) print
  209.         HScvs print
  210.         (\n) print
  211.       } ifelse
  212.     } ifelse
  213.   } forall
  214.   pop pop length -1 eq { (\n) print } if
  215. } bind def
  216.  
  217. /currentpagedevice where { % check for currentpagedevice
  218.    /currentpagedevice get exec () exch unprint
  219. } if
  220.