180 lines · 4.7 KB · Text
RawDownload
%    Copyright (C) 1994, 1996, 1999 Aladdin Enterprises.  All rights reserved.% % This software is provided AS-IS with no warranty, either express or% implied.% % This software is distributed under license and may not be copied,% modified or distributed except as expressly authorized under the terms% of the license contained in the file LICENSE in this distribution.% % For more information about licensing, please refer to% http://www.ghostscript.com/licensing/. For information on% commercial licensing, go to http://www.artifex.com/licensing/ or% contact Artifex Software, Inc., 101 Lucas Valley Road #110,% San Rafael, CA  94903, U.S.A., +1(415)492-9861. % $Id: gs_cmdl.ps,v 1.4 2002/02/21 21:49:28 giles Exp $% Parse and execute the command line.% C code handles the following switches: -h/-? -I -M -v /cmddict 50 dict defcmddict begin % ---------------- Utility procedures ---------------- % % Get the next argument from the parsed argument list./nextarg		% - nextarg <arg> true			% - nextarg false { argv length 0 eq    { false }    { argv dup 0 get exch dup length 1 sub 1 exch getinterval /argv exch def }   ifelse } bind def % Run a file, under job control if implemented./runjob			% <file> runjob - { end		% cmddict   /startjob where { pop false () startjob pop }   run   //cmddict begin } bind def/runfilejob		% <filename> runfilejob - { findlibfile { exch pop } { (r) file } runjob } bind def % Expand arguments.  Free variables: expand@./expandarg		% <string> expandarg <args...> { dup () eq    { pop    }    { dup dup (--) eq exch (-+) eq or       { pop /expand@ false def       }       { expand@ { (@) anchorsearch } { false } ifelse	  { pop findlibfile	     { exch pop }	     { (r) file }		% let the error happen	    expandargfile	  }	 if       }      ifelse    } } bind def/expandargfile		% <file> expandargfile <args...> { [ exch cvlit    { token not { exit } if      dup type /stringtype ne { =string cvs dup length string copy } if      expandarg    }   /exec cvx   ] cvx loop } bind def % ---------------- Recognized switches ---------------- % % Switches with arguments are defined as <x>;% switches without arguments are defined as -<x>. % Switches without arguments/-- { nextarg not    { (-- and -+ require a file name.) = flush }    { //systemdict /ARGUMENTS argv put /argv [] def runjob }   ifelse } bind def/-+ /-- load def/-@ /-- load def/-A { (@) Z } bind def/-c {  { argv length 0 eq { exit } if      argv 0 get (-) anchorsearch { pop pop exit } if      pop nextarg token       { exch pop			% Probably should check for empty.	 end exec //cmddict begin       }      if    }   loop } bind def/-e { (#) Z } bind def/-E /-e load def/-f { } def/-q { //systemdict /QUIET true put } bind def % Switches with arguments/d { (=) search not { (#) search not { () exch dup } if } if   exch pop cvn dup where    { pop (Redefining ) print print ( is not allowed.) = flush pop }    { exch token       { exch pop }		% Probably should check for empty.       { true }      ifelse      //systemdict 3 1 roll put    }   ifelse } bind def/D /d load def/f { dup length 0 ne { runfilejob } if } bind def/g { (x) search { cvi pop exch cvi } { cvi dup } ifelse   //systemdict begin /DEVICEHEIGHT exch def /DEVICEWIDTH exch def end } bind def/r { (x) search { cvr pop exch cvr } { cvr dup } ifelse   //systemdict begin /DEVICEYRESOLUTION exch def /DEVICEXRESOLUTION exch def end } bind def/s { (=) search not { (#) search not { () exch dup } if } if   exch pop cvn dup where { pop dup load } { () } ifelse   type /stringtype ne    { (Redefining ) print print ( is not allowed.) = flush pop }    { exch //systemdict 3 1 roll put }   ifelse } bind def/S /s load def/Z { true .setdebug } bind def % ---------------- Main program ---------------- % % We process the command line in two passes.  In the first pass,% we read and expand any @-files as necessary.  The second pass% does the real work. /cmdstart { //cmddict begin   /expand@ true def   [		% Process the GS_OPTIONS environment variable.   (GS_OPTIONS) getenv { 0 () /SubFileDecode filter expandargfile } if		% Process the actual command line.   .getargv { expandarg } forall   ] readonly /argv exch def		% Now interpret the commands.    { nextarg not { exit } if      dup 0 get (-) 0 get eq       { dup length 1 eq	  { pop (%stdin) (r) file runjob	  }	  { dup length 2 gt	     { dup dup length 2 sub 2 exch getinterval exch 1 1 getinterval }	    if currentdict .knownget	     { exec	     }	     { (Ignoring unknown switch ) print	       dup length 1 eq { (-) print print } if print	       () = flush	     }	    ifelse	  }	 ifelse       }       { runfilejob       }      ifelse    }   loop end } bind def end		% cmddict