summaryrefslogtreecommitdiff
path: root/Master/xemtex/gslib/errpage.ps
diff options
context:
space:
mode:
Diffstat (limited to 'Master/xemtex/gslib/errpage.ps')
-rw-r--r--Master/xemtex/gslib/errpage.ps363
1 files changed, 363 insertions, 0 deletions
diff --git a/Master/xemtex/gslib/errpage.ps b/Master/xemtex/gslib/errpage.ps
new file mode 100644
index 00000000000..7619205168c
--- /dev/null
+++ b/Master/xemtex/gslib/errpage.ps
@@ -0,0 +1,363 @@
+%!
+% Copyright (C) 1992, 1996, 1998 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: errpage.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Print an informative error page if an error occurs.
+% Inspired by Adobe's `ehandler.ps' and David Holzgang's PinPoint.
+
+/EPdict 80 dict def
+EPdict begin
+
+/escale 12 def
+/efont /Helvetica findfont escale scalefont def
+/eheight escale 1.2 mul def
+
+% Miscellaneous utilities
+/xdef
+ { exch def
+ } bind def
+
+% Define `show' equivalents of = and ==
+
+/show=
+ { =string { cvs } stopped { pop pop (==unprintable==) } if show
+ } bind def
+
+/.dict 18 dict def
+.dict begin
+ /.buf =string def
+ /.cvp {.buf cvs show} bind def
+ /.nop {(-) .p type .cvp (-) .p} bind def
+ /.p {show} bind def
+ /.p1 {( ) dup 0 4 -1 roll put show} bind def
+ /.print
+ {dup type .dict exch known
+ {dup type exec} {.nop} ifelse
+ } bind def
+ /integertype /.cvp load def
+ /nulltype { pop (null) .p } bind def
+ /realtype /.cvp load def
+ /booleantype /.cvp load def
+ /nametype
+ {dup xcheck not {(/) .p} if
+ dup length .buf length gt
+ {dup length string}
+ {.buf}
+ ifelse cvs .p} bind def
+ /arraytype
+ {dup rcheck
+ {dup xcheck {(})({)} {(])([)} ifelse .p
+ exch () exch
+ {exch .p .print ( )} forall pop .p}
+ {.nop}
+ ifelse} bind def
+ /operatortype
+ {(--) .p .cvp (--) .p} bind def
+ /packedarraytype /arraytype load def
+ /stringtype
+ {dup rcheck
+ {(\() .p
+ {/.ch exch def
+ .ch 32 lt .ch 127 ge or
+ {(\\) .p .ch 8#1000 add 8 .buf cvrs 1 3 getinterval .p}
+ {.ch 40 eq .ch 41 eq or .ch 92 eq or
+ {(\\) .p} if
+ .ch .p1}
+ ifelse}
+ forall (\)) .p}
+ {.nop}
+ ifelse} bind def
+end
+/show==
+ { .dict begin .print end
+ } bind def
+
+% Printing utilities
+
+/eol
+ { /ey ey eheight sub def
+ ex ey moveto
+ } bind def
+/setx
+ { /ex xdef ex ey moveto
+ } bind def
+/setxy
+ { /ey xdef /ex xdef
+ ex ey moveto
+ } bind def
+/indent
+ { /lx ex def
+ ( ) show currentpoint setxy
+ } bind def
+/unindent
+ { lx setx
+ } bind def
+
+% Get the name of the n'th dictionary on the (saved) dictionary stack.
+/nthdictname % n -> name true | false
+ { dup dstack exch get
+ exch -1 0
+ { dstack exch get
+ { 2 index eq { exch pop exit } { pop } ifelse
+ }
+ forall
+ dup type /nametype eq { exit } if
+ }
+ for
+ dup type /nametype eq { true } { pop false } ifelse
+ } bind def
+
+% Find the name of a currently executing procedure.
+/findprocname % <proctail> findprocname <dstackindex> <procname> true
+ % <proctail> findprocname false
+ { dup length /proclength xdef
+ dup type cvlit /proctype xdef
+ dstack length 1 sub -1 0
+ { dup dstack exch get
+ { dup type proctype eq
+ { dup rcheck { dup length } { -1 } ifelse proclength gt
+ { dup length proclength sub proclength getinterval 3 index eq
+ { 3 -1 roll pop exit }
+ { pop }
+ ifelse
+ }
+ { pop pop
+ }
+ ifelse
+ }
+ { pop pop
+ }
+ ifelse
+ }
+ forall
+ dup type /nametype eq { exit } if
+ pop
+ }
+ for
+ dup type /nametype eq { true } { pop false } ifelse
+ } bind def
+
+% Error printing routine.
+% The top 2 elements of the o-stack are systemdict and EPdict.
+% For the moment, we ignore the possibility of stack overflow or VMerror.
+/showerror % <command> <countexecstack> <errorname> showerror -
+ {
+ % Restore the error handlers.
+
+ saveerrordict { errordict 3 1 roll put } forall
+ $error /recordstacks false put
+
+ % Save information from the stacks.
+
+ /saveerror xdef
+ countexecstack array execstack
+ 0 3 -1 roll 1 sub getinterval
+ /estack xdef
+ /savecommand xdef
+
+ countdictstack array dictstack
+ dup length 2 sub 0 exch getinterval
+ /dstack xdef
+
+ % Save state variables that will be reset.
+ % (We could save and print a lot more of the graphics state.)
+
+ /savefont currentfont def
+ mark { savefont /FontName get =string cvs cvn } stopped
+ { cleartomark null }
+ { exch pop dup length 0 eq { pop null } if }
+ ifelse /savefontname xdef
+ efont setfont
+
+ { currentpoint } stopped { null null } if
+ /savey xdef /savex xdef
+ 0 0
+ { pop pop }
+ { pop pop 1 add }
+ { pop pop pop pop pop pop exch 1 add exch }
+ { }
+ pathforall
+ /savelines xdef /savecurves xdef
+ /savepathbbox { [ pathbbox ] } stopped { pop null } if def
+
+ initmatrix
+
+ clippath pathbbox
+ /savecliptop xdef /saveclipright xdef
+ /saveclipbottom xdef /saveclipleft xdef
+ initclip
+
+ initgraphics
+
+ % Eject the current page.
+
+ showpage
+
+ % Print the page heading.
+
+ 18 clippath pathbbox newpath
+ 4 1 roll pop pop pop eheight sub 12 sub setxy
+ product (Product: )
+ statusdict /printername known
+ { 100 string statusdict begin printername end
+ dup length 0 gt
+ { exch pop exch pop (Printer name: ) }
+ { pop }
+ ifelse
+ }
+ if show show eol
+ (Interpreter version ) show version show eol
+ (Error: ) show saveerror show= eol
+ (Command being executed: ) show /savecommand load show= eol
+ currentfile { fileposition } stopped
+ { pop }
+ { (Position in input file: ) show show= eol }
+ ifelse eol
+
+ % Print the current graphics state.
+
+ (Page parameters:) show eol indent
+ (page size: ) show
+ gsave clippath pathbbox grestore
+ exch 3 index sub show= (pt x ) show
+ exch sub show= (pt) show pop eol
+ (current position: ) show
+ savex null eq
+ { (none) show }
+ { (x = ) show savex show= (, y = ) show savey show= }
+ ifelse eol
+ savelines savecurves add 0 eq
+ { (current path is empty) show
+ }
+ { (current path: ) show savelines show= ( line(s), ) show
+ savecurves show= ( curve(s)) show eol
+ (path bounding box: ) show savepathbbox show==
+ }
+ ifelse eol
+ (current font: ) show
+ savefontname dup null eq
+ { pop (--no name--) show }
+ { show= ( ) show
+ gsave
+ savefontname findfont /FontMatrix get matrix invertmatrix
+ grestore
+ savefont /FontMatrix get matrix concatmatrix
+ dup 1 get 0 eq 1 index 2 get 0 eq and
+ 1 index 4 get 0 eq and 1 index 5 get 0 eq and
+ 1 index 0 get 2 index 3 get eq and
+ { 0 get show= (pt) show }
+ { (scaled by ) show show= }
+ ifelse
+ }
+ ifelse eol
+ eol unindent
+
+ % Print the operand stack.
+
+ /stky ey def
+ (Operand stack:) show eol indent
+ count { show== eol } repeat
+ eol unindent
+
+ % Print the dictionary stack.
+
+ (Dictionary stack:) show eol indent
+ dstack length 1 sub -1 0
+ { nthdictname { show= } { (<unknown>) show } ifelse eol
+ } for
+ eol unindent
+
+ % Print the execution stack.
+
+ 280 stky setxy
+ (Execution stack:) show eol indent
+ estack length 1 sub -1 1
+ { estack exch get
+ dup type /operatortype eq
+ { show= eol
+ }
+ { dup type dup /arraytype eq exch /packedarraytype eq or
+ { dup xcheck
+ { dup rcheck
+ { findprocname
+ { show= nthdictname { ( in ) show show= } if eol
+ }
+ if
+ }
+ { pop
+ }
+ ifelse
+ }
+ { pop
+ }
+ ifelse
+ }
+ { pop
+ }
+ ifelse
+ }
+ ifelse
+ } for eol unindent
+
+ % Print the next few lines of input.
+ % Unfortunately, this crashes on an Adobe printer.
+
+(
+ (Next few lines of input:) show eol indent
+ /input currentfile def
+ mark { 4
+ { input ( ) readstring not { pop exit } if
+ dup 0 get dup 10 eq
+ { pop pop eol 1 sub dup 0 eq { pop exit } if }
+ { dup 13 eq { pop pop } { pop show } ifelse }
+ ifelse
+ }
+ loop } stopped cleartomark eol unindent
+) pop
+
+ % Wrap up.
+
+ showpage
+ quit
+
+ } def
+
+% Define the common procedure for handling errors.
+/doerror
+ { systemdict begin EPdict begin showerror
+ } bind def
+
+end
+
+% Install our own error handlers.
+
+/EPinstall
+ { EPdict begin
+ /saveerrordict errordict length dict def
+ errordict saveerrordict copy pop
+ errordict
+ { pop [ /countexecstack load 2 index cvlit /doerror load /exec load ] cvx
+ errordict 3 1 roll put
+ } forall
+ errordict /handleerror
+ [ /countexecstack load /handleerror /doerror load /exec load
+ ] cvx
+ put
+ end
+ } bind def
+
+EPinstall