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

  1. %!
  2. %    Copyright (C) 1992, 1996, 1998 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: errpage.ps,v 1.2 2000/09/19 18:29:11 lpd Exp $
  17. % Print an informative error page if an error occurs.
  18. % Inspired by Adobe's `ehandler.ps' and David Holzgang's PinPoint.
  19.  
  20. /EPdict 80 dict def
  21. EPdict begin
  22.  
  23. /escale 12 def
  24. /efont /Helvetica findfont escale scalefont def
  25. /eheight escale 1.2 mul def
  26.  
  27. % Miscellaneous utilities
  28. /xdef
  29.  { exch def
  30.  } bind def
  31.  
  32. % Define `show' equivalents of = and ==
  33.  
  34. /show=
  35.  { =string { cvs } stopped { pop pop (==unprintable==) } if show
  36.  } bind def
  37.  
  38. /.dict 18 dict def
  39. .dict begin
  40.   /.buf =string def
  41.   /.cvp {.buf cvs show} bind def
  42.   /.nop {(-) .p type .cvp (-) .p} bind def
  43.   /.p {show} bind def
  44.   /.p1 {( ) dup 0 4 -1 roll put show} bind def
  45.   /.print
  46.     {dup type .dict exch known
  47.      {dup type exec} {.nop} ifelse
  48.     } bind def
  49.   /integertype /.cvp load def
  50.   /nulltype { pop (null) .p } bind def
  51.   /realtype /.cvp load def
  52.   /booleantype /.cvp load def
  53.   /nametype
  54.     {dup xcheck not {(/) .p} if
  55.      dup length .buf length gt
  56.       {dup length string}
  57.       {.buf}
  58.      ifelse cvs .p} bind def
  59.   /arraytype
  60.     {dup rcheck
  61.       {dup xcheck {(})({)} {(])([)} ifelse .p
  62.        exch () exch
  63.        {exch .p .print ( )} forall pop .p}
  64.       {.nop}
  65.      ifelse} bind def
  66.   /operatortype
  67.       {(--) .p .cvp (--) .p} bind def
  68.   /packedarraytype /arraytype load def
  69.   /stringtype
  70.     {dup rcheck
  71.       {(\() .p
  72.        {/.ch exch def
  73.         .ch 32 lt .ch 127 ge or
  74.         {(\\) .p .ch 8#1000 add 8 .buf cvrs 1 3 getinterval .p}
  75.         {.ch 40 eq .ch 41 eq or .ch 92 eq or
  76.          {(\\) .p} if
  77.          .ch .p1}
  78.         ifelse}
  79.        forall (\)) .p}
  80.       {.nop}
  81.      ifelse} bind def
  82. end
  83. /show==
  84.  { .dict begin .print end
  85.  } bind def
  86.  
  87. % Printing utilities
  88.  
  89. /eol
  90.  { /ey ey eheight sub def
  91.    ex ey moveto
  92.  } bind def
  93. /setx
  94.  { /ex xdef ex ey moveto
  95.  } bind def
  96. /setxy
  97.  { /ey xdef /ex xdef
  98.    ex ey moveto
  99.  } bind def
  100. /indent
  101.  { /lx ex def
  102.    (    ) show currentpoint setxy
  103.  } bind def
  104. /unindent
  105.  { lx setx
  106.  } bind def
  107.  
  108. % Get the name of the n'th dictionary on the (saved) dictionary stack.
  109. /nthdictname    % n -> name true | false
  110.  { dup dstack exch get
  111.    exch -1 0
  112.     { dstack exch get
  113.        { 2 index eq { exch pop exit } { pop } ifelse
  114.        }
  115.       forall
  116.       dup type /nametype eq { exit } if
  117.     }
  118.    for
  119.    dup type /nametype eq { true } { pop false } ifelse
  120.  } bind def
  121.  
  122. % Find the name of a currently executing procedure.
  123. /findprocname    % <proctail> findprocname <dstackindex> <procname> true
  124.         % <proctail> findprocname false
  125.  { dup length /proclength xdef
  126.    dup type cvlit /proctype xdef
  127.    dstack length 1 sub -1 0
  128.     { dup dstack exch get
  129.        { dup type proctype eq
  130.           { dup rcheck { dup length } { -1 } ifelse proclength gt
  131.          { dup length proclength sub proclength getinterval 3 index eq
  132.             { 3 -1 roll pop exit }
  133.         { pop }
  134.            ifelse
  135.          }
  136.          { pop pop
  137.          }
  138.         ifelse
  139.       }
  140.       { pop pop
  141.       }
  142.      ifelse
  143.        }
  144.       forall
  145.       dup type /nametype eq { exit } if
  146.       pop
  147.     }
  148.    for
  149.    dup type /nametype eq { true } { pop false } ifelse
  150.  } bind def
  151.  
  152. % Error printing routine.
  153. % The top 2 elements of the o-stack are systemdict and EPdict.
  154. % For the moment, we ignore the possibility of stack overflow or VMerror.
  155. /showerror    % <command> <countexecstack> <errorname> showerror -
  156.  {
  157.     % Restore the error handlers.
  158.  
  159.    saveerrordict { errordict 3 1 roll put } forall
  160.    $error /recordstacks false put
  161.  
  162.     % Save information from the stacks.
  163.  
  164.    /saveerror xdef
  165.    countexecstack array execstack
  166.    0 3 -1 roll 1 sub getinterval
  167.    /estack xdef
  168.    /savecommand xdef
  169.  
  170.    countdictstack array dictstack
  171.    dup length 2 sub 0 exch getinterval
  172.    /dstack xdef
  173.  
  174.     % Save state variables that will be reset.
  175.     % (We could save and print a lot more of the graphics state.)
  176.  
  177.    /savefont currentfont def
  178.    mark { savefont /FontName get =string cvs cvn } stopped
  179.     { cleartomark null }
  180.     { exch pop dup length 0 eq { pop null } if }
  181.    ifelse /savefontname xdef
  182.    efont setfont
  183.  
  184.     { currentpoint } stopped { null null } if
  185.    /savey xdef /savex xdef
  186.    0 0
  187.     { pop pop }
  188.     { pop pop 1 add }
  189.     { pop pop pop pop pop pop exch 1 add exch }
  190.     { }
  191.    pathforall
  192.    /savelines xdef /savecurves xdef
  193.    /savepathbbox { [ pathbbox ] } stopped { pop null } if def
  194.  
  195.    initmatrix
  196.  
  197.    clippath pathbbox
  198.      /savecliptop xdef /saveclipright xdef
  199.      /saveclipbottom xdef /saveclipleft xdef
  200.    initclip
  201.  
  202.    initgraphics
  203.  
  204.     % Eject the current page.
  205.  
  206.    showpage
  207.  
  208.     % Print the page heading.
  209.  
  210.    18 clippath pathbbox newpath
  211.    4 1 roll pop pop pop eheight sub 12 sub setxy
  212.    product (Product: )
  213.    statusdict /printername known
  214.     { 100 string statusdict begin printername end
  215.       dup length 0 gt
  216.        { exch pop exch pop (Printer name: ) }
  217.        { pop }
  218.       ifelse
  219.     }
  220.    if show show eol
  221.    (Interpreter version ) show version show eol
  222.    (Error: ) show saveerror show= eol
  223.    (Command being executed: ) show /savecommand load show= eol
  224.    currentfile { fileposition } stopped
  225.     { pop }
  226.     { (Position in input file: ) show show= eol }
  227.    ifelse eol
  228.  
  229.     % Print the current graphics state.
  230.  
  231.    (Page parameters:) show eol indent
  232.    (page size: ) show
  233.      gsave clippath pathbbox grestore
  234.      exch 3 index sub show= (pt x ) show
  235.      exch sub show= (pt) show pop eol
  236.    (current position: ) show
  237.    savex null eq
  238.     { (none) show }
  239.     { (x = ) show savex show= (, y = ) show savey show= }
  240.    ifelse eol
  241.    savelines savecurves add 0 eq
  242.     { (current path is empty) show
  243.     }
  244.     { (current path: ) show savelines show= ( line(s), ) show
  245.       savecurves show= ( curve(s)) show eol
  246.       (path bounding box: ) show savepathbbox show==
  247.     }
  248.    ifelse eol
  249.    (current font: ) show
  250.      savefontname dup null eq
  251.       { pop (--no name--) show }
  252.       { show= ( ) show
  253.         gsave
  254.         savefontname findfont /FontMatrix get matrix invertmatrix
  255.     grestore
  256.         savefont /FontMatrix get matrix concatmatrix
  257.     dup 1 get 0 eq 1 index 2 get 0 eq and
  258.     1 index 4 get 0 eq and 1 index 5 get 0 eq and
  259.     1 index 0 get 2 index 3 get eq and
  260.      { 0 get show= (pt) show }
  261.      { (scaled by ) show show= }
  262.     ifelse
  263.       }
  264.      ifelse eol
  265.    eol unindent
  266.  
  267.     % Print the operand stack.
  268.  
  269.    /stky ey def
  270.    (Operand stack:) show eol indent
  271.    count { show== eol } repeat
  272.    eol unindent
  273.  
  274.     % Print the dictionary stack.
  275.  
  276.    (Dictionary stack:) show eol indent
  277.    dstack length 1 sub -1 0
  278.     { nthdictname { show= } { (<unknown>) show } ifelse eol
  279.     } for
  280.    eol unindent
  281.  
  282.     % Print the execution stack.
  283.  
  284.    280 stky setxy
  285.    (Execution stack:) show eol indent
  286.    estack length 1 sub -1 1
  287.     { estack exch get
  288.       dup type /operatortype eq
  289.        { show= eol
  290.        }
  291.        { dup type dup /arraytype eq exch /packedarraytype eq or
  292.           { dup xcheck
  293.          { dup rcheck
  294.             { findprocname
  295.            { show= nthdictname { ( in ) show show= } if eol
  296.            }
  297.           if
  298.         }
  299.         { pop
  300.         }
  301.            ifelse
  302.          }
  303.          { pop
  304.          }
  305.         ifelse
  306.       }
  307.       { pop
  308.       }
  309.      ifelse
  310.        }
  311.       ifelse
  312.     } for eol unindent
  313.  
  314.     % Print the next few lines of input.
  315.     % Unfortunately, this crashes on an Adobe printer.
  316.  
  317. (
  318.    (Next few lines of input:) show eol indent
  319.    /input currentfile def
  320.    mark { 4
  321.     { input ( ) readstring not { pop exit } if
  322.       dup 0 get dup 10 eq
  323.        { pop pop eol 1 sub dup 0 eq { pop exit } if }
  324.        { dup 13 eq { pop pop } { pop show } ifelse }
  325.       ifelse
  326.     }
  327.    loop } stopped cleartomark eol unindent
  328. ) pop
  329.  
  330.     % Wrap up.
  331.  
  332.    showpage
  333.    quit
  334.  
  335.  } def
  336.  
  337. % Define the common procedure for handling errors.
  338. /doerror
  339.  { systemdict begin EPdict begin showerror
  340.  } bind def
  341.  
  342. end
  343.  
  344. % Install our own error handlers.
  345.  
  346. /EPinstall
  347.  { EPdict begin
  348.    /saveerrordict errordict length dict def
  349.    errordict saveerrordict copy pop
  350.    errordict
  351.     { pop [ /countexecstack load 2 index cvlit /doerror load /exec load ] cvx
  352.       errordict 3 1 roll put
  353.     } forall
  354.    errordict /handleerror
  355.      [ /countexecstack load /handleerror /doerror load /exec load
  356.      ] cvx
  357.    put
  358.    end
  359.  } bind def
  360.  
  361. EPinstall
  362.