%% ----------------------------------------------------------------------
%% (C) 1991 Commodore-Amiga (written by L. Vanhelsuwe)
%% ----------------------------------------------------------------------
%% Amiga Postscript error handling mechanism initialisation.
%% This file creates all the error procedures and the $error dictionary.
%% See p.56 in the Red Book for more details.
%% On entry we're inside systemdict.
%% ----------------------------------------------------------------------

/genericE				% generic error handler

{ $error exch /errorname exch put				% remember error name
  $error exch /command  exch put				% remember offending command 
  $error /newerror true put						% tell handleerror to process
  $error /command get type /stringtype eq {
	 $error /command get length 128 gt {		% if cmd string >128
		$error /command get 0 128 getinterval	% chop it down to 128 chars
		$error exch /command exch put			% and store back
		 } if
	} if
  $error  /errorname  get /VMerror  ne {		% am I a VM error ? no,
	$error  /ostackarray  get null eq {			% has ostackarr been defined yet?
		$error  /estackarray 250 array put			% no, so define all three arrays
		$error  /ostackarray 500  array  put 
	 	$error  /dstackarray 20  array  put
	} if

%	count 
% 	$error /ostackarray get exch 0 exch getinterval astore
%	$error exch /ostack exch put

%	$error /dstack
%    $error /dstackarray get dictstack put

%	$error /estack
%	$error /estackarray get execstack dup length 2 sub 0 exch getinterval put

%	$error  /ostack  get aload  pop
	} if										% if not VM error

  $error /initializing get {handleerror} if
  stop } def

errordict begin					% going into errordict

%-----------------------------	Fill errordict with procedures for each error type

/unregistered		{/unregistered		genericE exec }			def
/undefinedresult	{/undefinedresult	genericE exec }			def
/interrupt			{ $error /errorname /interrupt put stop }	def
/undefined			{/undefined			genericE exec }			def
/dictstackunderflow	{/dictstackunderflow genericE exec }		def
/stackoverflow		{/stackoverflow		genericE exec }			def
/invalidrestore		{/invalidrestore	genericE exec }			def
/nocurrentpoint		{/nocurrentpoint	genericE exec }			def
/ioerror			{/ioerror			genericE exec }			def
/dictfull			{/dictfull			genericE exec }			def
/dictstackoverflow	{/dictstackoverflow genericE exec }			def
/limitcheck			{/limitcheck		genericE exec }			def
/unmatchedmark		{/unmatchedmark		genericE exec }			def
/undefinedfilename	{/undefinedfilename genericE exec }			def
/VMerror			{/VMerror			genericE exec }			def
/timeout			{/timeout /timeout	genericE exec }			def
/rangecheck			{/rangecheck		genericE exec }			def
/execstackoverflow	{/execstackoverflow	genericE exec }			def
/typecheck			{/typecheck			genericE exec }			def
/invalidfileaccess	{/invalidfileaccess	genericE exec }			def
/invalidfont		{/invalidfont		genericE exec }			def
/invalidaccess		{/invalidaccess		genericE exec }			def
/stackunderflow		{/stackunderflow	genericE exec }			def
/invalidexit		{/invalidexit		genericE exec }			def
/syntaxerror		{/syntaxerror		genericE exec }			def
% temporary error for unimplemented commands
/notimplemented		{/notimplemented	genericE exec }			def

/handleerror

{	$error begin
	newerror 
	{	/newerror false def

		(%%[ Error: ) print
		errorname { dup  type /stringtype ne
			{20 string cvs } if
		print } exec

		(; OffendingCommand: ) print
		/command load { dup type /stringtype ne
			{105 string  cvs } if
		print } exec

		( ]%%) { { dup type /stringtype ne
			{105 string  cvs } if
		print } exec

		(\n) print } exec

		flush } if 				% if newerror
end } def						% pop error

/handleerror load
%-----------------------------	Pop errordict off dictstack

end		% return dictstack to default programming model (sys & user dict).

/handleerror exch def			% define a systemdict accessible handleerror copy

/$error 10 dict def				% errordict contains another called $error

%------------------------------ Fill $error with error state variables
$error begin
/newerror false def				% which contains vars describing state 
/errorname /blablabs def
/command /showpage load def
/ostack 500 array def
/estack 250 array def
/dstack 20 array def

/ostackarray null def
/initializing true def
end								% go back to errordict itself.
