diff options
Diffstat (limited to 'Master/xemtex/gslib/gs_dscp.ps')
-rw-r--r-- | Master/xemtex/gslib/gs_dscp.ps | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/Master/xemtex/gslib/gs_dscp.ps b/Master/xemtex/gslib/gs_dscp.ps new file mode 100644 index 00000000000..355e9d9e0f5 --- /dev/null +++ b/Master/xemtex/gslib/gs_dscp.ps @@ -0,0 +1,119 @@ +% Copyright (C) 2000 Artifex Software Inc. 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: gs_dscp.ps,v 1.4.2.1.2.1 2003/04/12 14:02:38 giles Exp $ +% Postscript interface routines to DSC parser + +/send_orientation { % <orientation> send_orientation - + % .parse_dsc_comments returns -1 for an Orientation key with an + % unrecognized value. + dup 0 ge { + << /Orientation 2 index >> setpagedevice + } if pop +} bind def + +% This dictionary contains local handlers for DSC comments. +% See header in zdscpars.c for more information. +% <dsc_dict> handler <dsc_dict> +/DSCparseprocs mark + /Orientation { dup /Orientation get send_orientation } bind + /PageOrientation { dup /PageOrientation .knownget { send_orientation } + { dup /Orientation .knownget { send_orientation } if } + ifelse } bind + /Page { dup /Orientation .knownget { send_orientation } if } bind + /NOP { } bind +.dicttomark readonly def + +% This procedure is called whenever a DSC comment is found by the interpreter +/do_parse_dsc false def +/parse_dsc { % <file> <DSC string> [<prev proc>] + % parse_dsc - + % Run any previously installed parser. + 0 get dup null eq { pop } { 3 copy exec pop } ifelse + + do_parse_dsc { % Check if this parser is enabled + currentglobal true setglobal % Go to global VM, save old state + 3 1 roll % Put old VM state under <file> <string> + dsc_dict exch % <VM state> <file> <dict> <string> + .parse_dsc_comments % <VM state> <file> <dict> <DSC name> + 4 -1 roll % Get old VM state from under <file> <dict> <DSC name> + setglobal % restore previous VM state + //DSCparseprocs exch .knownget { % Check DSC name against local handler list + exec % execute any local handler + } if + } if + pop pop % remove file, dict +} bind def + + +% Check whether the currently installed parser is the one defined in this file. +/.using_parse_dsc { % - .using_parse_dsc <proc> <using?> + currentuserparams /ProcessDSCComment get + dup null eq { pop {{//null} //parse_dsc exec} } if + dup length 3 eq { + dup dup length 1 sub get /parse_dsc load eq + } { + false + } ifelse +} bind def + +% Establish a binding for dsc_dict. +userdict /dsc_dict null put + +% - dsc_init - +/dsc_init { % Initialize DSC parser + currentglobal true setglobal + /dsc_dict 50 dict store % Size must be large enough for all DSC values + dsc_dict .initialize_dsc_parser + .using_parse_dsc { + % Already using this parser. + pop + } { + % Encapsulate the previous parser. We know it is in global VM: + % allocate the new one in global VM as well. + 1 array astore + /parse_dsc load /exec load 3 array astore cvx readonly + << /ProcessDSCComment 3 -1 roll >> + setuserparams + } ifelse + setglobal + /do_parse_dsc true def +} bind def + + +% Enable the DSC parser defined in this file. +% - enable_dsc - +/enable_dsc { + dsc_init +} bind def + +% Disable the DSC parser defined in this file. +% - disable_dsc - +/disable_dsc { + % There might be another parser installed: if so, restore it. + % (If it has encapsulated our parser, we can't.) + .using_parse_dsc { + % Restore the parser we encapsulated. + 0 get 0 get + currentglobal true setglobal exch + << /ProcessDSCComment 3 -1 roll >> + exch setglobal setuserparams + } { + pop + } ifelse + % If we couldn't restore the old parser, at least disable ours. + /do_parse_dsc false def +} bind def |